"use client"; import { Check, Copy, Target, TriangleAlert, X } from "lucide-react"; import Image from "next/image"; import { useEffect, useMemo, useRef, useState } from "react"; import { showMapNotice } from "@/features/map/core/components/notice"; import { cn } from "@/lib/utils"; import { SCADA_ICON_PATHS } from "../map/scada"; import type { DetailFeature } from "../types"; import { formatFeaturePropertyValue, getFeatureInsightMetrics, getLocalizedFeatureProperties } from "../utils/feature-properties"; import { FeaturePropertyList } from "./feature-property-list"; type FeatureInsightPanelProps = { feature: DetailFeature | null; onClose: () => void; }; export function FeatureInsightPanel({ feature, onClose }: FeatureInsightPanelProps) { const [copiedScadaUuid, setCopiedScadaUuid] = useState(false); const copyResetTimeoutRef = useRef | null>(null); useEffect(() => () => { if (copyResetTimeoutRef.current) { clearTimeout(copyResetTimeoutRef.current); } }, []); const metrics = useMemo(() => { if (!feature) { return []; } return getFeatureInsightMetrics(feature.layer, feature.properties); }, [feature]); const propertyEntries = useMemo(() => { if (!feature) { return []; } return feature.layer === "scada" ? [] : getLocalizedFeatureProperties(feature.properties); }, [feature]); const scadaQueryUuid = feature?.layer === "scada" ? getCopyablePropertyValue(feature.properties.sensor_id ?? feature.id) : null; const handleCopyScadaUuid = async () => { if (!scadaQueryUuid) { return; } try { if (!navigator.clipboard) { throw new Error("Clipboard API unavailable"); } await navigator.clipboard.writeText(scadaQueryUuid); setCopiedScadaUuid(true); if (copyResetTimeoutRef.current) { clearTimeout(copyResetTimeoutRef.current); } copyResetTimeoutRef.current = setTimeout(() => setCopiedScadaUuid(false), 1500); } catch { showMapNotice({ tone: "error", title: "无法复制 UUID", message: "请手动选择查询 UUID 后复制。" }); } }; return ( ); } function getCopyablePropertyValue(value: unknown) { if (typeof value === "string" && value.trim().length > 0) { return value.trim(); } if (typeof value === "number" || typeof value === "bigint") { return String(value); } return null; } function getScadaPresentation(rawKind: unknown) { const kind = String(rawKind ?? ""); if (kind === "water_quality") return { iconPath: SCADA_ICON_PATHS.waterQuality, sectionClassName: "material-tone-normal border-teal-200", labelClassName: "text-teal-800" }; if (kind === "radar_level") return { iconPath: SCADA_ICON_PATHS.radarLevel, sectionClassName: "material-tone-info border-blue-200", labelClassName: "text-blue-800" }; if (kind === "ultrasonic_flow") return { iconPath: SCADA_ICON_PATHS.ultrasonicFlow, sectionClassName: "material-tone-warning border-orange-200", labelClassName: "text-orange-800" }; if (kind === "integrated_monitoring" || kind === "综合监测点") return { iconPath: SCADA_ICON_PATHS.integratedMonitoring, sectionClassName: "material-tone-normal border-cyan-200", labelClassName: "text-cyan-800" }; return { iconPath: SCADA_ICON_PATHS.integratedMonitoring, sectionClassName: "material-tone-normal border-cyan-200", labelClassName: "text-cyan-800" }; }