Download vetcopilot-app/src/hooks/useActivityLog.ts from WWsCa/VetNet-LCPS: direct link, hf CLI and curl.
- Browser
- Download file 3.06 kB
-
https://huggingface.co/WWsCa/VetNet-LCPS/resolve/main/vetcopilot-app/src/hooks/useActivityLog.ts
- Command line
-
hf download hf://WWsCa/VetNet-LCPS/vetcopilot-app/src/hooks/useActivityLog.ts
-
curl -L -o useActivityLog.ts https://huggingface.co/WWsCa/VetNet-LCPS/resolve/main/vetcopilot-app/src/hooks/useActivityLog.ts
3.06 kB
| /** | |
| * useActivityLog Hook | |
| * | |
| * 记录用户最近操作到 localStorage,最多保存 20 条。 | |
| * 每条包含:操作描述、时间戳、图标。可用于 Header 用户菜单中的"最近操作"展示。 | |
| * | |
| * 用法: | |
| * const { activities, addActivity, clearActivities } = useActivityLog() | |
| * | |
| * // 记录操作 | |
| * addActivity('新建问诊', '📝') | |
| * | |
| * // 展示最近操作 | |
| * activities.slice(0, 5).map(a => <ActivityItem key={a.id} {...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<ActivityLogEntry[]>(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 } | |
| } | |