import React, { useState, useEffect } from 'react'; import { View, Text, ScrollView, TouchableOpacity, Alert, Switch, Linking } from 'react-native'; import { Stack, router } from 'expo-router'; import { SafeAreaView } from 'react-native-safe-area-context'; import { Ionicons } from '@expo/vector-icons'; import { useTheme } from '../hooks/useTheme'; import { DataClearingService } from '../services/DataClearingService'; import { UserPreferencesService } from '../services/UserPreferencesService'; import LoadingOverlay from '../components/ui/LoadingOverlay'; export default function Settings() { const { theme, updateTheme } = useTheme(); const [isClearing, setIsClearing] = useState(false); const [locationEnabled, setLocationEnabled] = useState(true); const [isLoadingPrefs, setIsLoadingPrefs] = useState(true); const themeOptions = [ { value: 'light', label: 'Light', icon: '☀️' }, { value: 'dark', label: 'Dark', icon: '🌙' }, { value: 'system', label: 'System', icon: '📱' }, ]; useEffect(() => { loadPreferences(); }, []); const loadPreferences = async () => { try { const prefsService = UserPreferencesService.getInstance(); const prefs = await prefsService.getPreferences(); setLocationEnabled(prefs.locationEnabled); } catch (error) { console.error('Failed to load preferences:', error); } finally { setIsLoadingPrefs(false); } }; const handleThemeSelect = (selectedTheme: 'light' | 'dark' | 'system') => { updateTheme(selectedTheme); }; const handleLocationToggle = async (value: boolean) => { setLocationEnabled(value); try { const prefsService = UserPreferencesService.getInstance(); await prefsService.setLocationEnabled(value); } catch (error) { console.error('Failed to update location preference:', error); // Revert on error setLocationEnabled(!value); Alert.alert('Fehler', 'Einstellung konnte nicht gespeichert werden.'); } }; const openAppSettings = () => { Linking.openSettings(); }; const handleDeleteAllData = () => { Alert.alert( 'Alle Daten löschen', 'Diese Aktion kann NICHT rückgängig gemacht werden. Alle Mahlzeiten, Fotos und persönlichen Daten werden dauerhaft gelöscht.\n\nMöchten Sie wirklich fortfahren?', [ { text: 'Abbrechen', style: 'cancel', }, { text: 'Alles löschen', style: 'destructive', onPress: confirmDeleteAllData, }, ] ); }; const confirmDeleteAllData = async () => { setIsClearing(true); try { const dataClearingService = DataClearingService.getInstance(); const result = await dataClearingService.clearAllData(); if (result.success) { Alert.alert('Erfolgreich', 'Alle Daten wurden gelöscht.', [ { text: 'OK', onPress: () => router.replace('/(tabs)'), }, ]); } else { Alert.alert( 'Teilweise erfolgreich', `Einige Daten konnten nicht gelöscht werden:\n\n${result.errors.join('\n')}`, [{ text: 'OK' }] ); } } catch (error) { Alert.alert('Fehler', `Beim Löschen der Daten ist ein Fehler aufgetreten: ${error}`, [ { text: 'OK' }, ]); } finally { setIsClearing(false); } }; return ( <> ( router.back()} className="p-2"> ), }} /> {/* App Info Section */} App Info App Name NutriPhi Version 1.0.0 Build 1 Track your nutrition with AI-powered meal analysis {/* Theme Section */} Appearance Theme {themeOptions.map((option) => ( handleThemeSelect(option.value as 'light' | 'dark' | 'system')} className={`flex-row items-center justify-between rounded-lg border p-3 ${ theme === option.value ? 'border-indigo-500 bg-indigo-50 dark:border-indigo-400 dark:bg-indigo-900/30' : 'border-gray-200 bg-gray-50 dark:border-gray-600 dark:bg-gray-700' }`} > {option.icon} {option.label} {theme === option.value && ( )} ))} {/* Privacy & Location Section */} Privatsphäre & Standort {/* Location Toggle */} Standort speichern Speichert den Ort deiner Mahlzeiten für personalisierte Einblicke {/* App Settings Link */} App-Berechtigungen Verwalte Kamera- und Standortberechtigungen {/* Data Management Section */} Datenverwaltung Alle Daten löschen Löscht alle Mahlzeiten, Fotos und Einstellungen {isClearing ? ( ) : ( 🗑️ )} ⚠️ Diese Aktion kann nicht rückgängig gemacht werden {/* Footer */} Made with ❤️ for better nutrition tracking ); }