Files
FarmaFinder/apps/frontend-mobile/app/scanner.tsx
T

79 lines
2.3 KiB
TypeScript

import React, { useState } from 'react';
import { View, StyleSheet } from 'react-native';
import { useRouter } from 'expo-router';
import { BarcodeScanner } from '../components/BarcodeScanner';
import { searchMedicines } from '../services/medicines';
import { hasConsent } from '../services/consent';
import HealthConsentModal from '../components/HealthConsentModal';
export default function ScannerScreen() {
const router = useRouter();
const [isSearching, setIsSearching] = useState(false);
const [showHealthConsent, setShowHealthConsent] = useState(false);
const [pendingBarcode, setPendingBarcode] = useState<string | null>(null);
const processBarcode = async (barcode: string) => {
setIsSearching(true);
try {
const results = await searchMedicines(barcode);
if (results.length > 0) {
router.push(`/medicine/${results[0].nregistro}`);
} else {
router.push(`/medicine/${barcode}`);
}
} catch (error) {
console.error('Error searching medicine:', error);
router.push(`/medicine/${barcode}`);
} finally {
setIsSearching(false);
}
};
const handleBarcodeScanned = async (barcode: string) => {
const healthConsent = await hasConsent('health_data');
if (!healthConsent) {
setPendingBarcode(barcode);
setShowHealthConsent(true);
return;
}
await processBarcode(barcode);
};
const handleClose = () => {
router.back();
};
return (
<View style={styles.container}>
<BarcodeScanner
onBarcodeScanned={handleBarcodeScanned}
onClose={handleClose}
/>
{showHealthConsent && (
<HealthConsentModal
onAccept={async () => {
setShowHealthConsent(false);
if (pendingBarcode) {
const { saveConsents, getLocalConsents } = await import('../services/consent');
const current = await getLocalConsents();
await saveConsents({ ...current, health_data: true });
await processBarcode(pendingBarcode);
setPendingBarcode(null);
}
}}
onCancel={() => {
setShowHealthConsent(false);
setPendingBarcode(null);
}}
/>
)}
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
},
});