"use client"; import { useEffect, useRef } from "react"; import type { Camera, CameraProviderFeed } from "@/lib/types"; import { CameraFeed } from "@/components/CameraFeed"; import { SourceCredit, fetchedLabel } from "@/components/SourceCredit"; /** * Level 3 of the wall: one camera, large. Esc / Back steps up to the incident. * * Camera detections (the mockup's boxes + per-class counts) are NOT built: * blocked on server-26#199 (NYSDOT's written answer on imagery analytics) and * #200 (CISO ruling on retention). The seam is `CameraSignalSink` in c2-core * (app/internal/cameras/base.py); this panel only states that plainly. */ export function CameraDrill({ camera, feed, distanceKm, incidentTitle, pinned, onTogglePin, onClose, }: { camera: Camera; feed?: CameraProviderFeed; distanceKm?: number | null; incidentTitle?: string | null; pinned: boolean; onTogglePin: () => void; onClose: () => void; }) { const closeRef = useRef(null); useEffect(() => { closeRef.current?.focus(); }, [camera.id]); return (
e.stopPropagation()}>

{camera.name || camera.id}

Source
{feed?.name ?? camera.provider}
{camera.roadway && (<>
Road
{camera.roadway}
)} {camera.direction && (<>
Direction
{camera.direction}{camera.heading_deg != null ? " (approx. view)" : ""}
)} {distanceKm != null && (<>
Distance
{distanceKm.toFixed(1)} km from {incidentTitle ?? "the incident"}
)}
Feed
{camera.video_url ? "Live stream (falls back to still)" : "Still image"}

Camera signals · future

Object-class counts from camera stills (vehicle, truck, person, smoke) are not built. Blocked on server-26#199 (NYSDOT written answer on imagery analytics) and #200 (CISO ruling on retention). No plate or face recognition will ever be part of it.

); }