import { StatusBar, useColorScheme, View, StyleSheet, Text, TouchableOpacity, Alert, NativeModules, Image, ScrollView, } from 'react-native'; import { SafeAreaProvider } from 'react-native-safe-area-context'; import { useState, useEffect } from 'react'; import Login from './src/components/Login'; import Register from './src/components/Register'; import { authAPI } from './src/services/authAPI'; import { networkService } from './src/services/networkService'; import { ScannerScreen } from './src/screens/ScannerScreen'; import Map from './src/screens/Map'; type Screen = 'login' | 'register' | 'home' | 'scanner' | 'map'; const { MyNativeModule } = NativeModules; function App() { const isDarkMode = useColorScheme() === 'dark'; const [currentScreen, setCurrentScreen] = useState('login'); const [isInitialized, setIsInitialized] = useState(false); const [isOnline, setIsOnline] = useState(true); const [currentUser, setCurrentUser] = useState(null); const [qrCode, setQrCode] = useState(null); const [isGeneratingQR, setIsGeneratingQR] = useState(false); const [scannedCodes, setScannedCodes] = useState([]); /* -------------------- INIT -------------------- */ useEffect(() => { initializeApp(); console.log('MyNativeModule:', MyNativeModule); MyNativeModule?.greet?.('John').then((msg: any) => { console.log(msg); }); const unsubscribe = networkService.addListener(networkState => { setIsOnline(networkState.isConnected); }); return unsubscribe; }, []); const initializeApp = async () => { try { await authAPI.initialize(); const isLoggedIn = await authAPI.isLoggedIn(); if (isLoggedIn) { const user = await authAPI.getCurrentUser(); setCurrentUser(user); setCurrentScreen('home'); } } catch (error) { console.error('Initialization error:', error); } finally { setIsInitialized(true); } }; /* -------------------- NAVIGATION -------------------- */ const navigateToLogin = () => { setCurrentUser(null); setQrCode(null); setCurrentScreen('login'); }; const navigateToRegister = () => { setCurrentScreen('register'); }; const navigateToHome = async () => { const user = await authAPI.getCurrentUser(); setCurrentUser(user); setQrCode(null); setCurrentScreen('home'); }; const openScanner = () => { setCurrentScreen('scanner'); }; const openMap = () => { setCurrentScreen('map'); }; /* -------------------- ACTIONS -------------------- */ const handleLogout = async () => { try { await authAPI.logout(); setQrCode(null); navigateToLogin(); Alert.alert('Success', 'Logged out successfully'); } catch { Alert.alert('Error', 'Failed to logout'); } }; const showAppStatus = async () => { try { const status = await authAPI.getAppStatus(); Alert.alert( 'App Status', `Network: ${status.network.isOnline ? 'Online' : 'Offline'} Users: ${status.storage.totalUsers} Current User: ${status.authentication.currentUser || 'None'} Logged In: ${status.authentication.isLoggedIn ? 'Yes' : 'No'}` ); } catch { Alert.alert('Error', 'Failed to get app status'); } }; const generateQRCode = async () => { if (!currentUser?.email) { Alert.alert('Error', 'No user email available'); return; } setIsGeneratingQR(true); try { const qrData = `User: ${currentUser.fullName}\nEmail: ${currentUser.email}`; const base64Image = await MyNativeModule.generateQRCode(qrData, 300, 300); setQrCode(base64Image); } catch (error) { console.error(error); Alert.alert('Error', 'Failed to generate QR code'); } finally { setIsGeneratingQR(false); } }; const handleScanResult = (result: any) => { setScannedCodes(prev => [ { code: result.code, format: result.format, timestamp: new Date().toLocaleTimeString(), }, ...prev, ]); Alert.alert( 'Scanned Successfully', `Code: ${result.code}\nFormat: ${result.format}`, [{ text: 'OK', onPress: () => setCurrentScreen('home') }] ); }; /* -------------------- RENDER -------------------- */ const renderScreen = () => { switch (currentScreen) { case 'login': return ( ); case 'register': return ( ); case 'scanner': return ( ); case 'home': return ( Welcome, {currentUser?.fullName || 'User' } { qrCode && ( ) } Scan QR / Barcode < TouchableOpacity style={styles.qrButton} onPress={generateQRCode} disabled={isGeneratingQR} > {isGeneratingQR ? 'Generating...' : 'Generate QR Code'} < TouchableOpacity style={styles.statusButton} onPress={showAppStatus} > App Status < TouchableOpacity style={styles.mapButton} onPress={openMap} > Open Map < TouchableOpacity style={styles.logoutButton} onPress={handleLogout} > Logout ); case 'map': return ( setCurrentScreen('home')} /> ); default: return null; } }; /* -------------------- LOADING -------------------- */ if (!isInitialized) { return ( Initializing... ); } return ( {renderScreen()} ); } const styles = StyleSheet.create({ loadingContainer: { flex: 1, justifyContent: 'center', alignItems: 'center' }, loadingText: { fontSize: 18, fontWeight: '600' }, homeContainer: { flex: 1 }, scrollContent: { alignItems: 'center', padding: 20 }, welcomeText: { fontSize: 24, fontWeight: '700', marginBottom: 20 }, qrImage: { width: 300, height: 300, marginBottom: 20 }, scannerButton: { backgroundColor: '#9333ea', padding: 14, borderRadius: 20, marginBottom: 10 }, qrButton: { backgroundColor: '#10b981', padding: 14, borderRadius: 20, marginBottom: 10 }, statusButton: { backgroundColor: '#3bb6d8', padding: 14, borderRadius: 20, marginBottom: 10 }, mapButton: { backgroundColor: '#2563eb', padding: 14, borderRadius: 20, marginBottom: 10 }, logoutButton: { backgroundColor: '#ff6b6b', padding: 14, borderRadius: 20 }, buttonText: { color: '#fff', fontWeight: '600' }, }); export default App;