2024-06-14 21:47:42 +05:30
|
|
|
import React, { useCallback, useEffect, useState } from 'react';
|
|
|
|
|
import { useSocketStore } from '../../context/socket';
|
|
|
|
|
import Canvas from "../atoms/canvas";
|
|
|
|
|
import { useBrowserDimensionsStore } from "../../context/browserDimensions";
|
|
|
|
|
|
|
|
|
|
export const BrowserWindow = () => {
|
|
|
|
|
const [canvasRef, setCanvasReference] = useState<React.RefObject<HTMLCanvasElement> | undefined>(undefined);
|
|
|
|
|
const [screenShot, setScreenShot] = useState<string>("");
|
2024-06-14 23:17:32 +05:30
|
|
|
const [highlighterData, setHighlighterData] = useState<{ rect: DOMRect, selector: string } | null>(null);
|
2024-06-14 21:47:42 +05:30
|
|
|
|
|
|
|
|
const { socket } = useSocketStore();
|
|
|
|
|
const { width, height } = useBrowserDimensionsStore();
|
|
|
|
|
|
|
|
|
|
const screencastHandler = useCallback((data: string) => {
|
|
|
|
|
setScreenShot(data);
|
2024-07-23 10:18:38 +05:30
|
|
|
}, []);
|
2024-06-14 21:47:42 +05:30
|
|
|
|
2024-06-14 23:17:32 +05:30
|
|
|
useEffect(() => {
|
2024-06-14 21:47:42 +05:30
|
|
|
if (socket) {
|
|
|
|
|
socket.on("screencast", screencastHandler);
|
|
|
|
|
}
|
|
|
|
|
if (canvasRef?.current) {
|
|
|
|
|
drawImage(screenShot, canvasRef.current);
|
|
|
|
|
}
|
|
|
|
|
return () => {
|
|
|
|
|
socket?.off("screencast", screencastHandler);
|
|
|
|
|
}
|
|
|
|
|
}, [screenShot, canvasRef, socket, screencastHandler]);
|
|
|
|
|
|
2024-06-14 23:17:32 +05:30
|
|
|
const highlighterHandler = useCallback((data: { rect: DOMRect, selector: string }) => {
|
2024-06-14 21:47:42 +05:30
|
|
|
setHighlighterData(data);
|
2024-07-23 10:18:38 +05:30
|
|
|
}, [])
|
2024-06-14 21:47:42 +05:30
|
|
|
|
2024-06-14 23:17:32 +05:30
|
|
|
useEffect(() => {
|
2024-06-14 21:47:42 +05:30
|
|
|
if (socket) {
|
|
|
|
|
socket.on("highlighter", highlighterHandler);
|
|
|
|
|
}
|
|
|
|
|
return () => {
|
|
|
|
|
socket?.off("highlighter", highlighterHandler);
|
|
|
|
|
};
|
2024-07-23 20:38:27 +05:30
|
|
|
}, [socket, highlighterHandler]);
|
2024-06-25 22:39:29 +05:30
|
|
|
|
2024-06-14 21:47:42 +05:30
|
|
|
return (
|
2024-07-23 20:38:27 +05:30
|
|
|
<div style={{ position: 'relative' }}>
|
2024-06-14 23:17:32 +05:30
|
|
|
<Canvas
|
|
|
|
|
onCreateRef={setCanvasReference}
|
|
|
|
|
width={width}
|
|
|
|
|
height={height}
|
2024-07-23 10:18:38 +05:30
|
|
|
highlighterData={highlighterData}
|
2024-06-14 21:47:42 +05:30
|
|
|
/>
|
2024-07-21 23:51:55 +05:30
|
|
|
</div>
|
2024-06-14 21:47:42 +05:30
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
2024-06-14 23:17:32 +05:30
|
|
|
const drawImage = (image: string, canvas: HTMLCanvasElement): void => {
|
2024-06-14 21:47:42 +05:30
|
|
|
const ctx = canvas.getContext('2d');
|
|
|
|
|
const img = new Image();
|
|
|
|
|
img.src = image;
|
|
|
|
|
img.onload = () => {
|
|
|
|
|
URL.revokeObjectURL(img.src);
|
2024-07-14 00:46:39 +05:30
|
|
|
ctx?.drawImage(img, 0, 0, 1280, 720);
|
2024-06-14 21:47:42 +05:30
|
|
|
};
|
2024-07-14 00:46:39 +05:30
|
|
|
};
|