logo

pleroma-fe

My custom branche(s) on git.pleroma.social/pleroma/pleroma-fe git clone https://anongit.hacktivis.me/git/pleroma-fe.git/

announcements.js (3663B)


  1. import { defineStore } from 'pinia'
  2. const FETCH_ANNOUNCEMENT_INTERVAL_MS = 1000 * 60 * 5
  3. export const useAnnouncementsStore = defineStore('announcements', {
  4. state: () => ({
  5. announcements: [],
  6. supportsAnnouncements: true,
  7. fetchAnnouncementsTimer: undefined
  8. }),
  9. getters: {
  10. unreadAnnouncementCount () {
  11. if (!window.vuex.state.users.currentUser) {
  12. return 0
  13. }
  14. const unread = this.announcements.filter(announcement => !(announcement.inactive || announcement.read))
  15. return unread.length
  16. }
  17. },
  18. actions: {
  19. fetchAnnouncements () {
  20. if (!this.supportsAnnouncements) {
  21. return Promise.resolve()
  22. }
  23. const currentUser = window.vuex.state.users.currentUser
  24. const isAdmin = currentUser && currentUser.privileges.includes('announcements_manage_announcements')
  25. const getAnnouncements = async () => {
  26. if (!isAdmin) {
  27. return window.vuex.state.api.backendInteractor.fetchAnnouncements()
  28. }
  29. const all = await window.vuex.state.api.backendInteractor.adminFetchAnnouncements()
  30. const visible = await window.vuex.state.api.backendInteractor.fetchAnnouncements()
  31. const visibleObject = visible.reduce((a, c) => {
  32. a[c.id] = c
  33. return a
  34. }, {})
  35. const getWithinVisible = announcement => visibleObject[announcement.id]
  36. all.forEach(announcement => {
  37. const visibleAnnouncement = getWithinVisible(announcement)
  38. if (!visibleAnnouncement) {
  39. announcement.inactive = true
  40. } else {
  41. announcement.read = visibleAnnouncement.read
  42. }
  43. })
  44. return all
  45. }
  46. return getAnnouncements()
  47. .then(announcements => {
  48. this.announcements = announcements
  49. })
  50. .catch(error => {
  51. // If and only if backend does not support announcements, it would return 404.
  52. // In this case, silently ignores it.
  53. if (error && error.statusCode === 404) {
  54. this.supportsAnnouncements = false
  55. } else {
  56. throw error
  57. }
  58. })
  59. },
  60. markAnnouncementAsRead (id) {
  61. return window.vuex.state.api.backendInteractor.dismissAnnouncement({ id })
  62. .then(() => {
  63. const index = this.announcements.findIndex(a => a.id === id)
  64. if (index < 0) {
  65. return
  66. }
  67. this.announcements[index].read = true
  68. })
  69. },
  70. startFetchingAnnouncements () {
  71. if (this.fetchAnnouncementsTimer) {
  72. return
  73. }
  74. const interval = setInterval(() => this.fetchAnnouncements(), FETCH_ANNOUNCEMENT_INTERVAL_MS)
  75. this.fetchAnnouncementsTimer = interval
  76. return this.fetchAnnouncements()
  77. },
  78. stopFetchingAnnouncements () {
  79. const interval = this.fetchAnnouncementsTimer
  80. this.fetchAnnouncementsTimer = undefined
  81. clearInterval(interval)
  82. },
  83. postAnnouncement ({ content, startsAt, endsAt, allDay }) {
  84. return window.vuex.state.api.backendInteractor.postAnnouncement({ content, startsAt, endsAt, allDay })
  85. .then(() => {
  86. return this.fetchAnnouncements()
  87. })
  88. },
  89. editAnnouncement ({ id, content, startsAt, endsAt, allDay }) {
  90. return window.vuex.state.api.backendInteractor.editAnnouncement({ id, content, startsAt, endsAt, allDay })
  91. .then(() => {
  92. return this.fetchAnnouncements()
  93. })
  94. },
  95. deleteAnnouncement (id) {
  96. return window.vuex.state.api.backendInteractor.deleteAnnouncement({ id })
  97. .then(() => {
  98. return this.fetchAnnouncements()
  99. })
  100. }
  101. }
  102. })