use-conversation.ts 2.9 KB

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