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

156 lines
4.0 KiB
JavaScript
Raw Normal View History

2024-11-20 01:17:47 +00:00
import { defineStore } from 'pinia'
import { ServeGetTalkList, ServeCreateTalkList } from '@/api/chat/index'
import { formatTalkItem, ttime, KEY_INDEX_NAME } from '@/utils/talk'
import { useEditorDraftStore } from './editor-draft'
// import { ISession } from '@/types/chat'
export const useTalkStore = defineStore('talk', {
state: () => {
return {
// 加载状态[1:未加载;2:加载中;3:加载完成;4:加载失败;]
loadStatus: 2,
// 会话列表
items: []
}
},
getters: {
// 过滤所有置顶对话列表
topItems: (state) => {
return state.items.filter((item) => item.is_top == 1)
},
// 对话列表
talkItems: (state) => {
2024-11-22 01:06:37 +00:00
let topList = state.items.filter((item) => item.is_top == 1)
let listT = state.items.filter(v=>v.is_top !== 1)
let listP = topList.sort((a, b) => {
2024-11-20 01:17:47 +00:00
return ttime(b.updated_at) - ttime(a.updated_at)
})
2024-11-22 01:06:37 +00:00
listT = listT.sort((a, b) => {
return ttime(b.updated_at) - ttime(a.updated_at)
})
return [...listP,...listT]
2024-11-20 01:17:47 +00:00
},
// 消息未读数总计
talkUnreadNum: (state) => {
return state.items.reduce((total, item) => {
return total + item.unread_num
}, 0)
}
},
actions: {
findItem(index_name) {
return this.items.find((item) => item.index_name === index_name)
},
// 更新对话节点
updateItem(params) {
const item = this.items.find((item) => item.index_name === params.index_name)
item && Object.assign(item, params)
},
// 新增对话节点
addItem(params) {
this.items = [params, ...this.items]
},
// 移除对话节点
delItem(index_name) {
const i = this.items.findIndex((item) => item.index_name === index_name)
if (i >= 0) {
this.items.splice(i, 1)
}
this.items = [...this.items]
},
// 更新对话消息
updateMessage(params) {
const item = this.items.find((item) => item.index_name === params.index_name)
if (item) {
item.unread_num++
2024-11-22 01:06:37 +00:00
item.msg_text = params.msg_text
2024-11-20 01:17:47 +00:00
item.updated_at = params.updated_at
}
},
// 更新联系人备注
setRemark(params) {
const item = this.items.find((item) => item.index_name === `1_${params.user_id}`)
item && (item.remark = params.remark)
},
// 加载会话列表
loadTalkList() {
this.loadStatus = 2
const resp = ServeGetTalkList()
resp.then(({ code, data }) => {
if (code == 200) {
this.items = data.items.map((item) => {
const value = formatTalkItem(item)
const draft = useEditorDraftStore().items[value.index_name]
if (draft) {
value.draft_text = JSON.parse(draft).text || ''
}
if (value.is_robot == 1) {
value.is_online = 1
}
return value
})
this.loadStatus = 3
} else {
this.loadStatus = 4
}
})
resp.catch(() => {
this.loadStatus = 4
})
},
findTalkIndex(index_name) {
return this.items.findIndex((item) => item.index_name === index_name)
},
toTalk(talk_type, receiver_id, router) {
const route = {
path: '/message',
query: {
v: new Date().getTime()
}
}
if (this.findTalkIndex(`${talk_type}_${receiver_id}`) >= 0) {
sessionStorage.setItem(KEY_INDEX_NAME, `${talk_type}_${receiver_id}`)
return router.push(route)
}
ServeCreateTalkList({
talk_type,
receiver_id
}).then(({ code, data, message }) => {
if (code == 200) {
if (this.findTalkIndex(`${talk_type}_${receiver_id}`) === -1) {
this.addItem(formatTalkItem(data))
}
sessionStorage.setItem(KEY_INDEX_NAME, `${talk_type}_${receiver_id}`)
return router.push(route)
} else {
2024-11-28 08:55:45 +00:00
message.warning(message)
2024-11-20 01:17:47 +00:00
}
})
}
}
})