itm-holding-package
Version:
ITM HOLDING PACKAGES
77 lines (76 loc) • 2.64 kB
JavaScript
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
};
};