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 (
); });