import { useCallback, useEffect, useRef, useState } from "react"; import { Alert } from "react-native"; import { mediaDevices, MediaStream } from "react-native-webrtc"; export const useLocalMedia = (isAuthenticated: boolean) => { const mediaStreamRef = useRef(null); const [state, setState] = useState({ isMediaReady: false, isFrontCamera: true, isMuted: false, }); const initializeMedia = useCallback(async (isFront: boolean) => { await mediaDevices.getUserMedia({ audio: true, video: { width: { min: 360, ideal: 540, max: 960 }, height: { min: 480, ideal: 720, max: 1280 }, frameRate: { ideal: 30, max: 30 }, facingMode: isFront ? 'user' : 'environment', }, }).then((stream) => { mediaStreamRef.current = stream; setState((prev) => ({ ...prev, isMediaReady: true, isFrontCamera: isFront, })); }).catch((error) => { console.error('스트림 시작 실패:', error); setState((prev) => ({ ...prev, isMediaReady: false })); Alert.alert( '미디어 접근 실패', '카메라와 마이크 권한을 확인해주세요.', [{ text: '확인' }] ); }); }, []); useEffect(() => { if (!isAuthenticated) { // 인증되지 않은 경우 미디어 스트림 해제 if (mediaStreamRef.current) { mediaStreamRef.current.getTracks().forEach(track => track.stop()); mediaStreamRef.current = null; setState((prev) => ({ ...prev, isMediaReady: false })); } return; } initializeMedia(true); return () => { if (mediaStreamRef.current) { mediaStreamRef.current.getTracks().forEach(track => track.stop()); mediaStreamRef.current = null; setState((prev) => ({ ...prev, isMediaReady: false })); } }; }, [isAuthenticated, initializeMedia]); const toggleMute = useCallback(() => { if (!mediaStreamRef.current) return; const audioTrack = mediaStreamRef.current.getAudioTracks()[0]; if (audioTrack) { audioTrack.enabled = !audioTrack.enabled; setState((prev) => ({ ...prev, isMuted: !audioTrack.enabled })); } }, []); const switchCamera = useCallback(() => { if (!mediaStreamRef.current) return; mediaStreamRef.current.getTracks().forEach(track => track.stop()); mediaStreamRef.current = null; initializeMedia(!state.isFrontCamera) }, [state.isFrontCamera, initializeMedia]); return { // 상태 ...state, // 미디어 스트림 mediaStream: mediaStreamRef.current, // 미디어 액션 toggleMute, switchCamera, }; };