Files
mai-bot/dashboard/src/routes/monitor/use-monitor.ts
2026-01-13 06:24:35 +08:00

79 lines
2.1 KiB
TypeScript

/**
* 监控页面共享工具和钩子
*/
import { useState, useEffect, useCallback } from 'react'
import { getChatList } from '@/lib/expression-api'
import type { ChatInfo } from '@/types/expression'
/**
* 聊天名称映射 Hook
* 从表达方式 API 获取聊天列表,构建 chat_id -> chat_name 映射
*/
export function useChatNameMap() {
const [chatNameMap, setChatNameMap] = useState<Map<string, string>>(new Map())
const [loading, setLoading] = useState(true)
const loadChatNameMap = useCallback(async () => {
try {
setLoading(true)
const response = await getChatList()
if (response?.data) {
const nameMap = new Map<string, string>()
response.data.forEach((chat: ChatInfo) => {
nameMap.set(chat.chat_id, chat.chat_name)
})
setChatNameMap(nameMap)
}
} catch (error) {
console.error('加载聊天列表失败:', error)
} finally {
setLoading(false)
}
}, [])
useEffect(() => {
loadChatNameMap()
}, [loadChatNameMap])
const getChatName = useCallback((chatId: string): string => {
return chatNameMap.get(chatId) || chatId
}, [chatNameMap])
return { chatNameMap, getChatName, loading, reload: loadChatNameMap }
}
/**
* 格式化时间戳为本地时间字符串
*/
export function formatTimestamp(timestamp: number): string {
return new Date(timestamp * 1000).toLocaleString('zh-CN')
}
/**
* 格式化时间戳为相对时间
*/
export function formatRelativeTime(timestamp: number): string {
const now = Date.now() / 1000
const diff = now - timestamp
if (diff < 60) return '刚刚'
if (diff < 3600) return `${Math.floor(diff / 60)} 分钟前`
if (diff < 86400) return `${Math.floor(diff / 3600)} 小时前`
return `${Math.floor(diff / 86400)} 天前`
}
/**
* 自动刷新 Hook
*/
export function useAutoRefresh(
enabled: boolean,
callback: () => void,
interval: number = 10000
) {
useEffect(() => {
if (!enabled) return
const timer = setInterval(callback, interval)
return () => clearInterval(timer)
}, [enabled, callback, interval])
}