| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- import { defineStore } from 'pinia';
- import { ref, computed } from 'vue';
- export interface Notification {
- id: string;
- type: 'audio_complete' | 'video_complete' | 'content_complete' | 'error';
- title: string;
- message: string;
- bookId?: string | number;
- timestamp: number;
- read: boolean;
- }
- const STORAGE_KEY = 'app_notifications';
- function loadFromStorage(): Notification[] {
- try {
- const data = uni.getStorageSync(STORAGE_KEY);
- return data ? JSON.parse(data) : [];
- } catch {
- return [];
- }
- }
- function saveToStorage(notifications: Notification[]) {
- try {
- uni.setStorageSync(STORAGE_KEY, JSON.stringify(notifications));
- } catch (e) {
- console.error('[Notification] 保存失败:', e);
- }
- }
- export const useNotificationStore = defineStore('notification', () => {
- const notifications = ref<Notification[]>(loadFromStorage());
- const unreadCount = computed(() => notifications.value.filter(n => !n.read).length);
- function add(notif: Omit<Notification, 'id' | 'timestamp' | 'read'>) {
- const id = `notif_${Date.now()}_${Math.random().toString(36).substr(2, 6)}`;
- const notification: Notification = {
- ...notif,
- id,
- timestamp: Date.now(),
- read: false,
- };
- notifications.value.unshift(notification);
- // 最多保留 50 条
- if (notifications.value.length > 50) {
- notifications.value = notifications.value.slice(0, 50);
- }
- saveToStorage(notifications.value);
- }
- function markRead(id: string) {
- const n = notifications.value.find(item => item.id === id);
- if (n) {
- n.read = true;
- saveToStorage(notifications.value);
- }
- }
- function markAllRead() {
- notifications.value.forEach(n => { n.read = true; });
- saveToStorage(notifications.value);
- }
- function remove(id: string) {
- notifications.value = notifications.value.filter(n => n.id !== id);
- saveToStorage(notifications.value);
- }
- function clear() {
- notifications.value = [];
- saveToStorage(notifications.value);
- }
- return {
- notifications,
- unreadCount,
- add,
- markRead,
- markAllRead,
- remove,
- clear,
- };
- });
|