diff --git a/app/HomeScreen.tsx b/app/HomeScreen.tsx index 3fe4f7c..47a4eba 100644 --- a/app/HomeScreen.tsx +++ b/app/HomeScreen.tsx @@ -1,36 +1,32 @@ import { Image } from 'expo-image'; -import { Platform, StyleSheet, useColorScheme, View } from 'react-native'; +import { Platform, RefreshControl, ScrollView, StyleSheet, useColorScheme, View, ViewToken } from 'react-native'; import { HelloWave } from '@/components/HelloWave'; import ParallaxScrollView from '@/components/ParallaxScrollView'; import { ThemedText } from '@/components/ThemedText'; import { ThemedView } from '@/components/ThemedView'; -import { FAB, IconButton, List, Text, useTheme } from 'react-native-paper'; -import { useEffect, useState } from 'react'; +import { Card, FAB, IconButton, List, Surface, Text, useTheme } from 'react-native-paper'; +import { useCallback, useEffect, useState } from 'react'; import AsyncStorage from '@react-native-async-storage/async-storage'; import { DATA_DIRECTORY_URI_KEY } from '@/constants/Settings'; import { useNavigation } from 'expo-router'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import { useFileSystem, prettyName } from '@/hooks/useFilesystem'; +import { format } from 'date-fns'; +import { StorageAccessFramework } from 'expo-file-system'; +import { FlatList } from 'react-native-gesture-handler'; export default function HomeScreen() { - const [dataDirectoryUri, setDirectoryUri] = useState(null); const navigation = useNavigation(); - useEffect(() => { - const loadDirectoryUri = async () => { - try { - const savedUri = await AsyncStorage.getItem(DATA_DIRECTORY_URI_KEY); - if (savedUri) { - setDirectoryUri(savedUri); - } - } catch (error) { - console.error('Error loading directory URI:', error); - } - }; - - loadDirectoryUri(); - }, []); - const theme = useTheme(); + const { dataDirectoryUri, loadFiles, files, directorySize } = useFileSystem(); + const [refreshing, setRefreshing] = useState(false); + const onRefresh = async () => { + setRefreshing(true); + await loadFiles(); + setRefreshing(false); + }; const styles = StyleSheet.create({ fab: { @@ -40,36 +36,111 @@ export default function HomeScreen() { bottom: 0, backgroundColor: theme.colors.primary, // Use your theme's primary color }, - stepContainer: { - gap: 8, - marginBottom: 8, - }, - headerImage: { - width: 200, - height: 200, - bottom: 0, - left: 20, + container: { + backgroundColor: theme.colors.primary, position: 'absolute', + top: 0, + left: 0, + right: 0, + height: 100, + zIndex: 1000, + }, + safeArea: { + flex: 1, + marginTop: 100, + backgroundColor: theme.colors.surface, + // padding: 10 + }, + entryCard: { + backgroundColor: theme.colors.surface, + height: 150 + , + alignItems: 'center', }, }); + const [loadedContents, setLoadedContents] = useState>(new Map()); + const loadFileContent = async (fileUri: string) => { + if (loadedContents.has(fileUri)) return; // Already loaded + + try { + // Replace with your actual file reading logic + const content = await StorageAccessFramework.readAsStringAsync(fileUri); + setLoadedContents(prev => new Map(prev).set(fileUri, content)); + } catch (error) { + console.error('Error loading file content:', error); + } + }; + + const onViewableItemsChanged = useCallback(({ viewableItems }: { viewableItems: ViewToken[] }) => { + viewableItems.forEach(({ item }) => { + loadFileContent(item.uri); + }); + }, []); + + const viewabilityConfig = { + itemVisiblePercentThreshold: 50, // Load when 50% visible + }; + + const renderFileItem = ({ item: f }: { item: typeof files[0] }) => ( + + + + {format(f.datetime, "hh:mm aaa")} + + {loadedContents.has(f.uri) && ( + + {loadedContents.get(f.uri)} + + )} + + + ); return ( - - - Directory: {dataDirectoryUri} - { - console.log('New entry pressed'); - navigation.navigate('NewEntry' as never); - }} /> + + + + item.uri} + onViewableItemsChanged={onViewableItemsChanged} + viewabilityConfig={viewabilityConfig} + refreshControl={ + + } + ListHeaderComponent={ + + + + {prettyName(dataDirectoryUri, { pathContext: 'full' })}: + + {' '}{files.length} {files.length == 1 ? "entry" : "entries"}, {directorySize} bytes + + + } + /> + { + navigation.navigate('NewEntry' as never); + }} /> + ); } diff --git a/app/SettingsScreen.tsx b/app/SettingsScreen.tsx index f004a88..1215dbb 100644 --- a/app/SettingsScreen.tsx +++ b/app/SettingsScreen.tsx @@ -6,67 +6,25 @@ import { Directory, Paths } from 'expo-file-system/next'; import { StorageAccessFramework } from 'expo-file-system'; import AsyncStorage from '@react-native-async-storage/async-storage'; import { DATA_DIRECTORY_URI_KEY } from '@/constants/Settings'; +import { useFileSystem, prettyName } from '@/hooks/useFilesystem'; -const prettyName = (uri: string | null) => { - if (!uri) return null; - const decodedUri = decodeURIComponent(uri); - const match = decodedUri.match(/.*\/primary:(.+)/); - - if (match) { - return match[1]; - } - - // Fallback to your original logic - return uri.split('%3A').pop() || "Unknown"; - -} - export default function SettingsScreen() { - const [directoryUri, setDirectoryUri] = useState(null); - // Load saved directory URI on component mount - useEffect(() => { - const loadDirectoryUri = async () => { - try { - const savedUri = await AsyncStorage.getItem(DATA_DIRECTORY_URI_KEY); - if (savedUri) { - setDirectoryUri(savedUri); - } - } catch (error) { - console.error('Error loading directory URI:', error); - } - }; - - loadDirectoryUri(); - }, []); - - // Save directory URI whenever it changes - const saveDirectoryUri = async (uri: string | null) => { - try { - if (uri) { - await AsyncStorage.setItem(DATA_DIRECTORY_URI_KEY, uri); - } else { - await AsyncStorage.removeItem(DATA_DIRECTORY_URI_KEY); - } - setDirectoryUri(uri); - } catch (error) { - console.error('Error saving directory URI:', error); - } - }; + const { dataDirectoryUri, isLoading, files, hasDirectory, saveDataDirectoryUri } = useFileSystem(); return ( } - title={prettyName(directoryUri) ?? "No directory selected. Tap to select."} + title={prettyName(dataDirectoryUri) ?? "No directory selected. Tap to select."} right={props => } onPress={async () => { try { const permissions = await StorageAccessFramework.requestDirectoryPermissionsAsync(); if (permissions.granted) { - await saveDirectoryUri(permissions.directoryUri); + await saveDataDirectoryUri(permissions.directoryUri); } } catch (err) { console.error(err); @@ -75,12 +33,12 @@ export default function SettingsScreen() { />