import React, { useState } from 'react'; import { View, Text, StyleSheet, TouchableOpacity } from 'react-native'; import { CameraView, useCameraPermissions } from 'expo-camera'; import { Ionicons } from '@expo/vector-icons'; import { colors, spacing, borderRadius } from '../constants/theme'; interface BarcodeScannerProps { onBarcodeScanned: (barcode: string) => void; onClose: () => void; } export function BarcodeScanner({ onBarcodeScanned, onClose }: BarcodeScannerProps) { const [permission, requestPermission] = useCameraPermissions(); const [scanned, setScanned] = useState(false); if (!permission) { return ; } if (!permission.granted) { return ( Permiso de cámara requerido Necesitamos acceso a la cámara para escanear códigos de barras Conceder permiso Cancelar ); } const handleBarCodeScanned = ({ type, data }: { type: string; data: string }) => { if (scanned) return; setScanned(true); onBarcodeScanned(data); }; return ( Apunta la cámara al código de barras del medicamento {scanned && ( setScanned(false)} > Escanear de nuevo )} ); } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: '#000', }, permissionContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', backgroundColor: colors.background, padding: spacing.xl, }, permissionTitle: { fontSize: 20, fontWeight: 'bold', color: colors.text, marginTop: spacing.lg, }, permissionText: { fontSize: 16, color: colors.textSecondary, textAlign: 'center', marginTop: spacing.sm, marginBottom: spacing.xl, }, permissionButton: { backgroundColor: colors.primary, borderRadius: borderRadius.md, paddingVertical: spacing.md, paddingHorizontal: spacing.xl, }, permissionButtonText: { color: colors.textInverse, fontSize: 16, fontWeight: '600', }, cancelButton: { marginTop: spacing.md, }, cancelButtonText: { color: colors.textSecondary, fontSize: 14, }, overlay: { flex: 1, backgroundColor: 'transparent', justifyContent: 'center', alignItems: 'center', }, scannerFrame: { width: 250, height: 250, borderWidth: 2, borderColor: 'transparent', position: 'relative', }, corner: { position: 'absolute', width: 30, height: 30, borderColor: colors.primary, }, topLeft: { top: 0, left: 0, borderTopWidth: 3, borderLeftWidth: 3, }, topRight: { top: 0, right: 0, borderTopWidth: 3, borderRightWidth: 3, }, bottomLeft: { bottom: 0, left: 0, borderBottomWidth: 3, borderLeftWidth: 3, }, bottomRight: { bottom: 0, right: 0, borderBottomWidth: 3, borderRightWidth: 3, }, instruction: { color: colors.textInverse, fontSize: 14, textAlign: 'center', marginTop: spacing.xl, backgroundColor: 'rgba(0,0,0,0.6)', paddingHorizontal: spacing.md, paddingVertical: spacing.sm, borderRadius: borderRadius.sm, }, closeButton: { position: 'absolute', top: spacing.xl, right: spacing.xl, backgroundColor: 'rgba(0,0,0,0.6)', borderRadius: 20, padding: spacing.sm, }, scannedOverlay: { position: 'absolute', bottom: spacing.xxl, left: spacing.xl, right: spacing.xl, }, scanAgainButton: { backgroundColor: colors.primary, borderRadius: borderRadius.md, padding: spacing.md, alignItems: 'center', }, scanAgainText: { color: colors.textInverse, fontSize: 16, fontWeight: '600', }, });