import React, { useState, useEffect } from 'react'; import { StyleSheet, View, SafeAreaView, StatusBar } from 'react-native'; import { GestureHandlerRootView } from 'react-native-gesture-handler'; import CameraScreen from './src/screens/CameraScreen'; import PreviewScreen from './src/screens/PreviewScreen'; import AdminScreen from './src/screens/AdminScreen'; import { loadSettings, saveSettings, AppSettings } from './src/services/settings'; import { logger } from './src/services/logger'; // Set up global error handler const defaultErrorHandler = (global as any).ErrorUtils.getGlobalHandler(); (global as any).ErrorUtils.setGlobalHandler((error: any, isFatal: boolean) => { logger.error(`Unhandled Exception (Fatal: ${isFatal})`, error) .catch(console.error) .finally(() => { // Delay termination until log is written defaultErrorHandler(error, isFatal); }); }); import KioskMode from './modules/kiosk-mode'; type ScreenState = 'home' | 'camera' | 'preview' | 'admin'; export default function App() { const [currentScreen, setCurrentScreen] = useState('home'); const [photoUris, setPhotoUris] = useState([]); const [settings, setSettings] = useState(null); // 1. Load configuration settings on app start useEffect(() => { async function initApp() { const savedSettings = await loadSettings(); setSettings(savedSettings); // Auto-start Kiosk mode if it was configured as enabled if (savedSettings.kioskModeEnabled) { try { KioskMode.startKiosk(); } catch (e) { console.warn('Failed to auto-start Kiosk mode:', e); } } } initApp(); }, []); if (!settings) { return ; } // 2. Navigation Actions const handleStartBooth = () => { setPhotoUris([]); setCurrentScreen('camera'); }; const handlePhotoCaptured = async (uri: string) => { await logger.log(`Photo captured via CameraScreen: ${uri}`); try { setPhotoUris((prev) => [...prev, uri]); setCurrentScreen('preview'); await logger.log('State updated to preview screen successfully.'); } catch (e) { await logger.error('Error transitioning to preview screen:', e); } }; // Called by CameraScreen when burst mode completes all photos const handleBurstComplete = (uris: string[]) => { setPhotoUris((prev) => [...prev, ...uris]); setCurrentScreen('preview'); }; const handleRetakeLast = () => { // Remove last captured photo const updatedUris = [...photoUris]; updatedUris.pop(); setPhotoUris(updatedUris); // Always let user retake setCurrentScreen('camera'); }; const handleAddAnother = () => { setCurrentScreen('camera'); }; const handleReset = () => { setPhotoUris([]); setCurrentScreen('home'); // Go to home when cancelled }; const handleSaveSettings = (updated: AppSettings) => { setSettings(updated); }; const handleOpenAdmin = () => { setCurrentScreen('admin'); }; // 3. Conditional Screen Rendering return ( ); } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#050510', }, loadingContainer: { flex: 1, backgroundColor: '#050510', justifyContent: 'center', alignItems: 'center', }, });