import { useCallback, useState } from 'react' import produce from 'immer' import { useGetState } from 'ahooks' import type { ConversationItem } from '@/models/share' const storageConversationIdKey = 'conversationIdInfo' type ConversationInfoType = Omit function useConversation() { const [conversationList, setConversationList] = useState([]) const [pinnedConversationList, setPinnedConversationList] = useState([]) const [currConversationId, doSetCurrConversationId, getCurrConversationId] = useGetState('-1') // when set conversation id, we do not have set appId const setCurrConversationId = useCallback((id: string, appId: string, isSetToLocalStroge = true, newConversationName = '') => { doSetCurrConversationId(id) if (isSetToLocalStroge && id !== '-1') { // conversationIdInfo: {[appId1]: conversationId1, [appId2]: conversationId2} const conversationIdInfo = globalThis.localStorage?.getItem(storageConversationIdKey) ? JSON.parse(globalThis.localStorage?.getItem(storageConversationIdKey) || '') : {} conversationIdInfo[appId] = id globalThis.localStorage?.setItem(storageConversationIdKey, JSON.stringify(conversationIdInfo)) } }, [doSetCurrConversationId]) const getConversationIdFromStorage = (appId: string) => { const conversationIdInfo = globalThis.localStorage?.getItem(storageConversationIdKey) ? JSON.parse(globalThis.localStorage?.getItem(storageConversationIdKey) || '') : {} const id = conversationIdInfo[appId] return id } const isNewConversation = currConversationId === '-1' // input can be updated by user const [newConversationInputs, setNewConversationInputs] = useState | null>(null) const resetNewConversationInputs = () => { if (!newConversationInputs) return setNewConversationInputs(produce(newConversationInputs, (draft) => { Object.keys(draft).forEach((key) => { draft[key] = '' }) })) } const [existConversationInputs, setExistConversationInputs] = useState | null>(null) const currInputs = isNewConversation ? newConversationInputs : existConversationInputs const setCurrInputs = isNewConversation ? setNewConversationInputs : setExistConversationInputs // info is muted const [newConversationInfo, setNewConversationInfo] = useState(null) const [existConversationInfo, setExistConversationInfo] = useState(null) const currConversationInfo = isNewConversation ? newConversationInfo : existConversationInfo return { conversationList, setConversationList, pinnedConversationList, setPinnedConversationList, currConversationId, getCurrConversationId, setCurrConversationId, getConversationIdFromStorage, isNewConversation, currInputs, newConversationInputs, existConversationInputs, resetNewConversationInputs, setCurrInputs, currConversationInfo, setNewConversationInfo, existConversationInfo, setExistConversationInfo, } } export default useConversation