// useToast — 统一委托到全局 sonner ,确保提示真实可见。// Logan.Li // // 历史问题:早期版本把 toast 存在 hook 内的局部 state 并返回 toasts 数组, // 但没有任何页面渲染该数组(全局只挂载了 sonner 的 ), // 导致所有 useToast() 调用产生的提示都是隐形的(表现为"保存没反应")。 // 现统一转发到 sonner,保持返回值结构兼容既有调用方。// Logan.Li import { useCallback } from 'react'; import { toast as sonnerToast } from 'sonner'; export interface ToastOptions { title: string; description?: string; variant?: 'default' | 'destructive'; } interface UseToastReturn { toast: (opts: ToastOptions) => void; toasts: never[]; dismiss: (id: string) => void; } export function useToast(): UseToastReturn { const toast = useCallback((opts: ToastOptions) => { const { title, description, variant } = opts; if (variant === 'destructive') { sonnerToast.error(title, { description }); } else { sonnerToast.success(title, { description }); } }, []); // sonner 自带 dismiss 能力,此处保留空实现以兼容既有解构。// Logan.Li const dismiss = useCallback(() => {}, []); return { toast, toasts: [], dismiss }; }