diff --git a/App.tsx b/App.tsx index 4c3e780..7e26dca 100644 --- a/App.tsx +++ b/App.tsx @@ -16,8 +16,9 @@ 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'; +type Screen = 'login' | 'register' | 'home' | 'scanner'; const { MyNativeModule } = NativeModules; function App() { @@ -28,6 +29,7 @@ function App() { const [currentUser, setCurrentUser] = useState(null); const [qrCode, setQrCode] = useState(null); const [isGeneratingQR, setIsGeneratingQR] = useState(false); + const [scannedCodes, setScannedCodes] = useState([]); // Initialize app useEffect(() => { @@ -111,121 +113,183 @@ Logged In: ${status.authentication.isLoggedIn ? 'Yes' : 'No'} } }; - 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); - Alert.alert('Success', 'QR Code generated successfully!'); - } catch (error) { - console.error('QR Code generation error:', error); - Alert.alert('Error', 'Failed to generate QR code'); - } finally { - setIsGeneratingQR(false); - } - }; - - const renderScreen = () => { - switch (currentScreen) { - case 'login': - return ( - - ); - case 'register': - return ( - - ); - case 'home': - return ( - - - - {isOnline ? '🟢 Online' : '🔴 Offline'} - - - - - Welcome, {currentUser?.fullName || 'User'}! - - - - {currentUser?.email} - - - {qrCode && ( - - Your QR Code: - - - )} - - - - - {isGeneratingQR ? 'Generating...' : 'Generate QR Code'} - - - - - App Status - - - - Logout - - - - - {isOnline - ? 'Your data is synced with the cloud' - : 'Working offline - data saved locally'} - - - ); - default: - return null; - } - }; - - // Show loading screen while initializing - if (!isInitialized) { - return ( - - - - Initializing... - - + const handleScanResult = (result: any) => { + console.log('Scan result:', result); + setScannedCodes(prev => [ + { + code: result.code, + format: result.format, + timestamp: new Date().toLocaleTimeString(), + }, + ...prev, + ]); + Alert.alert( + '✓ Scanned Successfully', + `Code: ${result.code}\nFormat: ${result.format}`, + [ + { + text: 'Close', + onPress: () => setCurrentScreen('home'), + }, + ] ); + }; + + const openScanner = () => { + setCurrentScreen('scanner'); + } catch (error) { + 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); + Alert.alert('Success', 'QR Code generated successfully!'); + } catch (error) { + console.error('QR Code generation error:', error); + Alert.alert('Error', 'Failed to generate QR code'); + } finally { + setIsGeneratingQR(false); + } +}; + +const renderScreen = () => { + switch (currentScreen) { + case 'login': + return ( + + ); + case 'register': + return ( + + ); + case 'scanner': + return ( + + ); + case 'home': + return ( + + + + {isOnline ? '🟢 Online' : '🔴 Offline'} + + + + + Welcome, {currentUser?.fullName || 'User'}! + + + + {currentUser?.email} + + + {qrCode && ( + + Your QR Code: + + + )} + + + + + 📱 Scan QR/Barcode + + + + + + {isGeneratingQR ? 'Generating...' : 'Generate QR Code'} + + + + + App Status + + + + Logout + + + + {scannedCodes.length > 0 && ( + + + Scanned Codes ({scannedCodes.length}) + + {scannedCodes.slice(0, 5).map((item, index) => ( + + {item.code} + + {item.format} + {item.timestamp} + + + ))} + + )} + + + {isOnline + ? 'Your data is synced with the cloud' + : 'Working offline - data saved locally'} + + + ); + default: + return null; + } +}; + +// Show loading screen while initializing +if (!isInitialized) { return ( - {renderScreen()} + + Initializing... + ); } +return ( + + + {renderScreen()} + +); +} + const styles = StyleSheet.create({ loadingContainer: { flex: 1, @@ -310,6 +374,13 @@ const styles = StyleSheet.create({ marginBottom: 30, width: '100%', }, + scannerButton: { + backgroundColor: '#9333ea', + paddingHorizontal: 20, + paddingVertical: 14, + borderRadius: 25, + alignItems: 'center', + }, qrButton: { backgroundColor: '#10b981', paddingHorizontal: 20, @@ -336,6 +407,52 @@ const styles = StyleSheet.create({ fontWeight: '600', fontSize: 16, }, + scannedContainer: { + width: '100%', + marginBottom: 20, + backgroundColor: 'white', + borderRadius: 12, + padding: 16, + shadowColor: '#000', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.1, + shadowRadius: 4, + elevation: 3, + }, + scannedTitle: { + fontSize: 14, + fontWeight: '600', + color: '#333', + marginBottom: 12, + }, + scannedItem: { + backgroundColor: '#f5f5f5', + borderLeftWidth: 4, + borderLeftColor: '#9333ea', + paddingHorizontal: 12, + paddingVertical: 10, + marginBottom: 8, + borderRadius: 4, + }, + scannedCode: { + fontSize: 13, + fontWeight: '600', + color: '#000', + marginBottom: 4, + }, + scannedFooter: { + flexDirection: 'row', + justifyContent: 'space-between', + }, + scannedFormat: { + fontSize: 11, + color: '#666', + fontWeight: '500', + }, + scannedTime: { + fontSize: 11, + color: '#999', + }, infoText: { fontSize: 14, color: '#888', diff --git a/index.js b/index.js index 4b15402..f427a55 100644 --- a/index.js +++ b/index.js @@ -7,3 +7,16 @@ import App from './App'; import { name as appName } from './app.json'; LogBox.ignoreAllLogs(); AppRegistry.registerComponent(appName, () => App); + + +// 1. Hook (Easiest) ⭐ +// const scanner = useCameraScanner({ +// presignedUrl: 'https://...', +// onScanResult: (result) => console.log(result.code), +// }); + +// 2. Ready Screen +// + +// 3. Direct Module +// const { ICameraSDK } = NativeModules; \ No newline at end of file