notice.ts 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import { reactive, toRefs, computed } from 'vue'
  2. import { timerTask } from '@/utils/timer'
  3. import { queryNotice, postNoticeReaded } from '@/services/api/common'
  4. import { Language } from '@/constants/language'
  5. import { i18n } from './language'
  6. import { defineStore } from '../store'
  7. import eventBus from '@/services/bus'
  8. /**
  9. * 系统通知存储对象
  10. */
  11. export const useNoticeStore = defineStore(() => {
  12. const state = reactive({
  13. loading: false,
  14. noticeList: <Model.NoticeRsp[]>[], // 通知列表
  15. isInitialized: false // 是否已初始化
  16. })
  17. // 本地化通知列表
  18. const localizedNoticeList = computed<Model.NoticeRsp[]>(() => state.noticeList.map((e) => {
  19. const localizedProperties: { [K in Language]: { [P in 'title' | 'content']: string } } = {
  20. 'zh-CN': { title: e.title, content: e.content, },
  21. 'en-US': { title: e.titleen, content: e.contenten, },
  22. 'th': { title: e.titleth, content: e.contentth, },
  23. 'zh-TW': { title: e.titletw, content: e.contenttw, },
  24. 'vi': { title: e.titlevi, content: e.contentvi, },
  25. }
  26. const localizedValues = localizedProperties[i18n.global.locale] // 本地化语言
  27. return {
  28. ...e,
  29. ...localizedValues
  30. }
  31. }))
  32. // 未读消息数
  33. const unreadCount = computed(() => {
  34. return state.noticeList.reduce((count, e) => e.readed ? count : count + 1, 0)
  35. })
  36. // 获取通知列表
  37. const getNoticeList = async () => {
  38. try {
  39. state.loading = true
  40. timerTask.clearTimeout('systemNotice')
  41. const res = await queryNotice()
  42. state.noticeList = res.data
  43. } finally {
  44. state.loading = false
  45. state.isInitialized = true
  46. // 轮询查询系统通知
  47. timerTask.setTimeout(() => {
  48. getNoticeList()
  49. }, 60 * 1000, 'systemNotice')
  50. }
  51. }
  52. // 更新已读
  53. const updateNoticeReaded = (id: number) => {
  54. const item = state.noticeList.find((e) => e.autoid === id)
  55. if (item && !item.readed) {
  56. postNoticeReaded({
  57. data: {
  58. noticeID: id,
  59. }
  60. }).then(() => {
  61. item.readed = true
  62. })
  63. }
  64. }
  65. // 接收登入请求数据
  66. eventBus.$on('LoginNotify', () => {
  67. getNoticeList()
  68. })
  69. // 接收登出通知清空数据
  70. eventBus.$on('LogoutNotify', () => {
  71. timerTask.clearTimeout('systemNotice')
  72. state.noticeList = []
  73. state.isInitialized = false
  74. })
  75. return {
  76. ...toRefs(state),
  77. localizedNoticeList,
  78. unreadCount,
  79. getNoticeList,
  80. updateNoticeReaded,
  81. }
  82. })