in src/frontends/live_api_react/frontend/src/hooks/use-screen-capture.ts [20:72]
export function useScreenCapture(): UseMediaStreamResult {
const [stream, setStream] = useState<MediaStream | null>(null);
const [isStreaming, setIsStreaming] = useState(false);
useEffect(() => {
const handleStreamEnded = () => {
setIsStreaming(false);
setStream(null);
};
if (stream) {
stream
.getTracks()
.forEach((track) => track.addEventListener("ended", handleStreamEnded));
return () => {
stream
.getTracks()
.forEach((track) =>
track.removeEventListener("ended", handleStreamEnded),
);
};
}
}, [stream]);
const start = async () => {
// const controller = new CaptureController();
// controller.setFocusBehavior("no-focus-change");
const mediaStream = await navigator.mediaDevices.getDisplayMedia({
video: true,
// controller
});
setStream(mediaStream);
setIsStreaming(true);
return mediaStream;
};
const stop = () => {
if (stream) {
stream.getTracks().forEach((track) => track.stop());
setStream(null);
setIsStreaming(false);
}
};
const result: UseMediaStreamResult = {
type: "screen",
start,
stop,
isStreaming,
stream,
};
return result;
}