import { defineStore } from 'pinia' import { useDialogueStore } from '@/store' import lodash from 'lodash' import { ref } from 'vue' import { createGlobalState, useStorage } from '@vueuse/core' import { uniStorage } from '@/utils/uniStorage.js' export const useDialogueListStore = createGlobalState(() => { // const dialogueList = useStorage('dialogueList', [], uniStorage) const dialogueList = ref([]) const zpagingRef = ref() const virtualList = ref([]) const getDialogueList = (indexName) => { return dialogueList.value.find((item) => item.index_name === indexName) } const addDialogueRecord = (newRecords, type = 'add') => { console.log(newRecords) const dialogue = lodash.cloneDeep(useDialogueStore()) if (!dialogue || typeof dialogue !== 'object') return // 检查是否已存在相同 index_name 的对话 const existingIndex = dialogueList.value.findIndex( (item) => item.index_name === dialogue.index_name, ) if (existingIndex === -1) { // 如果不存在,直接添加 dialogueList.value.push(dialogue) } else { // 如果对话存在,处理 records 数组 const { records = [] } = dialogue newRecords.forEach((newRecord) => { const recordIndex = dialogueList.value[existingIndex].records.findIndex( (record) => record.msg_id === newRecord.msg_id, ) if (recordIndex === -1) { // 如果记录不存在,添加到 records 数组 if (type === 'add') { dialogueList.value[existingIndex].records.push(newRecord) } else { dialogueList.value[existingIndex].records.unshift(newRecord) } } }) // 更新除 records 和 index_name 外的其他属性 const { index_name, records: _, ...updateProps } = dialogue dialogueList.value[existingIndex] = { ...dialogueList.value[existingIndex], ...updateProps, } } } const updateDialogueRecord = (record) => { const dialogue = lodash.cloneDeep(useDialogueStore()) const item = getDialogueList(dialogue.index_name) const recordIndex = item.records.findIndex( (item) => item.msg_id === record.msg_id, ) if (recordIndex !== -1) { item.records[recordIndex] = { ...item.records[recordIndex], ...record, } } const virtualIndex = virtualList.value.findIndex( (item) => item.msg_id === record.msg_id, ) if (virtualIndex !== -1) { virtualList.value[virtualIndex] = { ...virtualList.value[virtualIndex], ...record, } } } const deleteDialogueRecord = (record) => { const dialogue = lodash.cloneDeep(useDialogueStore()) const item = getDialogueList(dialogue.index_name) const recordIndex = item.records.findIndex( (item) => item.msg_id === record.msg_id, ) if (recordIndex !== -1) { item.records.splice(recordIndex, 1) } } const updateUploadProgress = (id, progress) => { const record = virtualList.value.find((item) => item.msg_id === id) if (record) { record.uploadCurrent = progress } } const updateZpagingRef = (params) => { zpagingRef.value = params } const zpagingComplete = (index_name, newRecords) => { zpagingRef.value?.complete(lodash.cloneDeep(newRecords).reverse()) } const addChatRecord = (indexName, item) => { const dialogue = lodash.cloneDeep(useDialogueStore()) if (dialogue?.index_name === indexName) { const index = virtualList.value.findIndex( (v) => v?.file_num === item?.file_num, ) if (index > -1) { // 保持响应性的同时替换整个对象 virtualList.value.splice(index, 1, { ...virtualList.value[index], // 保留原有不需要修改的字段 ...item, // 覆盖需要更新的字段 }) } else { zpagingRef.value?.addChatRecordData(item, false, false) } } } const batchDelDialogueRecord = (msgIds) => { const dialogue = lodash.cloneDeep(useDialogueStore()) const item = getDialogueList(dialogue.index_name) item.records = item.records.filter((item) => !msgIds.includes(item.msg_id)) } //删除会话时,同时刪除storage中存儲的會話 const delDialogueStorage = (indexName) => { if (dialogueList?.value?.length > 0) { dialogueList.value.forEach((item, index) => { if (item?.index_name === indexName) { dialogueList.value.splice(index, 1) } }) } } //清空聊天记录时,同时清空本地保存的聊天记录 const clearDialogueRecord = () => { const dialogue = lodash.cloneDeep(useDialogueStore()) const item = getDialogueList(dialogue.index_name) item.records = [] virtualList.value = [] } return { dialogueList, zpagingRef, getDialogueList, addDialogueRecord, updateDialogueRecord, deleteDialogueRecord, updateUploadProgress, updateZpagingRef, zpagingComplete, addChatRecord, virtualList, batchDelDialogueRecord, delDialogueStorage, clearDialogueRecord, } })