import { reactive, toRefs, computed } from 'vue' import { timerTask } from '@/utils/timer' import { queryNotice, postNoticeReaded } from '@/services/api/common' import { Language } from '@/constants/language' import { i18n } from './language' import { defineStore } from '../store' import eventBus from '@/services/bus' /** * 系统通知存储对象 */ export const useNoticeStore = defineStore(() => { const state = reactive({ loading: false, noticeList: [], // 通知列表 isInitialized: false // 是否已初始化 }) // 本地化通知列表 const localizedNoticeList = computed(() => state.noticeList.map((e) => { const localizedProperties: { [K in Language]: { [P in 'title' | 'content']: string } } = { 'zh-CN': { title: e.title, content: e.content, }, 'en-US': { title: e.titleen, content: e.contenten, }, 'th': { title: e.titleth, content: e.contentth, }, 'zh-TW': { title: e.titletw, content: e.contenttw, }, 'vi': { title: e.titlevi, content: e.contentvi, }, } const localizedValues = localizedProperties[i18n.global.locale] // 本地化语言 return { ...e, ...localizedValues } })) // 未读消息数 const unreadCount = computed(() => { return state.noticeList.reduce((count, e) => e.readed ? count : count + 1, 0) }) // 获取通知列表 const getNoticeList = async () => { try { state.loading = true timerTask.clearTimeout('systemNotice') const res = await queryNotice() state.noticeList = res.data } finally { state.loading = false state.isInitialized = true // 轮询查询系统通知 timerTask.setTimeout(() => { getNoticeList() }, 60 * 1000, 'systemNotice') } } // 更新已读 const updateNoticeReaded = (id: number) => { const item = state.noticeList.find((e) => e.autoid === id) if (item && !item.readed) { postNoticeReaded({ data: { noticeID: id, } }).then(() => { item.readed = true }) } } // 接收登入请求数据 eventBus.$on('LoginNotify', () => { getNoticeList() }) // 接收登出通知清空数据 eventBus.$on('LogoutNotify', () => { timerTask.clearTimeout('systemNotice') state.noticeList = [] state.isInitialized = false }) return { ...toRefs(state), localizedNoticeList, unreadCount, getNoticeList, updateNoticeReaded, } })