feat: add carrier-aware signature retirement alerts

This commit is contained in:
hectorzhao
2026-08-10 20:54:05 +08:00
parent 232d1c22a3
commit 55aa054005
52 changed files with 3074 additions and 152 deletions
+15 -1
View File
@@ -2,6 +2,7 @@ import type { ComponentType } from 'react';
import { useEffect, useMemo, useRef, useState } from 'react';
import {
Bell,
ClipboardList,
ChevronDown,
ChevronRight,
CircleHelp,
@@ -59,6 +60,7 @@ type AppShellProps = {
userRole: string;
navSections: ShellNavSection[];
auditNotifications?: AuditNotificationItem[];
retirementAlert?: { count: number; to: string };
onSessionLockedChange?: (locked: boolean) => void;
};
@@ -71,6 +73,7 @@ export function AppShell({
userRole,
navSections,
auditNotifications = [],
retirementAlert,
onSessionLockedChange,
}: AppShellProps) {
const [collapsed, setCollapsed] = useState(false);
@@ -414,6 +417,17 @@ export function AppShell({
<button className="icon-button topbar-help" type="button" aria-label="帮助中心">
<CircleHelp size={18} />
</button>
{retirementAlert ? (
<Link
aria-label={`今日未读且未抑制签名清退预警 ${retirementAlert.count}`}
className={['icon-button', retirementAlert.count > 0 ? 'has-dot' : ''].filter(Boolean).join(' ')}
title="今日未读且未抑制签名清退预警"
to={retirementAlert.to}
>
<Bell size={18} />
{retirementAlert.count > 0 ? <span className="notice-count">{retirementAlert.count}</span> : null}
</Link>
) : null}
<div className="notice-menu-wrap">
<button
aria-expanded={noticeOpen}
@@ -423,7 +437,7 @@ export function AppShell({
type="button"
aria-label="通知"
>
<Bell size={18} />
<ClipboardList size={18} />
{auditTotal > 0 ? <span className="notice-count">{auditTotal}</span> : null}
</button>
{noticeOpen ? (