import { useCallback, useEffect, useState } from 'react' import { useDatabase } from '../contexts/DatabaseContext' import { DBManager } from '../database/database-manager' import { ChatConversationMeta, ChatMessage } from '../types/chat' type UseChatHistory = { createOrUpdateConversation: ( id: string, messages: ChatMessage[], ) => Promise deleteConversation: (id: string) => Promise getChatMessagesById: (id: string) => Promise updateConversationTitle: (id: string, title: string) => Promise chatList: ChatConversationMeta[] } export function useChatHistory(): UseChatHistory { const { getDatabaseManager } = useDatabase() // 这里更新有点繁琐, 但是能保持 chatList 实时更新 const [chatList, setChatList] = useState([]) const getManager = useCallback(async (): Promise => { return await getDatabaseManager() }, [getDatabaseManager]) const fetchChatList = useCallback(async () => { const dbManager = await getManager() dbManager.getConversationManager().getAllConversations((conversations) => { setChatList(conversations) }) }, [getManager]) useEffect(() => { void fetchChatList() }, [fetchChatList]) const createOrUpdateConversation = useCallback( async (id: string, messages: ChatMessage[]): Promise => { const dbManager = await getManager() const conversationManager = dbManager.getConversationManager() await conversationManager.txCreateOrUpdateConversation(id, messages) }, [getManager], ) const deleteConversation = useCallback( async (id: string): Promise => { const dbManager = await getManager() const conversationManager = dbManager.getConversationManager() await conversationManager.deleteConversation(id) }, [getManager], ) const getChatMessagesById = useCallback( async (id: string): Promise => { const dbManager = await getManager() const conversationManager = dbManager.getConversationManager() return await conversationManager.findConversation(id) }, [getManager], ) const updateConversationTitle = useCallback( async (id: string, title: string): Promise => { const dbManager = await getManager() const conversationManager = dbManager.getConversationManager() await conversationManager.updateConversationTitle(id, title) }, [getManager], ) return { createOrUpdateConversation, deleteConversation, getChatMessagesById, updateConversationTitle, chatList, } }