itm-holding-package
Version:
ITM HOLDING PACKAGES
90 lines (78 loc) • 2.63 kB
text/typescript
import { useState, useEffect, useCallback } from 'react';
// Extend the DisplayMediaStreamOptions type
interface ExtendedDisplayMediaStreamOptions extends DisplayMediaStreamOptions {
preferCurrentTab?: boolean;
}
export const useScreenRecorder = () => {
const [isRecording, setIsRecording] = useState(false);
const [mediaRecorder, setMediaRecorder] = useState<MediaRecorder | null>(null);
const [recordedChunks, setRecordedChunks] = useState<Blob[]>([]);
const [videoURL, setVideoURL] = useState<string | null>(null);
const [error, setError] = useState<string | null>(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
} as ExtendedDisplayMediaStreamOptions);
const recorder = new MediaRecorder(stream);
setMediaRecorder(recorder);
const chunks: Blob[] = [];
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
};
};