import React, { useEffect, useRef, useState } from 'react' import { ChevronDownIcon, ClockIcon } from './Icons' import { TIMEZONES, TIMEZONE_STORAGE_KEY, findTimeZone, formatDateIn, formatOffsetIn, formatTimeIn, readStoredTimeZone } from '../timezones' /** * 顶栏时钟:显示所选时区的时间,点一下可以换时区。 * * 时间由父组件每秒 tick 后以 now 传入 —— 顶栏本来就在跑秒表, * 这里不再自己起一个 interval,避免同一屏里两个定时器各跳各的。 */ function TimeZoneClock({ now }) { const [zoneKey, setZoneKey] = useState(readStoredTimeZone) const [open, setOpen] = useState(false) const boxRef = useRef(null) const listRef = useRef(null) const zone = findTimeZone(zoneKey) useEffect(() => { try { localStorage.setItem(TIMEZONE_STORAGE_KEY, zoneKey) } catch { /* 忽略 */ } }, [zoneKey]) /* 列表比可视区高,打开时滚到当前选中的那一条,否则要自己翻半天找 */ useEffect(() => { if (!open) return const active = listRef.current?.querySelector('.clock-zone-item.active') active?.scrollIntoView({ block: 'nearest' }) }, [open]) useEffect(() => { if (!open) return const onPointerDown = event => { if (!boxRef.current?.contains(event.target)) setOpen(false) } const onKeyDown = event => { if (event.key === 'Escape') setOpen(false) } document.addEventListener('mousedown', onPointerDown) window.addEventListener('keydown', onKeyDown) return () => { document.removeEventListener('mousedown', onPointerDown) window.removeEventListener('keydown', onKeyDown) } }, [open]) const time = formatTimeIn(now, zone.key) const date = formatDateIn(now, zone.key) return (