import React, {useContext, useEffect, useState} from 'react'; import Icon from 'react-native-vector-icons/MaterialIcons'; import {Camera} from 'expo-camera'; import {BarCodeEvent, BarCodeScanner} from 'expo-barcode-scanner'; import {Linking, TouchableOpacity, View, Image, Pressable} from 'react-native'; import {Theme} from './ui/styleUtils'; import {Column, Button, Text, Centered, Row} from './ui'; import {GlobalContext} from '../shared/GlobalContext'; import {useSelector} from '@xstate/react'; import {selectIsActive} from '../machines/app'; import {useTranslation} from 'react-i18next'; import {useScanLayout} from '../screens/Scan/ScanLayoutController'; export const QrScanner: React.FC = props => { const {t} = useTranslation('QrScanner'); const {appService} = useContext(GlobalContext); const [hasPermission, setHasPermission] = useState(null); const [scanned, setScanned] = useState(false); const [cameraType, setCameraType] = useState(Camera.Constants.Type.back); const controller = useScanLayout(); const isActive = useSelector(appService, selectIsActive); const openSettings = () => { Linking.openSettings(); }; useEffect(() => { (async () => { const response = await Camera.requestCameraPermissionsAsync(); setHasPermission(response.granted); })(); }, []); useEffect(() => { if (isActive && hasPermission === false) { (async () => { const response = await Camera.requestCameraPermissionsAsync(); setHasPermission(response.granted); })(); } }, [isActive]); if (hasPermission === null) { return ; } const CameraDisabledPopUp: React.FC = () => { return ( {t('cameraAccessDisabled')} {t('cameraPermissionGuideLabel')} ); }; return ( {hasPermission == false && } {props.title && ( {props.title} )} { setCameraType( cameraType === Camera.Constants.Type.back ? Camera.Constants.Type.front : Camera.Constants.Type.back, ); }}> {t('flipCamera')} ); function onBarcodeScanned(event: BarCodeEvent) { props.onQrFound(event.data); setScanned(true); } }; interface QrScannerProps { onQrFound: (data: string) => void; title?: string; }