From 95750509b14ab5f5a5d8c9a5defafd95ee7efbe3 Mon Sep 17 00:00:00 2001 From: Tusooa Zhu Date: Thu, 17 Mar 2022 14:01:45 -0400 Subject: Fetch real data from backend --- src/modules/announcements.js | 60 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/modules/announcements.js (limited to 'src/modules/announcements.js') diff --git a/src/modules/announcements.js b/src/modules/announcements.js new file mode 100644 index 00000000..2ab2600c --- /dev/null +++ b/src/modules/announcements.js @@ -0,0 +1,60 @@ +import { set } from 'vue' + +const FETCH_ANNOUNCEMENT_INTERVAL_MS = 1000 * 60 * 5 + +export const defaultState = { + announcements: [], + fetchAnnouncementsTimer: undefined +} + +export const mutations = { + setAnnouncements (state, announcements) { + set(state, 'announcements', announcements) + }, + setAnnouncementRead (state, { id, read }) { + if (!state.announcements[id]) { + return + } + + set(state.announcements[id], 'read', read) + }, + setFetchAnnouncementsTimer (state, timer) { + set(state, 'fetchAnnouncementsTimer', announcements) + } +} + +const announcements = { + state: defaultState, + mutations, + actions: { + fetchAnnouncements (store) { + return store.rootState.api.backendInteractor.fetchAnnouncements() + .then(announcements => { + store.commit('setAnnouncements', announcements) + }) + }, + markAnnouncementAsRead (store, id) { + return store.rootState.api.backendInteractor.dismissAnnouncement({ id }) + .then(() => { + store.commit('setAnnouncementRead', { id, read: true }) + }) + }, + startFetchingAnnouncements (store) { + if (store.state.fetchAnnouncementsTimer) { + return + } + + const interval = setInterval(() => store.dispatch('fetchAnnouncements'), FETCH_ANNOUNCEMENT_INTERVAL_MS) + store.commit('setFetchAnnouncementsTimer', interval) + + return store.dispatch('fetchAnnouncements') + }, + stopFetchingAnnouncements (store) { + const interval = store.state.fetchAnnouncementsTimer + store.commit('setFetchAnnouncementsTimer', undefined) + clearInterval(interval) + } + } +} + +export default announcements -- cgit v1.2.3-70-g09d2 From e494e746439e3e622c5b12a182b6c6a9de540821 Mon Sep 17 00:00:00 2001 From: Tusooa Zhu Date: Thu, 17 Mar 2022 14:54:52 -0400 Subject: Implement posting announcements --- .../announcements_page/announcements_page.js | 28 ++++++++ .../announcements_page/announcements_page.vue | 76 ++++++++++++++++++++++ src/modules/announcements.js | 6 ++ src/services/api/api.service.js | 27 +++++++- 4 files changed, 136 insertions(+), 1 deletion(-) (limited to 'src/modules/announcements.js') diff --git a/src/components/announcements_page/announcements_page.js b/src/components/announcements_page/announcements_page.js index a2a218fd..ec038361 100644 --- a/src/components/announcements_page/announcements_page.js +++ b/src/components/announcements_page/announcements_page.js @@ -1,16 +1,44 @@ +import { mapState } from 'vuex' import Announcement from '../announcement/announcement.vue' const AnnouncementsPage = { components: { Announcement }, + data () { + return { + newAnnouncement: { + content: '' + }, + posting: false, + error: undefined + } + }, mounted () { this.$store.dispatch('fetchAnnouncements') }, computed: { + ...mapState({ + currentUser: state => state.users.currentUser + }), announcements () { return this.$store.state.announcements.announcements } + }, + methods: { + postAnnouncement () { + this.posting = true + this.$store.dispatch('postAnnouncement', this.newAnnouncement) + .catch(error => { + this.error = error.error + }) + .finally(() => { + this.posting = false + }) + }, + clearError () { + this.error = undefined + } } } diff --git a/src/components/announcements_page/announcements_page.vue b/src/components/announcements_page/announcements_page.vue index 16b2f955..1b3bd578 100644 --- a/src/components/announcements_page/announcements_page.vue +++ b/src/components/announcements_page/announcements_page.vue @@ -6,6 +6,51 @@
+
+
+
+

{{ $t('announcements.post_form_header') }}

+
+
+