'use client'; import React, { useState, useEffect } from 'react'; import { useRecordMode } from './RecordModeContext'; import { finder } from '@medv/finder'; import { Play, Square, MousePointer2, Scroll, Plus, Save, Trash2, Eye, Edit2, X, Check, } from 'lucide-react'; import { RecordEvent } from '@/types/record-mode'; export function RecordModeOverlay() { const { isActive, setIsActive, isRecording, startRecording, stopRecording, events, addEvent, updateEvent, removeEvent, isPlaying, playEvents, saveSession, clearEvents, } = useRecordMode(); const [pickingMode, setPickingMode] = useState<'click' | 'scroll' | null>(null); const [hoveredElement, setHoveredElement] = useState(null); const [editingEventId, setEditingEventId] = useState(null); // Edit form state const [editForm, setEditForm] = useState>({}); useEffect(() => { if (!isActive) return; const handleMouseOver = (e: MouseEvent) => { if (pickingMode) { e.stopPropagation(); e.preventDefault(); const target = e.target as HTMLElement; if (target.closest('.record-mode-ui')) return; setHoveredElement(target); } }; const handleClick = (e: MouseEvent) => { if (pickingMode && hoveredElement) { e.stopPropagation(); e.preventDefault(); const selector = finder(hoveredElement); if (pickingMode === 'click') { addEvent({ type: 'click', selector, duration: 1000, zoom: 1, description: `Click on ${hoveredElement.tagName.toLowerCase()}`, motionBlur: false, }); } else if (pickingMode === 'scroll') { addEvent({ type: 'scroll', selector, duration: 1000, zoom: 1, description: `Scroll to ${hoveredElement.tagName.toLowerCase()}`, motionBlur: false, }); } setPickingMode(null); setHoveredElement(null); } }; if (pickingMode) { window.addEventListener('mouseover', handleMouseOver); window.addEventListener('click', handleClick, true); } return () => { window.removeEventListener('mouseover', handleMouseOver); window.removeEventListener('click', handleClick, true); }; }, [isActive, pickingMode, hoveredElement, addEvent]); const startEditing = (event: RecordEvent) => { setEditingEventId(event.id); setEditForm({ ...event }); }; const saveEdit = () => { if (editingEventId && editForm) { updateEvent(editingEventId, editForm); setEditingEventId(null); setEditForm({}); } }; const cancelEdit = () => { setEditingEventId(null); setEditForm({}); }; if (!isActive) { return ( ); } return (
{/* Hover Highlighter */} {pickingMode && hoveredElement && (
)} {/* Control Panel */}

Record Mode

{!isRecording ? ( ) : ( )}
{/* Edit Form */} {editingEventId && (
Edit Event
setEditForm({ ...editForm, duration: parseInt(e.target.value) })} className="w-full bg-black/40 border border-white/10 rounded p-1" />
setEditForm({ ...editForm, zoom: parseFloat(e.target.value) })} className="w-full bg-black/40 border border-white/10 rounded p-1" />
setEditForm({ ...editForm, description: e.target.value })} className="w-full bg-black/40 border border-white/10 rounded p-1" />
)} {/* Event Timeline */}
{events.length === 0 && (
No events recorded yet.
)} {events.map((event, index) => (
startEditing(event)} > {index + 1} {event.type === 'click' && } {event.type === 'scroll' && }
{event.selector} {event.motionBlur && ( Blur )} {event.zoom && event.zoom !== 1 && ( x{event.zoom} )}
{(event.timestamp / 1000).toFixed(1)}s
))}
{/* Picking Instructions */} {pickingMode && (
Select element to {pickingMode}
)}
); }