import { memo, useCallback, useState } from 'react'; import { getMouseData, type MouseData } from '~/lib/replay/Recording'; interface PointSelectorProps { isSelectionMode: boolean; setIsSelectionMode: (mode: boolean) => void; selectionPoint: { x: number; y: number } | null; setSelectionPoint: (point: { x: number; y: number } | null) => void; containerRef: React.RefObject; } let gCurrentMouseData: MouseData | undefined; export function getCurrentMouseData() { return gCurrentMouseData; } export const PointSelector = memo( (props: PointSelectorProps) => { const { isSelectionMode, setIsSelectionMode, selectionPoint, setSelectionPoint, containerRef, } = props; const [isCapturing, setIsCapturing] = useState(false); const [mouseData, setMouseData] = useState(undefined); gCurrentMouseData = mouseData; const handleSelectionClick = useCallback(async (event: React.MouseEvent) => { event.preventDefault(); event.stopPropagation(); if (!isSelectionMode || !containerRef.current) { return; } const rect = event.currentTarget.getBoundingClientRect(); const x = event.clientX - rect.left; const y = event.clientY - rect.top; setSelectionPoint({ x, y }); setIsCapturing(true); const mouseData = await getMouseData(containerRef.current, { x, y }); console.log("MouseData", mouseData); setMouseData(mouseData); setIsCapturing(false); setIsSelectionMode(false); // Turn off selection mode after capture }, [isSelectionMode, containerRef, setIsSelectionMode]); if (!isSelectionMode) { if (selectionPoint) { // Draw an overlay to prevent interactions with the iframe // and to show the last point the user clicked. return (
event.preventDefault()} >
); } else { return null; } } return (
); }, );