first
This commit is contained in:
112
src/stores/modules/message.ts
Normal file
112
src/stores/modules/message.ts
Normal file
@@ -0,0 +1,112 @@
|
||||
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,
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user