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) }, // 过滤所有免打扰对话列表 disturbItems: (state) => { return state.items.filter((item) => item.is_disturb == 1) }, // 对话列表 talkItems: (state) => { 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) => { return ttime(b.updated_at) - ttime(a.updated_at) }) listT = listT.sort((a, b) => { return ttime(b.updated_at) - ttime(a.updated_at) }) return [...listP, ...listT] }, // 消息未读数总计 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++ item.msg_text = params.msg_text 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, erp_user_id) { if (this.findTalkIndex(`${talk_type}_${receiver_id}`) >= 0) { sessionStorage.setItem(KEY_INDEX_NAME, `${talk_type}_${receiver_id}`) uni.reLaunch({ url: '/pages/index/index?openSessionIndexName=' + `${talk_type}_${receiver_id}`, }) return } ServeCreateTalkList({ talk_type, erp_user_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}`) uni.reLaunch({ url: '/pages/index/index?openSessionIndexName=' + `${talk_type}_${receiver_id}`, }) } else { message.warning(message) } }) }, }, })