VetNet-LCPS / vetcopilot-app /src /hooks /useActivityLog.ts
thomasm291678
VetCopilot-LCPS: LCPS 2.0 本地推理引擎替换 DeepSeek API
793e953
Raw History Blame Contribute Delete
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 }
}