chat-app/src/store/modules/dialogueList.js

169 lines
5.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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) {
if (item?.file_num) {
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,
}
})