feat: add carrier-aware signature retirement alerts
This commit is contained in:
@@ -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 ? (
|
||||
|
||||
Reference in New Issue
Block a user