import { Pressable, ScrollView, StyleSheet, View } from 'react-native'; import Ionicons from '@expo/vector-icons/Ionicons'; import { useFocusEffect } from 'expo-router'; import { navigate } from 'expo-router/build/global-state/routing'; import React, { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { PermissionsAndroid, Platform } from 'react-native'; import { TaskItem } from '../../components/taskItem'; import { ThemedText } from '../../components/ThemedText'; import { ThemedView } from '../../components/ThemedView'; import { Category, CategoryQuery } from '../../models/category'; import { Task, TaskQuery } from '../../models/task'; import { CategoryRepository } from '../../repositories/CategoryRepository'; import { TaskRepository } from '../../repositories/TaskRepository'; import { SQLiteDataService } from '../../services/data/sqliteDataService'; export const checkApplicationPermission = async () => { if (Platform.OS === 'android') { try { await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.POST_NOTIFICATIONS, ); } catch (error) { } } } const categoryRepository = new CategoryRepository(new SQLiteDataService(CategoryQuery)); const taskRepository = new TaskRepository(new SQLiteDataService(TaskQuery)); export default function HomeScreen() { const [tasks, setTasks] = useState([]); const [categories, setCategories] = useState([]); const [ready, setReady] = useState(false); const { t } = useTranslation(); useEffect(() => { // Initial data fetch (async () => { console.log(t('fetching_categories')); try { const fetchedCategories = await categoryRepository.findAll(); if (fetchedCategories.length === 0) { // If no categories, create a default one const defaultCategory = new Category(t('default_category_name'), t('default_category_icon')); const createdCat = await categoryRepository.create(defaultCategory); setCategories([createdCat]); } else { setCategories(fetchedCategories); } } catch (error) { console.error(t('error_fetching_categories'), error); } try { console.log(t('fetching_tasks')); RefreshTasks(); } catch (error) { console.error(t('error_fetching_tasks'), error); } setReady(true); })(); }, []); useEffect(() => { // NOTIFICATION HANDLER if (Platform.OS !== 'web') { if (Platform.OS === 'android') { checkApplicationPermission(); } } }, []); const RefreshTasks = async () => { try { const fetchedTasks = await taskRepository.findAll(); fetchedTasks.sort((a, b) => { return (a.daysToRedo! * 24 * 3600 * 1000 - (Date.now() - a.lastDone!)) - ((b.daysToRedo! * 24 * 3600 * 1000) - (Date.now() - b.lastDone!)); }); console.log(t('tasks_fetched'), fetchedTasks); setTasks(fetchedTasks); } catch (error) { console.error(t('error_refreshing_tasks'), error); } }; const RefreshCategories = async () => { try { const fetchedCategories = await categoryRepository.findAll(); setCategories(fetchedCategories); } catch (error) { console.error(t('error_refreshing_categories'), error); } }; useEffect(() => { if (ready) { (async () => { await RefreshTasks(); await RefreshCategories(); })(); } }, [ready]); // On layout focus to refresh tasks useFocusEffect(React.useCallback(() => { console.log(t('focus_event')); (async () => { await RefreshTasks(); await RefreshCategories(); })(); }, [])); return ( {t('app_name')} { navigate('./taskForm', {}); }}> {t('your_tasks')} {tasks.map((task, index) => ( { RefreshTasks(); }} /> ))} {tasks.length === 0 && (<> {t('no_tasks_available')} {t('add_task_to_get_started')} )} ); } const styles = StyleSheet.create({ mainContainer: { flex: 1, }, headerContainer: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', gap: 8, paddingHorizontal: 24, paddingTop: 50, paddingBottom: 18, backgroundColor: '#6a254fff', }, scrollView: { paddingHorizontal: 24, flex: 1, }, stepContainer: { gap: 8, marginBottom: 8, }, reactLogo: { height: 178, width: 290, bottom: 0, left: 0, position: 'absolute', }, addButton: { backgroundColor: '#b91f7eff', height: 50, color: '#fff', borderRadius: 8, padding: 10, lineHeight: 30, alignItems: 'center', justifyContent: 'center', } });