UNPKG

itm-holding-package

Version:

ITM HOLDING PACKAGES

77 lines (76 loc) 2.64 kB
import { useState, useEffect, useCallback } from 'react'; export const useScreenRecorder = () => { const [isRecording, setIsRecording] = useState(false); const [mediaRecorder, setMediaRecorder] = useState(null); const [recordedChunks, setRecordedChunks] = useState([]); const [videoURL, setVideoURL] = useState(null); const [error, setError] = useState(null); // Nettoyer l'URL lors du démontage useEffect(() => { return () => { if (videoURL) { URL.revokeObjectURL(videoURL); } }; }, [videoURL]); const startRecording = useCallback(async () => { try { const stream = await navigator.mediaDevices.getDisplayMedia({ video: true, audio: false, preferCurrentTab: true }); const recorder = new MediaRecorder(stream); setMediaRecorder(recorder); const chunks = []; recorder.ondataavailable = (event) => { if (event.data.size > 0) { chunks.push(event.data); } }; recorder.onstop = () => { const blob = new Blob(chunks, { type: 'video/webm' }); setRecordedChunks(chunks); const url = URL.createObjectURL(blob); setVideoURL(url); stream.getTracks().forEach(track => track.stop()); }; recorder.start(); setIsRecording(true); setError(null); } catch (err) { if (err instanceof Error) { setError(err.message); } else { setError("Une erreur est survenue lors du démarrage de l'enregistrement"); } setIsRecording(false); } }, []); const stopRecording = useCallback(() => { if (mediaRecorder && mediaRecorder.state !== 'inactive') { mediaRecorder.stop(); setIsRecording(false); mediaRecorder.stream.getTracks().forEach(track => track.stop()); } }, [mediaRecorder]); const resetRecording = useCallback(() => { if (videoURL) { URL.revokeObjectURL(videoURL); } setVideoURL(null); setRecordedChunks([]); setError(null); }, [videoURL]); return { isRecording, videoURL, error, recordedBlob: recordedChunks.length > 0 ? new Blob(recordedChunks, { type: 'video/webm' }) : null, startRecording, stopRecording, resetRecording }; };