Files
cz-web/src/stores/modules/message.ts
wangzzpeng 7bc84bbe5e first
2026-09-24 10:10:43 +08:00

113 lines
2.8 KiB
TypeScript

import { defineStore } from 'pinia'
import { ref } from 'vue'
import { ElMessage } from 'element-plus'
import type { PageResult } from '@/types/api'
import type { Message, MessageQuery } from '@/types/business/message'
import {
getMessageDetail,
getMessageList,
getTabCounts,
getUnreadCount,
markAllRead as markAllReadApi,
markRead as markReadApi,
} from '@/api/message'
/** tab 计数结构 */
export interface MessageTabCounts {
all: number
在线客服: number
状态通知: number
系统通知: number
}
function createDefaultQuery(): MessageQuery {
return {
keyword: '',
type: 'all',
page: 1,
pageSize: 10,
}
}
/** 消息中心数据(列表 / 筛选 / 分页 / 已读) */
export const useMessageStore = defineStore('message', () => {
const query = ref<MessageQuery>(createDefaultQuery())
const list = ref<Message[]>([])
const total = ref(0)
const current = ref<Message | null>(null)
const unreadCount = ref(0)
const tabCounts = ref<MessageTabCounts>({ all: 0, 在线客服: 0, 状态通知: 0, 系统通知: 0 })
async function fetchList(): Promise<void> {
const result: PageResult<Message> = await getMessageList(query.value)
list.value = result.list
total.value = result.total
}
async function fetchDetail(id: string): Promise<void> {
const detail = await getMessageDetail(id)
current.value = detail
if (detail && !detail.isRead) {
await markReadApi(id)
detail.isRead = true
if (unreadCount.value > 0) unreadCount.value -= 1
await fetchTabCounts()
}
}
function setQuery(next: MessageQuery): void {
query.value = next
}
/** 确定搜索(重置页码后取数) */
async function search(): Promise<void> {
query.value = { ...query.value, page: 1 }
await fetchList()
}
/** 重置全部条件 */
async function resetQuery(): Promise<void> {
query.value = createDefaultQuery()
await fetchList()
}
async function changePage(page: number): Promise<void> {
query.value = { ...query.value, page }
await fetchList()
}
/** 全部标记已读 */
async function markAllRead(): Promise<void> {
await markAllReadApi()
ElMessage.success('已全部标记为已读')
await Promise.all([fetchList(), fetchUnreadCount(), fetchTabCounts()])
if (current.value) current.value.isRead = true
}
async function fetchUnreadCount(): Promise<void> {
unreadCount.value = await getUnreadCount()
}
async function fetchTabCounts(): Promise<void> {
tabCounts.value = await getTabCounts()
}
return {
query,
list,
total,
current,
unreadCount,
tabCounts,
fetchList,
fetchDetail,
setQuery,
search,
resetQuery,
changePage,
markAllRead,
fetchUnreadCount,
fetchTabCounts,
}
})