import React, { useEffect, useState, useRef } from 'react'; import { View, Button, StyleSheet, Alert, Text, Linking, TouchableOpacity } from 'react-native'; import { Camera, useCameraDevice } from 'react-native-vision-camera'; import { useNavigation } from '@react-navigation/native'; import AsyncStorage from '@react-native-async-storage/async-storage'; import Api from '../api/ApiUtils' const CameraScreen = () => { const [hasPermission, setHasPermission] = useState(null); // null로 초기화하여 권한 상태가 로딩 중임을 표시 const [isDeviceReady, setIsDeviceReady] = useState(false); const device = useCameraDevice('front'); const camera = useRef(null); const navigation = useNavigation(); // Function to check and request camera permission const checkPermission = async () => { try { const cameraPermission = await Camera.getCameraPermissionStatus(); if (cameraPermission === 'granted') { setHasPermission(true); setIsDeviceReady(true); } else if (cameraPermission === 'not-determined') { const newCameraPermission = await Camera.requestCameraPermission(); if (newCameraPermission === 'granted') { setHasPermission(true); setIsDeviceReady(true); } else { setHasPermission(false); Alert.alert('카메라 권한 필요', '카메라 권한이 필요합니다.', [ { text: '설정으로 이동', onPress: () => Linking.openSettings() }, { text: '취소', style: 'cancel' }, ]); } } else { setHasPermission(false); Alert.alert('카메라 권한 필요', '카메라 권한이 필요합니다.', [ { text: '설정으로 이동', onPress: () => Linking.openSettings() }, { text: '취소', style: 'cancel' }, ]); } } catch (error) { console.error('Permission check error:', error); Alert.alert('오류', '권한 확인 중 오류가 발생했습니다.'); } }; useEffect(() => { checkPermission(); // Check permission once on component mount }, []); useEffect(() => { if (device) { setIsDeviceReady(true); } else { setIsDeviceReady(false); } }, [device]); const handleCapture = async () => { if (camera.current) { try { const photo = await camera.current.takePhoto({ flash: 'off', qualityPrioritization: 'speed', }); const uri = photo.path; // API 호출을 비동기로 처리 const response = await Api.uploadPhoto(uri); // 응답 상태 코드에 따른 처리 if (response.class_id !== 1) { let alertMessage = ''; let alertTitle = '분석 실패'; // 클래스 ID에 따른 메시지 설정 switch (response.class_id) { case 0: alertMessage = '헬멧을 찾을 수 없습니다. 사진을 다시 찍으시겠습니까? 아니면 감점을 받고 넘어가시겠습니까?'; break; case 2: alertMessage = '사용자를 찾을 수 없습니다. 사진을 다시 찍으시겠습니까? 아니면 감점을 받고 넘어가시겠습니까?'; break; default: alertMessage = '사진 분석에 실패했습니다. 사진을 다시 찍으시겠습니까? 아니면 감점을 받고 넘어가시겠습니까?'; } Alert.alert( alertTitle, alertMessage, [ { text: '사진 다시 찍기', onPress: () => { } // 사진을 다시 찍는 함수 호출 }, { text: '다음으로 넘어가기', onPress: async () => { // onPress 핸들러를 async로 정의 try { await AsyncStorage.setItem('safty_helmet_on', JSON.stringify(false)); // 점수 감점 처리 로직 (필요시 추가) navigation.navigate('Gps'); // 다음 스텝으로 이동 } catch (error) { console.error('AsyncStorage error:', error); } }, style: 'destructive' } ] ); } else { try { await AsyncStorage.setItem('safty_helmet_on', JSON.stringify(true)); // 응답 상태 코드가 1일 경우 다음 페이지로 이동 navigation.navigate('Gps'); } catch (error) { console.error('AsyncStorage error:', error); } } } catch (error) { console.error('Photo capture error:', error.message); Alert.alert('오류', '사진 캡처 중 오류가 발생했습니다.'); } } }; if (hasPermission === null) { return ( 권한을 확인 중입니다... ); } if (!hasPermission) { return ( 카메라 권한이 필요합니다. 설정에서 권한을 허용해 주세요. ); } return ( {isDeviceReady && device ? ( ) : ( 카메라 장치 준비 중...