'use client'; import * as React from 'react'; import { Modal } from '@/components/ui/Modal'; import { Button } from '@/components/ui/Button'; import type { Marker, MarkerType } from '@/types/marker'; export interface MarkerDialogProps { open: boolean; onClose: () => void; onSave: (marker: Partial) => void; marker?: Marker; // If editing existing marker defaultTime?: number; // Default time for new markers defaultType?: MarkerType; } const MARKER_COLORS = [ '#ef4444', // red '#f97316', // orange '#eab308', // yellow '#22c55e', // green '#3b82f6', // blue '#a855f7', // purple '#ec4899', // pink ]; export function MarkerDialog({ open, onClose, onSave, marker, defaultTime = 0, defaultType = 'point', }: MarkerDialogProps) { const [name, setName] = React.useState(marker?.name || ''); const [type, setType] = React.useState(marker?.type || defaultType); const [time, setTime] = React.useState(marker?.time || defaultTime); const [endTime, setEndTime] = React.useState(marker?.endTime || defaultTime + 1); const [color, setColor] = React.useState(marker?.color || MARKER_COLORS[0]); const [description, setDescription] = React.useState(marker?.description || ''); // Reset form when marker changes or dialog opens React.useEffect(() => { if (open) { setName(marker?.name || ''); setType(marker?.type || defaultType); setTime(marker?.time || defaultTime); setEndTime(marker?.endTime || defaultTime + 1); setColor(marker?.color || MARKER_COLORS[0]); setDescription(marker?.description || ''); } }, [open, marker, defaultTime, defaultType]); const handleSave = () => { const markerData: Partial = { ...(marker?.id && { id: marker.id }), name: name || 'Untitled Marker', type, time, ...(type === 'region' && { endTime }), color, description, }; onSave(markerData); onClose(); }; return ( } >
{/* Name */}
setName(e.target.value)} placeholder="Marker name" className="flex h-10 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 focus:ring-offset-background" />
{/* Type */}
{/* Time */}
setTime(parseFloat(e.target.value))} className="flex h-10 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 focus:ring-offset-background" />
{/* End Time (for regions) */} {type === 'region' && (
setEndTime(parseFloat(e.target.value))} className="flex h-10 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 focus:ring-offset-background" />
)} {/* Color */}
{MARKER_COLORS.map((c) => (
{/* Description */}
setDescription(e.target.value)} placeholder="Optional description" className="flex h-10 w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2 focus:ring-offset-background" />
); }