import { useEffect, useState } from 'react'; import Alert from '@mui/material/Alert'; import Button from '@mui/material/Button'; import Divider from '@mui/material/Divider'; import Drawer from '@mui/material/Drawer'; import IconButton from '@mui/material/IconButton'; import LinearProgress from '@mui/material/LinearProgress'; import TextField from '@mui/material/TextField'; import Typography from '@mui/material/Typography'; import { X } from 'lucide-react'; import { annotateStreet } from '../../services/api'; import { useFilters } from '../../context/FilterContext'; import { SEVERITY_COLORS } from '../../types'; import { Term } from '../help/InfoTip'; export default function SeverityDrawer() { const { selected, setSelected } = useFilters(); const [annotation, setAnnotation] = useState(''); const [saving, setSaving] = useState(false); const [saveState, setSaveState] = useState<'idle' | 'saved' | 'error'>('idle'); useEffect(() => { setAnnotation(selected?.manual_annotation ?? ''); setSaveState('idle'); }, [selected?.id]); const handleSave = async () => { if (!selected) return; setSaving(true); try { await annotateStreet(selected.street_name, annotation); setSaveState('saved'); } catch { setSaveState('error'); } finally { setSaving(false); } }; const severityColor = selected ? SEVERITY_COLORS[selected.severity_label] : '#888'; return ( {selected && ( <>
{selected.street_name} {selected.county} County · {selected.id}
setSelected(null)} aria-label="Close details">
Severity index
{selected.severity_index.toFixed(2)} {selected.severity_label}
Conflict type
{selected.conflict_type}
Min time-to-collision
{selected.min_ttc.toFixed(1)} s
Min post-encroachment time
{selected.min_pet.toFixed(1)} s
Max approach speed
{selected.max_speed.toFixed(1)} m/s
Location
{selected.lat.toFixed(4)}, {selected.lng.toFixed(4)}
Analyst annotation { setAnnotation(e.target.value); setSaveState('idle'); }} sx={{ mt: 1 }} /> {saveState === 'saved' && ( Annotation saved. )} {saveState === 'error' && ( Failed to save annotation. )} )}
); }