import type { NativeStackScreenProps } from '@react-navigation/native-stack'; import React, { useCallback, useEffect, useState } from 'react'; import { ImageRequireSource, Linking } from 'react-native'; import { StyleSheet, View, Text, Image } from 'react-native'; import { Camera, CameraPermissionStatus } from 'react-native-vision-camera'; import { CONTENT_SPACING, SAFE_AREA_PADDING } from './Constants'; import type { Routes } from './Routes'; // eslint-disable-next-line @typescript-eslint/no-var-requires const BANNER_IMAGE = require('../../docs/static/img/11.png') as ImageRequireSource; type Props = NativeStackScreenProps; export function PermissionsPage({ navigation }: Props): React.ReactElement { const [cameraPermissionStatus, setCameraPermissionStatus] = useState('not-determined'); const [microphonePermissionStatus, setMicrophonePermissionStatus] = useState('not-determined'); const requestMicrophonePermission = useCallback(async () => { console.log('Requesting microphone permission...'); const permission = await Camera.requestMicrophonePermission(); console.log(`Microphone permission status: ${permission}`); if (permission === 'denied') await Linking.openSettings(); setMicrophonePermissionStatus(permission); }, []); const requestCameraPermission = useCallback(async () => { console.log('Requesting camera permission...'); const permission = await Camera.requestCameraPermission(); console.log(`Camera permission status: ${permission}`); if (permission === 'denied') await Linking.openSettings(); setCameraPermissionStatus(permission); }, []); useEffect(() => { if (cameraPermissionStatus === 'authorized' && microphonePermissionStatus === 'authorized') navigation.replace('CameraPage'); }, [cameraPermissionStatus, microphonePermissionStatus, navigation]); return ( Welcome to{'\n'}Vision Camera. {cameraPermissionStatus !== 'authorized' && ( Vision Camera needs Camera permission.{' '} Grant )} {microphonePermissionStatus !== 'authorized' && ( Vision Camera needs Microphone permission.{' '} Grant )} ); } const styles = StyleSheet.create({ welcome: { fontSize: 38, fontWeight: 'bold', maxWidth: '80%', }, banner: { position: 'absolute', opacity: 0.4, bottom: 0, left: 0, }, container: { flex: 1, backgroundColor: 'white', ...SAFE_AREA_PADDING, }, permissionsContainer: { marginTop: CONTENT_SPACING * 2, }, permissionText: { fontSize: 17, }, hyperlink: { color: '#007aff', fontWeight: 'bold', }, bold: { fontWeight: 'bold', }, });