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

163 lines
4.2 KiB
JavaScript

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)
}
})
},
},
})