12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- 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<ConversationItem, 'inputs' | 'id'>
- function useConversation() {
- const [conversationList, setConversationList] = useState<ConversationItem[]>([])
- const [pinnedConversationList, setPinnedConversationList] = useState<ConversationItem[]>([])
- const [currConversationId, doSetCurrConversationId, getCurrConversationId] = useGetState<string>('-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<Record<string, any> | null>(null)
- const resetNewConversationInputs = () => {
- if (!newConversationInputs)
- return
- setNewConversationInputs(produce(newConversationInputs, (draft) => {
- Object.keys(draft).forEach((key) => {
- draft[key] = ''
- })
- }))
- }
- const [existConversationInputs, setExistConversationInputs] = useState<Record<string, any> | null>(null)
- const currInputs = isNewConversation ? newConversationInputs : existConversationInputs
- const setCurrInputs = isNewConversation ? setNewConversationInputs : setExistConversationInputs
- // info is muted
- const [newConversationInfo, setNewConversationInfo] = useState<ConversationInfoType | null>(null)
- const [existConversationInfo, setExistConversationInfo] = useState<ConversationInfoType | null>(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
|