28 lines
1.6 KiB
TypeScript
28 lines
1.6 KiB
TypeScript
/**
|
|
* 应用级反馈设施:提供共享Tooltip时间参数与通知挂载点。
|
|
* 这个模块只负责提示的呈现环境,任务进度、错误事实和通知触发仍由业务调用方管理。
|
|
*/
|
|
"use client";
|
|
|
|
import { createContext, type ReactNode } from "react";
|
|
import * as Tooltip from "@radix-ui/react-tooltip";
|
|
import { Toaster } from "sonner";
|
|
|
|
/** 默认false使独立挂载的IconButton退回原生title;只有AppFeedback子树启用统一浮层提示。 */
|
|
export const FeedbackContext = createContext(false);
|
|
|
|
/** 包住页面一次即可共享提示延迟;400ms首次出现,200ms内切换提示可跳过等待。
|
|
* Toaster放在右下角,最多展示三条通知,默认4500ms消失并允许关闭;颜色读取主题变量。
|
|
* children正常透传,本组件不订阅文档、队列或服务端状态。
|
|
* visibleToasts 限制同时可见数量,不是业务事件队列容量;通知创建/撤销仍通过通知适配器调用。 */
|
|
export function AppFeedback({ children }: { children: ReactNode }) {
|
|
return <FeedbackContext.Provider value={true}>
|
|
<Tooltip.Provider delayDuration={400} skipDelayDuration={200}>
|
|
{children}
|
|
<Toaster position="bottom-right" closeButton visibleToasts={3} duration={4500}
|
|
offset={{ bottom: 24, right: 20 }} containerAriaLabel="操作通知"
|
|
toastOptions={{ closeButtonAriaLabel: "关闭通知", style: { background: "var(--popover, #fffcf9)", color: "var(--popover-foreground, #38281f)", border: "1px solid var(--border, #ded5cc)" } }} />
|
|
</Tooltip.Provider>
|
|
</FeedbackContext.Provider>;
|
|
}
|