import { useCallback, useContext, useRef, useState } from 'react'; import { useJsonForms } from '@jsonforms/react'; import { DataContext } from '../../context/Context'; import { CapturedImage, FacingMode, WebCameraHandler } from './camera.types'; export function useCameraController( setImages: React.Dispatch>, uischemaData: any, path: string, images: CapturedImage[], setCropImageUrl: React.Dispatch, closeHandler: () => void ) { const { serviceProvider, setLoading } = useContext(DataContext); const cameraRef = useRef(null); const ctx = useJsonForms(); const [facingMode, setFacingMode] = useState('environment'); const [cameraError, setCameraError] = useState(false); const [isSaving, setIsSaving] = useState(false); const deleteImage = (index: number) => { setImages((p) => p.filter((_, i) => i !== index)); }; const captureImage = useCallback(async () => { if (!cameraRef.current) return; const file = await cameraRef.current.capture(); if (!file) return; const previewUrl = URL.createObjectURL(file); setCropImageUrl(previewUrl); }, []); const switchCamera = useCallback(() => { cameraRef.current?.switchCamera(); setFacingMode((p) => (p === 'user' ? 'environment' : 'user')); }, []); const callServiceProvider = async (images ) => { await serviceProvider(ctx, uischemaData, { event: { _reactName: "onUpload" }, uischemaData, ...uischemaData.additionalData, path, setLoading, paramValue: images, }); }; const saveImage = useCallback(async () => { setIsSaving(true); try { await callServiceProvider(images); setIsSaving(false); setImages([]) closeHandler() } catch (err) { setIsSaving(false) } }, [images]); return { cameraRef, facingMode, cameraError, isSaving, captureImage, switchCamera, saveImage, setCameraError, deleteImage }; }