"use client"; import { RefreshCw, X } from "lucide-react"; import type { MouseEvent } from "react"; import { useState } from "react"; import { AiCityTemperatureChart } from "@/components/dashboard/scan-terminal/AiCityTemperatureChart"; import { AiEvidencePanel } from "@/components/dashboard/scan-terminal/AiEvidencePanel"; import { CityStatusTags, type CityStatusTag, type StatusTone, } from "@/components/dashboard/scan-terminal/CityStatusTags"; import { DataFreshnessBar, type DataFreshnessRow, } from "@/components/dashboard/scan-terminal/DataFreshnessBar"; import { LoadingSignal } from "@/components/dashboard/scan-terminal/LoadingSignal"; import { MarketDecisionLine } from "@/components/dashboard/scan-terminal/MarketDecisionLine"; import { ModelEvidencePanel } from "@/components/dashboard/scan-terminal/ModelEvidencePanel"; import type { MarketDecisionView } from "@/components/dashboard/scan-terminal/city-card-decision-utils"; import type { CityDecisionState } from "@/components/dashboard/scan-terminal/city-decision-state"; import { getCityLoadingCopy, getMobileDecisionCopy, } from "@/components/dashboard/scan-terminal/decision-copy"; import type { AiCityForecastPayload, AiCityForecastState, } from "@/components/dashboard/scan-terminal/types"; import type { CityDetail } from "@/lib/dashboard-types"; export function MobileDecisionCard({ aiBullets, aiCityForecast, aiConfidence, aiForecast, aiPredictedMax, aiRangeHigh, aiRangeLow, aiReadCompleteText, aiReadInProgressText, aiRuleEvidenceMode, aiRuleEvidenceText, currentTempText, dataFreshnessRows, debPrediction, decisionState, detail, displayName, expectedHighText, fallbackAiReason, freshnessSeparator, isEn, isHkoObservation, isRefreshing, localModelSupportNote, localizedFinalJudgment, marketDecisionView, marketLineText, onRefresh, onRemove, peakWindow, rawObservationText, removing, tempSymbol, }: { aiBullets: string[]; aiCityForecast: AiCityForecastPayload["city_forecast"] | null; aiConfidence: string | null; aiForecast: AiCityForecastState; aiPredictedMax: number | null; aiRangeHigh: number | null; aiRangeLow: number | null; aiReadCompleteText: string; aiReadInProgressText: string; aiRuleEvidenceMode: boolean; aiRuleEvidenceText: string; currentTempText: string; dataFreshnessRows: DataFreshnessRow[]; debPrediction: number | null; decisionState: CityDecisionState; detail: CityDetail | null; displayName: string; expectedHighText: string; fallbackAiReason: string; freshnessSeparator: string; isEn: boolean; isHkoObservation: boolean; isRefreshing: boolean; localModelSupportNote: string; localizedFinalJudgment: string; marketDecisionView: MarketDecisionView; marketLineText: string; onRefresh: (event: MouseEvent) => void; onRemove: (event: MouseEvent) => void; peakWindow: string; rawObservationText: string; removing?: boolean; tempSymbol: string; }) { const copy = getMobileDecisionCopy(isEn); const loadingCopy = getCityLoadingCopy({ isEn, isHkoObservation }); const [modelOpen, setModelOpen] = useState(false); const [chartOpen, setChartOpen] = useState(false); const statusTags: CityStatusTag[] = decisionState.badges.length ? decisionState.badges : [{ label: decisionState.aiStatusLabel, tone: decisionState.aiStatusTone as StatusTone }]; return ( <>
{isEn ? "Mobile action card" : "移动端行动卡"}

{displayName}

{copy.currentTemp} {currentTempText} {copy.expectedHigh} {expectedHighText} {copy.peakWindow} {peakWindow}

{decisionState.primaryReason}

{!detail ? (
) : (
setModelOpen(event.currentTarget.open)} > {copy.modelEvidence} {modelOpen ? : null}
setChartOpen(event.currentTarget.open)} > {copy.chart} {chartOpen ? : null}
)} ); }