'use client'; import { useEffect, useRef, useState } from 'react'; import { AlertTriangle, X } from 'lucide-react'; import { SERVER_DATA_SAVE_ERROR_EVENT, type ServerDataKey, type ServerDataSaveErrorDetail, } from '@/lib/server-data'; const KEY_LABELS: Record = { 'products-overview': '产品/项目/版本', requirements: '需求池', 'version-plans': '版本计划', 'dev-tasks': '开发任务', 'test-cases': '测试用例', bugs: 'BUG', members: '成员/账号', 'task-categories': '任务类型', 'task-worklogs': '工时日志', 'work-activities': '工作动态', 'xiaobao-risk-insights': '小宝预警解读', 'xiaobao-risk-snapshots': '小宝预警快照', 'xiaobao-warning-views': '小宝预警查看状态', overtime: '加班记录', }; export function ServerDataSaveErrorBanner() { const [detail, setDetail] = useState(null); const dismissTimer = useRef(null); useEffect(() => { function clearDismissTimer() { if (!dismissTimer.current) return; window.clearTimeout(dismissTimer.current); dismissTimer.current = null; } function handleSaveError(event: Event) { const next = (event as CustomEvent).detail; if (!next?.key) return; clearDismissTimer(); setDetail(next); dismissTimer.current = window.setTimeout(() => setDetail(null), 10_000); } window.addEventListener(SERVER_DATA_SAVE_ERROR_EVENT, handleSaveError); return () => { clearDismissTimer(); window.removeEventListener(SERVER_DATA_SAVE_ERROR_EVENT, handleSaveError); }; }, []); if (!detail) return null; return (

保存失败

{KEY_LABELS[detail.key]}没有写入服务器。请检查外网 API/网络后重试,必要时刷新页面。

{detail.message && (

{detail.message}

)}
); }