"use client"; import { useMemo, useState } from "react"; import type { Destination } from "@/lib/types"; const TZ_OFFSET: Record = { bali: 8, lisbon: 0, chiangmai: 7, mexico: -6, barcelona: 1, tokyo: 9, }; const HOME_OFFSETS = [ { key: "cn", label: "🇨🇳 中国 (UTC+8)", offset: 8 }, { key: "us_east", label: "🇺🇸 美东 (UTC-5)", offset: -5 }, { key: "us_west", label: "🇺🇸 美西 (UTC-8)", offset: -8 }, { key: "uk", label: "🇬🇧 英国 (UTC+0)", offset: 0 }, { key: "eu", label: "🇪🇺 中欧 (UTC+1)", offset: 1 }, ]; function tipsForDiff(absDiff: number): string[] { if (absDiff <= 2) return ["时差很小,几乎无感", "抵达当天可正常作息", "保持常规睡眠即可"]; if (absDiff <= 5) return ["建议提前 2–3 天微调作息", "抵达后当天晒太阳帮助校准", "避免落地立刻开长会"]; if (absDiff <= 8) return ["东飞更伤,预留 2–3 天恢复", "第一晚尽量睡满 7 小时", "褪黑素/镁片可辅助(遵医嘱)"]; return ["跨半球长途,预留 4–5 天缓冲", "分段飞行比直达更易恢复", "前两天安排轻量工作即可"]; } interface Props { destinations: Destination[]; } export default function JetLagEstimator({ destinations }: Props) { const [home, setHome] = useState("cn"); const [slug, setSlug] = useState(destinations[0]?.slug || "bali"); const [direction, setDirection] = useState<"east" | "west">("east"); const result = useMemo(() => { const homeOff = HOME_OFFSETS.find((h) => h.key === home)?.offset ?? 8; const destOff = TZ_OFFSET[slug] ?? 8; let diff = destOff - homeOff; if (diff > 12) diff -= 24; if (diff < -12) diff += 24; const abs = Math.abs(diff); const dir = diff >= 0 ? "east" : "west"; const recovery = Math.max(1, Math.ceil(abs / 2)); return { diff, abs, dir, recovery, tips: tipsForDiff(abs) }; }, [home, slug]); const dest = destinations.find((d) => d.slug === slug); return (
😴 JET LAG

时差恢复估算

算出时差跨度,提前安排恢复期与工作节奏

{dest?.emoji || "🌍"} {result.abs === 0 ? "无时差" : `${result.abs} 小时`} {result.diff === 0 ? "与当前时区相同" : result.diff > 0 ? `目的地快 ${result.abs} 小时` : `目的地慢 ${result.abs} 小时`}
建议恢复期 {result.recovery} 天 {(direction === "east" || result.dir === "east") && result.abs > 3 && (

向东飞行通常更难适应,可多留一天缓冲

)}
    {result.tips.map((t) =>
  • 💡 {t}
  • )}
); }