use-conversation.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { useState } from 'react'
  2. import type { ConversationItem } from '@/models/share'
  3. import produce from 'immer'
  4. const storageConversationIdKey = 'conversationIdInfo'
  5. type ConversationInfoType = Omit<ConversationItem, 'inputs' | 'id'>
  6. function useConversation() {
  7. const [conversationList, setConversationList] = useState<ConversationItem[]>([])
  8. const [currConversationId, doSetCurrConversationId] = useState<string>('-1')
  9. // when set conversation id, we do not have set appId
  10. const setCurrConversationId = (id: string, appId: string, isSetToLocalStroge = true, newConversationName = '') => {
  11. doSetCurrConversationId(id)
  12. if (isSetToLocalStroge && id !== '-1') {
  13. // conversationIdInfo: {[appId1]: conversationId1, [appId2]: conversationId2}
  14. const conversationIdInfo = globalThis.localStorage?.getItem(storageConversationIdKey) ? JSON.parse(globalThis.localStorage?.getItem(storageConversationIdKey) || '') : {}
  15. conversationIdInfo[appId] = id
  16. globalThis.localStorage?.setItem(storageConversationIdKey, JSON.stringify(conversationIdInfo))
  17. }
  18. }
  19. const getConversationIdFromStorage = (appId: string) => {
  20. const conversationIdInfo = globalThis.localStorage?.getItem(storageConversationIdKey) ? JSON.parse(globalThis.localStorage?.getItem(storageConversationIdKey) || '') : {}
  21. const id = conversationIdInfo[appId]
  22. return id
  23. }
  24. const isNewConversation = currConversationId === '-1'
  25. // input can be updated by user
  26. const [newConversationInputs, setNewConversationInputs] = useState<Record<string, any> | null>(null)
  27. const resetNewConversationInputs = () => {
  28. if (!newConversationInputs) return
  29. setNewConversationInputs(produce(newConversationInputs, draft => {
  30. Object.keys(draft).forEach(key => {
  31. draft[key] = ''
  32. })
  33. }))
  34. }
  35. const [existConversationInputs, setExistConversationInputs] = useState<Record<string, any> | null>(null)
  36. const currInputs = isNewConversation ? newConversationInputs : existConversationInputs
  37. const setCurrInputs = isNewConversation ? setNewConversationInputs : setExistConversationInputs
  38. // info is muted
  39. const [newConversationInfo, setNewConversationInfo] = useState<ConversationInfoType | null>(null)
  40. const [existConversationInfo, setExistConversationInfo] = useState<ConversationInfoType | null>(null)
  41. const currConversationInfo = isNewConversation ? newConversationInfo : existConversationInfo
  42. return {
  43. conversationList,
  44. setConversationList,
  45. currConversationId,
  46. setCurrConversationId,
  47. getConversationIdFromStorage,
  48. isNewConversation,
  49. currInputs,
  50. newConversationInputs,
  51. existConversationInputs,
  52. resetNewConversationInputs,
  53. setCurrInputs,
  54. currConversationInfo,
  55. setNewConversationInfo,
  56. setExistConversationInfo
  57. }
  58. }
  59. export default useConversation;