import { useCallback, useEffect, useRef, useState, type RefObject } from "react"; import type { Map as MapLibreMap } from "maplibre-gl"; import { Activity, ClipboardList, RadioTower, ReceiptText, RefreshCw, X } from "lucide-react"; import type { WorkbenchAccess } from "../api/request-context"; import { reverseGeocodePoint } from "../api/place-search-client"; import type { EventLocationAddressResolver } from "./use-event-location-address"; import { Button } from "@/shared/ui/button"; import { cn } from "@/shared/ui/cn"; import { Disclosure } from "@/shared/ui/disclosure"; import { Input } from "@/shared/ui/input"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/shared/ui/tabs"; import { ManagedTestResources } from "./managed-test-resources"; import { ScadaSystemSection } from "./scada-system-section"; import { WorkbenchNotice } from "../components/workbench-panel-ui"; import { PeripheralSampleClient, type PeripheralContext, type PeripheralWorkOrder } from "./client"; const WORK_ORDER_DESCRIPTION = "录入业务工单并跟踪处理反馈,事件调查依据实际查询和现场记录开展。"; export function PeripheralSamplePanel({ open, onClose, getAccessToken, mapReady, mapRef, onAgentTrigger, onOpenInvestigation }: { open: boolean; onClose: () => void; getAccessToken?: WorkbenchAccess; mapReady: boolean; mapRef: RefObject; onAgentTrigger?: (workOrder: PeripheralWorkOrder) => Promise; onOpenInvestigation?: (taskId: string) => void; }) { const clientRef = useRef(new PeripheralSampleClient(getAccessToken)); const client = clientRef.current; const [context, setContext] = useState(null); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); const [receiptRequestId, setReceiptRequestId] = useState(""); const [refreshGeneration, setRefreshGeneration] = useState(0); const [scadaRefreshGeneration, setScadaRefreshGeneration] = useState(0); const [activeSystem, setActiveSystem] = useState<"work-orders" | "scada">("work-orders"); const resolveEventAddress = useCallback(async ([longitude, latitude], signal) => { const result = await reverseGeocodePoint(longitude, latitude, context?.project_id ?? null, getAccessToken, signal); return result.address.trim() || result.name; }, [context?.project_id, getAccessToken]); const refresh = useCallback(async () => { if (!client.configured) return; setBusy(true); setError(null); try { setContext(await client.getContext()); setRefreshGeneration((current) => current + 1); } catch (nextError) { setError(errorMessage(nextError)); } finally { setBusy(false); } }, [client]); useEffect(() => { if (open) void refresh(); }, [open, refresh]); if (!open) return null; return ( ); } function errorMessage(error: unknown) { return error instanceof Error ? error.message : "外围工单请求失败"; }