import React, { useEffect, useState } from 'react'; import { StatusBar, useColorScheme, View, StyleSheet, Text, TouchableOpacity, Alert, NativeModules, Image, ScrollView, } from 'react-native'; import { SafeAreaProvider } from 'react-native-safe-area-context'; 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'; type Screen = 'login' | 'register' | 'home' | 'scanner'; // ✅ Correct native module const { ICameraSDK } = NativeModules; function App(): JSX.Element { 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('ICameraSDK:', ICameraSDK); ICameraSDK?.greet?.('John') .then((msg: string) => console.log(msg)) .catch(console.error); const unsubscribe = networkService.addListener(networkState => { setIsOnline(networkState.isConnected); }); return unsubscribe; }, []); const initializeApp = async () => { try { await authAPI.initialize(); const loggedIn = await authAPI.isLoggedIn(); if (loggedIn) { const user = await authAPI.getCurrentUser(); setCurrentUser(user); setCurrentScreen('home'); } } catch (e) { console.error(e); } 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'); }; /* -------------------- ACTIONS -------------------- */ const handleLogout = async () => { try { await authAPI.logout(); navigateToLogin(); Alert.alert('Success', 'Logged out successfully'); } catch { Alert.alert('Error', 'Failed to logout'); } }; const generateQRCode = async () => { if (!currentUser?.email || !ICameraSDK) { Alert.alert('Error', 'Native QR module not available'); return; } setIsGeneratingQR(true); try { const qrData = `User: ${currentUser.fullName}\nEmail: ${currentUser.email}`; const base64 = await ICameraSDK.generateQRCode(qrData, 300, 300); setQrCode(base64); } catch (e) { console.error(e); Alert.alert('Error', 'QR generation failed'); } finally { setIsGeneratingQR(false); } }; const handleScanResult = (result: any) => { setScannedCodes(prev => [ { code: result.code, format: result.format, timestamp: new Date().toLocaleTimeString(), }, ...prev, ]); Alert.alert( 'Scanned', `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 {isGeneratingQR ? 'Generating...' : 'Generate QR'} Logout ); } }; if (!isInitialized) { return ( Initializing... ); } return ( {renderScreen()} ); } export default App; /* -------------------- STYLES -------------------- */ const styles = StyleSheet.create({ loading: { flex: 1, justifyContent: 'center', alignItems: 'center' }, homeContainer: { flex: 1 }, scrollContent: { alignItems: 'center', padding: 20 }, welcomeText: { fontSize: 24, fontWeight: '700', marginBottom: 20 }, qrImage: { width: 300, height: 300, marginBottom: 20 }, button: { backgroundColor: '#6366f1', padding: 14, borderRadius: 18, marginBottom: 12, minWidth: 220, alignItems: 'center', }, qrButton: { backgroundColor: '#10b981' }, logoutButton: { backgroundColor: '#ef4444' }, buttonText: { color: '#fff', fontWeight: '600' }, });