fix: 修复右键菜单功能的多个逻辑漏洞

1. 修复时区硬编码问题 - 使用用户选择的时区而非固定 Asia/Shanghai
2. 修复 openPopup() 失败后数据残留 - 失败时清除 storage 中的待处理数据
3. 统一数据过期时间常量 - 导出 CONTEXT_MENU_DATA_EXPIRY_MS 并统一使用
4. 修复 featureKey 类型断言不安全 - 使用映射表处理非常规菜单 ID
This commit is contained in:
雨霖铃
2026-05-20 21:39:33 +08:00
parent e9a6fa3dd8
commit 0427f16cc9
5 changed files with 62 additions and 45 deletions
+35 -32
View File
@@ -74,41 +74,44 @@ export function useTimestampConverter(): UseTimestampConverterReturn {
}, [mode, tsInput, dtInput, unit, zone, t]);
// 处理右键菜单传递的数据
const handleContextMenuData = useCallback((payload: string) => {
const trimmed = payload.trim();
if (isTimestampLike(trimmed)) {
// 看起来是时间戳,切换到 ts2dt 模式
setMode('ts2dt');
setTsInput(trimmed);
// 如果是 13 位毫秒级时间戳,自动选择 ms 单位
const detectedUnit: UnitType = trimmed.length >= 13 ? 'ms' : 's';
setUnit(detectedUnit);
// 直接执行转换
const num = Number(trimmed);
if (!isNaN(num)) {
const d = detectedUnit === 'ms' ? dayjs(num) : dayjs.unix(num);
if (d.isValid()) {
setError('');
setResult(d.tz('Asia/Shanghai').format(DATE_FORMAT));
}
}
} else {
// 尝试作为日期时间解析
const d = dayjs(trimmed);
if (d.isValid()) {
setMode('dt2ts');
setDtInput(d.format(DATE_FORMAT));
// 直接执行转换
const ms = d.valueOf();
setError('');
setResult(String(ms));
} else {
// 无法识别,作为时间戳处理
const handleContextMenuData = useCallback(
(payload: string) => {
const trimmed = payload.trim();
if (isTimestampLike(trimmed)) {
// 看起来是时间戳,切换到 ts2dt 模式
setMode('ts2dt');
setTsInput(trimmed);
// 如果是 13 位毫秒级时间戳,自动选择 ms 单位
const detectedUnit: UnitType = trimmed.length >= 13 ? 'ms' : 's';
setUnit(detectedUnit);
// 直接执行转换
const num = Number(trimmed);
if (!isNaN(num)) {
const d = detectedUnit === 'ms' ? dayjs(num) : dayjs.unix(num);
if (d.isValid()) {
setError('');
setResult(d.tz(zone).format(DATE_FORMAT));
}
}
} else {
// 尝试作为日期时间解析
const d = dayjs(trimmed);
if (d.isValid()) {
setMode('dt2ts');
setDtInput(d.format(DATE_FORMAT));
// 直接执行转换
const ms = d.valueOf();
setError('');
setResult(String(ms));
} else {
// 无法识别,作为时间戳处理
setMode('ts2dt');
setTsInput(trimmed);
}
}
}
}, []);
},
[zone],
);
useContextMenuData({ featureKey: 'timestamp', onData: handleContextMenuData });