import React, {useContext, useEffect, useState} from 'react'; import Icon from 'react-native-vector-icons/MaterialIcons'; import {Linking, Pressable, TouchableOpacity, View} from 'react-native'; import {Theme} from './ui/styleUtils'; import {Column, Row, Text} from './ui'; import {GlobalContext} from '../shared/GlobalContext'; import {useSelector} from '@xstate/react'; import {selectIsActive} from '../machines/app'; import {useTranslation} from 'react-i18next'; import testIDProps from '../shared/commonUtil'; import {SvgImage} from './ui/svg'; import {isAndroid} from '../shared/constants'; import {CameraView, useCameraPermissions, PermissionStatus, BarcodeScanningResult, CameraType} from 'expo-camera'; import {CameraPosition} from "../shared/Utils"; export const QrScanner: React.FC = props => { const {t} = useTranslation('QrScanner'); const {appService} = useContext(GlobalContext); const [scanned, setScanned] = useState(false); const [cameraType, setCameraType] = useState(CameraPosition.BACK); const [hasCameraPermission, setHasCameraPermission] = useState< boolean | null >(null); const [ showCameraPermissionDeniedBanner, setShowCameraPermissionDeniedBanner, ] = useState(false); const [_, requestCameraPermission, getCameraPermissionsAsync] = useCameraPermissions(); const [isCameraActive, setIsCameraActive] = useState(true); useEffect(() => { return () => { setIsCameraActive(false); }; }, []); const isActive = useSelector(appService, selectIsActive); const openSettings = () => { if (isAndroid()) { Linking.openSettings(); } else { Linking.openURL('App-Prefs:Privacy'); } }; useEffect(() => { if (isActive && !Boolean(hasCameraPermission)) { (async () => { setShowCameraPermissionDeniedBanner(false); const cameraPermissionResult = await getCameraPermissionsAsync(); if (cameraPermissionResult.status === PermissionStatus.UNDETERMINED) { const response = await requestCameraPermission(); setHasCameraPermission(response.granted); if (response.granted === false) { setShowCameraPermissionDeniedBanner(true); } } else if (cameraPermissionResult.status === PermissionStatus.GRANTED) { setHasCameraPermission(true); } else { setHasCameraPermission(false); setShowCameraPermissionDeniedBanner(true); } })(); } }, [isActive]); if (hasCameraPermission === null) { return ; } const CameraDisabledPopUp: React.FC = () => { return ( {t('cameraAccessDisabled')} {t('cameraPermissionGuideLabel')} setShowCameraPermissionDeniedBanner(false)} color={Theme.Colors.whiteText} size={18} /> {t('EnablePermission')} ); }; return ( <> {hasCameraPermission ? ( {props.title && ( {props.title} )} { setCameraType( cameraType === CameraPosition.FRONT ? CameraPosition.BACK : CameraPosition.FRONT, ); }}> {SvgImage.FlipCameraIcon()} {t('flipCamera')} ) : ( )} {showCameraPermissionDeniedBanner && } ); function onBarcodeScanned(event: BarcodeScanningResult) { props.onQrFound(event.data); setScanned(true); } }; interface QrScannerProps { onQrFound: (data: string) => void; title?: string; } enum BarCodeTypes { QR = 'qr', }