Files
testing-tool/pages/Timestamp/LiveClock.tsx
T
雨霖铃 de7da9f1db fix: 修复暗黑模式样式兼容性
- 在 tailwind.config.js 中启用 darkMode: 'class' 并扩展语义化颜色变量
- 将全项目硬编码颜色(bg-white、text-gray-*、border-gray-* 等)替换为语义化类名
- 修复 popup/index.html 硬编码浅色背景色
- 同步更新相关单元测试中的类名断言
2026-05-22 16:04:50 +08:00

67 lines
2.2 KiB
TypeScript

import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { Clock } from 'lucide-react';
import CopyButton from '@/components/CopyButton';
import { useSnackbar } from '@/components/GlobalSnackbar';
import type { UnitType } from '@/config/pageTheme';
import { timestampPageStyles } from '@/config/pageTheme';
import { useLazyTranslation } from '@/utils/useLazyTranslation';
interface LiveClockProps {
unit: UnitType;
onUseNow: (val: number) => void;
}
const LiveClock = React.memo(({ unit, onUseNow }: LiveClockProps) => {
const [now, setNow] = useState(() => Date.now());
const { t } = useLazyTranslation('timestamp');
const { showMessage } = useSnackbar();
const onUseNowRef = useRef(onUseNow);
useEffect(() => {
onUseNowRef.current = onUseNow;
}, [onUseNow]);
useEffect(() => {
const tickId = setInterval(() => setNow(Date.now()), 1000);
return () => clearInterval(tickId);
}, []);
const displayVal = useMemo(
() => String(Math.floor(now / (unit === 'ms' ? 1 : 1000))),
[now, unit],
);
const handleUseNow = useCallback(() => {
onUseNowRef.current(now);
showMessage(t('timestamp:usedSuccess'), { severity: 'success' });
}, [now, showMessage, t]);
return (
<div className="flex items-center gap-3 px-4 py-2 mb-4 bg-primary/10 rounded-lg border border-primary/20">
<span className="text-primary font-bold text-[0.65rem] uppercase tracking-wider whitespace-nowrap">
{t('timestamp:currentTs')}
</span>
<span className="flex-1 font-mono font-bold text-primary text-sm tracking-tight leading-tight overflow-hidden text-ellipsis">
{displayVal}
</span>
<button
onClick={handleUseNow}
title={t('timestamp:useNowTooltip')}
className="p-1.5 rounded-md bg-background text-primary shadow-sm hover:bg-blue-700 hover:text-white transition-colors"
>
<Clock className="w-4 h-4" />
</button>
<CopyButton
text={displayVal}
tooltip={t('timestamp:copyTsTooltip')}
size="small"
color={timestampPageStyles.primaryColor}
/>
</div>
);
});
LiveClock.displayName = 'LiveClock';
export default LiveClock;