import { useCallback, useEffect, useRef, useState } from "react"; import { fetchSamples, summarizeText } from "../api/client"; import BatchUpload from "../components/BatchUpload"; import DatasetToggle from "../components/DatasetToggle"; import LiveMetrics from "../components/LiveMetrics"; import SampleGallery from "../components/SampleGallery"; import SummarizerWidget, { MODELS } from "../components/SummarizerWidget"; import { Moon, Sun, Zap } from "lucide-react"; const FALLBACK_TEXT = { gcc: "A rear-end collision involving two vehicles was recorded on Sheikh Zayed Road in Dubai during the evening peak. The incident caused a temporary lane closure, minor injuries, and congestion extending into the surrounding corridor while responders managed the scene.", us: "A crash involving multiple vehicles blocked the two right lanes on I-95 northbound near Exit 42 in the afternoon commute, causing heavy delays and slow traffic through the corridor. Emergency responders were dispatched to the scene and drivers were advised to use caution." }; export default function Home() { const [isDark, setIsDark] = useState(false); const [datasetTrack, setDatasetTrack] = useState("gcc"); const [text, setText] = useState(FALLBACK_TEXT.gcc); const [modelChoice, setModelChoice] = useState("bart_large_cnn"); const [summary, setSummary] = useState(""); const [samples, setSamples] = useState([]); const [loading, setLoading] = useState(false); const textRef = useRef(text); const datasetTrackRef = useRef(datasetTrack); const modelChoiceRef = useRef(modelChoice); // Sync refs safely useEffect(() => { textRef.current = text; }, [text]); useEffect(() => { datasetTrackRef.current = datasetTrack; }, [datasetTrack]); useEffect(() => { modelChoiceRef.current = modelChoice; }, [modelChoice]); // Initial dark mode setup (flicker-free) useEffect(() => { document.documentElement.classList.toggle("dark", isDark); }, [isDark]); useEffect(() => { const controller = new AbortController(); let active = true; fetchSamples(datasetTrack) .then((items) => { if (!active) return; setSamples(items); // Only override if default or empty setText((prev) => { if (!prev || prev === FALLBACK_TEXT.gcc || prev === FALLBACK_TEXT.us || samples.some(s => s.text === prev)) { return items.length ? items[0].text : FALLBACK_TEXT[datasetTrack]; } return prev; }); }) .catch((err) => { if (!active || err.name === 'AbortError') return; setSamples([]); setText(FALLBACK_TEXT[datasetTrack]); }); setSummary(""); return () => { active = false; controller.abort(); }; }, [datasetTrack]); const runSummarize = useCallback(async (targetModelId) => { const modelToUse = targetModelId || modelChoiceRef.current; const currentText = textRef.current; const currentTrack = datasetTrackRef.current; if (!currentText || currentText.trim().length < 10) return; setLoading(true); setSummary(""); try { const data = await summarizeText({ text: currentText, model_choice: modelToUse, dataset_track: currentTrack }); setSummary(data.summary); } catch (error) { setSummary(`Error: ${error?.response?.data?.detail || error.message}`); } finally { setLoading(false); } }, []); const handleSummarize = useCallback(() => runSummarize(), [runSummarize]); const handleModelSelect = useCallback((modelId) => { setModelChoice(modelId); runSummarize(modelId); }, [runSummarize]); return (
{/* Navbar */}
Traffic Intel
CUD ยท AAI Midterm Project
Live Backend
{/* Main Content */}
{/* Hero Banner */}

Turn Traffic Chaos{" "} into Clarity

Compare extractive & abstractive LLM summarization methods on real-world traffic incident data from GCC and US datasets.

{[ { label: "Models", value: "4" }, { label: "GCC Samples", value: "250+" }, { label: "US Records", value: "5K+" } ].map(s => (
{s.value}
{s.label}
))}
{/* 3-Column Main Grid */}
{/* Column 1: Main Summarizer Widget */}
{/* Column 2: Dataset Preview */}

Dataset Preview

{samples.length} Samples
{/* Column 3: Controls */}
); }