// 通知类型 export type NotificationType = "success" | "error" | "warning" | "info"; export interface AppNotification { id: string; type: NotificationType; title: string; message: string; duration?: number; timestamp: Date; } // 通知管理器 class NotificationManager { private notifications: AppNotification[] = []; private listeners: ((notifications: AppNotification[]) => void)[] = []; // 添加通知 addNotification( type: NotificationType, title: string, message: string, duration: number = 5000 ): string { const id = `notification-${Date.now()}-${Math.random()}`; const notification: AppNotification = { id, type, title, message, duration, timestamp: new Date(), }; this.notifications.push(notification); this.notifyListeners(); // 自动移除通知 if (duration > 0) { setTimeout(() => { this.removeNotification(id); }, duration); } return id; } // 移除通知 removeNotification(id: string): void { this.notifications = this.notifications.filter((n) => n.id !== id); this.notifyListeners(); } // 清空所有通知 clearAll(): void { this.notifications = []; this.notifyListeners(); } // 获取所有通知 getNotifications(): AppNotification[] { return [...this.notifications]; } // 添加监听器 addListener(listener: (notifications: AppNotification[]) => void): void { this.listeners.push(listener); } // 移除监听器 removeListener(listener: (notifications: AppNotification[]) => void): void { this.listeners = this.listeners.filter((l) => l !== listener); } // 通知所有监听器 private notifyListeners(): void { this.listeners.forEach((listener) => listener(this.notifications)); } // 便捷方法 success(title: string, message: string, duration?: number): string { return this.addNotification("success", title, message, duration); } error(title: string, message: string, duration?: number): string { return this.addNotification("error", title, message, duration); } warning(title: string, message: string, duration?: number): string { return this.addNotification("warning", title, message, duration); } info(title: string, message: string, duration?: number): string { return this.addNotification("info", title, message, duration); } } // 创建全局通知管理器实例 export const notificationManager = new NotificationManager(); // 浏览器通知 API export class BrowserNotifications { static async requestPermission(): Promise { if (!("Notification" in window)) { console.warn("此浏览器不支持通知"); return false; } if (Notification.permission === "granted") { return true; } if (Notification.permission === "denied") { return false; } const permission = await Notification.requestPermission(); return permission === "granted"; } static async showNotification( title: string, options?: NotificationOptions ): Promise { if (!("Notification" in window)) { return null; } if (Notification.permission !== "granted") { const granted = await this.requestPermission(); if (!granted) { return null; } } return new globalThis.Notification(title, { icon: "/favicon.ico", badge: "/favicon.ico", ...options, }); } static async showRecordingComplete(): Promise { await this.showNotification("录音完成", { body: "您的录音已成功保存", tag: "recording-complete", }); } static async showUploadComplete(): Promise { await this.showNotification("上传完成", { body: "录音文件已成功上传到服务器", tag: "upload-complete", }); } static async showUploadError(): Promise { await this.showNotification("上传失败", { body: "录音文件上传失败,请重试", tag: "upload-error", }); } }