/** * useActivityLog Hook * * 记录用户最近操作到 localStorage,最多保存 20 条。 * 每条包含:操作描述、时间戳、图标。可用于 Header 用户菜单中的"最近操作"展示。 * * 用法: * const { activities, addActivity, clearActivities } = useActivityLog() * * // 记录操作 * addActivity('新建问诊', '📝') * * // 展示最近操作 * activities.slice(0, 5).map(a => ) */ import { useState, useCallback, useEffect } from 'react' // ================================================================ // 类型定义 // ================================================================ export interface ActivityLogEntry { /** 唯一标识 */ id: string /** 操作描述 */ description: string /** 图标(emoji 或 icon 名称) */ icon: string /** 时间戳 */ timestamp: number } // ================================================================ // 常量 // ================================================================ const STORAGE_KEY = 'vetcopilot_activity_log' const MAX_ENTRIES = 20 // ================================================================ // 工具函数 // ================================================================ function loadFromStorage(): ActivityLogEntry[] { try { const raw = localStorage.getItem(STORAGE_KEY) if (!raw) return [] const parsed = JSON.parse(raw) if (Array.isArray(parsed)) return parsed as ActivityLogEntry[] } catch { // 数据损坏,清除 } return [] } function saveToStorage(entries: ActivityLogEntry[]): void { try { localStorage.setItem(STORAGE_KEY, JSON.stringify(entries)) } catch { // storage full or unavailable } } function generateId(): string { return `act_${Date.now()}_${Math.random().toString(36).slice(2, 8)}` } // ================================================================ // Hook // ================================================================ interface UseActivityLogReturn { /** 最近操作列表(最新在前) */ activities: ActivityLogEntry[] /** 添加一条操作记录 */ addActivity: (description: string, icon?: string) => void /** 清除所有记录 */ clearActivities: () => void } export function useActivityLog(): UseActivityLogReturn { const [activities, setActivities] = useState(loadFromStorage) // 初始化时从 storage 加载 useEffect(() => { setActivities(loadFromStorage()) }, []) const addActivity = useCallback((description: string, icon: string = '') => { setActivities((prev) => { const entry: ActivityLogEntry = { id: generateId(), description, icon, timestamp: Date.now(), } const next = [entry, ...prev].slice(0, MAX_ENTRIES) saveToStorage(next) return next }) }, []) const clearActivities = useCallback(() => { setActivities([]) localStorage.removeItem(STORAGE_KEY) }, []) return { activities, addActivity, clearActivities } }