import { SettingsRegular } from "@fluentui/react-icons"; import { cx } from "../../lib/utils"; import { StatusDot } from "../ui"; import { FieldRow } from "./FieldRow"; import { isDeviceOnline, isRegistered, isRecoveringPhase, lifecycleLabel, signalLevel, signalTone } from "./shared"; import type { DeviceDetail } from "./types"; import { useI18n } from "../../lib/i18n"; import { CountryFlag } from "../CountryFlag"; const BAR_HEIGHTS = ["h-[28%]", "h-[46%]", "h-[64%]", "h-[82%]", "h-full"]; const TEXT_TONE = { green: "text-emerald-500 dark:text-emerald-400", amber: "text-amber-500 dark:text-amber-400", red: "text-red-500 dark:text-red-400", gray: "text-gray-400 dark:text-gray-500", } as const; const BAR_TONE = { green: "bg-emerald-500", amber: "bg-amber-500", red: "bg-red-500", gray: "bg-gray-300 dark:bg-gray-600", } as const; export function OverviewNetworkCard({ device, onOpenOperatorSelection }: { device: DeviceDetail; onOpenOperatorSelection: () => void }) { const { t } = useI18n(); const modem = device.modem; const online = isDeviceOnline(device); const cellularRegistered = isRegistered(device); const simMissing = !!modem?.imei && modem?.simInserted === false; // A persisted runtime may briefly describe the old session while disable is // being cleaned up. Desired policy is authoritative for the overview badge. const vowifiRegistered = !!device.vowifiEnabled && !!(device.vowifiActive || device.vowifiRuntime?.smsReady); const registered = !simMissing && (cellularRegistered || vowifiRegistered); const radioOffForVowifi = vowifiRegistered && (modem?.operatingMode === 0 || modem?.operatingMode === 4 || device.flightMode); const tone = isRecoveringPhase(device.lifecyclePhase) ? "warning" : online ? (registered ? "success" : "warning") : "danger"; let statusText: string; const phaseLabel = lifecycleLabel(device.lifecyclePhase); if (phaseLabel && device.lifecyclePhase !== "online" && device.lifecyclePhase !== "offline") statusText = phaseLabel; else if (online) { if (simMissing) statusText = t("SIM卡未插入"); else statusText = registered ? "" : device.registrationStateLabel === "searching" ? t("搜索网络中") : device.registrationStateLabel === "denied" ? t("驻网被拒") : t("未驻网"); } else statusText = device.running ? t("控制面恢复中") : t("离线"); const level = signalLevel(modem?.signalDbm); const sigTone = signalTone(modem?.signalDbm); const netMode = [modem?.networkDuplex, modem?.networkMode].filter(Boolean).join(" "); const cellularRegistrationText = simMissing ? t("SIM卡未插入") : modem?.regStatus === 5 ? t("已驻网(漫游)") : modem?.regStatus === 1 ? t("已驻网") : device.registrationStateLabel === "searching" ? t("正在搜索网络") : device.registrationStateLabel === "denied" ? t("驻网被拒") : t("未驻网"); return ( <>