Detect backend support for announcements

This commit is contained in:
tusooa 2022-11-24 18:39:42 -05:00
parent fa69034020
commit d74d5a8ce2
No known key found for this signature in database
GPG Key ID: 7B467EDE43A08224
6 changed files with 26 additions and 3 deletions

View File

@ -88,6 +88,7 @@ const NavPanel = {
privateMode: state => state.instance.private, privateMode: state => state.instance.private,
federating: state => state.instance.federating, federating: state => state.instance.federating,
pleromaChatMessagesAvailable: state => state.instance.pleromaChatMessagesAvailable, pleromaChatMessagesAvailable: state => state.instance.pleromaChatMessagesAvailable,
supportsAnnouncements: state => state.announcements.supportsAnnouncements,
pinnedItems: state => new Set(state.serverSideStorage.prefsStorage.collections.pinnedNavItems), pinnedItems: state => new Set(state.serverSideStorage.prefsStorage.collections.pinnedNavItems),
collapsed: state => state.serverSideStorage.prefsStorage.simple.collapseNav collapsed: state => state.serverSideStorage.prefsStorage.simple.collapseNav
}), }),
@ -98,6 +99,7 @@ const NavPanel = {
.map(([k, v]) => ({ ...v, name: k })), .map(([k, v]) => ({ ...v, name: k })),
{ {
hasChats: this.pleromaChatMessagesAvailable, hasChats: this.pleromaChatMessagesAvailable,
hasAnnouncements: this.supportsAnnouncements,
isFederating: this.federating, isFederating: this.federating,
isPrivate: this.privateMode, isPrivate: this.privateMode,
currentUser: this.currentUser currentUser: this.currentUser

View File

@ -1,4 +1,4 @@
export const filterNavigation = (list = [], { hasChats, isFederating, isPrivate, currentUser }) => { export const filterNavigation = (list = [], { hasChats, hasAnnouncements, isFederating, isPrivate, currentUser }) => {
return list.filter(({ criteria, anon, anonRoute }) => { return list.filter(({ criteria, anon, anonRoute }) => {
const set = new Set(criteria || []) const set = new Set(criteria || [])
if (!isFederating && set.has('federating')) return false if (!isFederating && set.has('federating')) return false
@ -6,6 +6,7 @@ export const filterNavigation = (list = [], { hasChats, isFederating, isPrivate,
if (!currentUser && !(anon || anonRoute)) return false if (!currentUser && !(anon || anonRoute)) return false
if ((!currentUser || !currentUser.locked) && set.has('lockedUser')) return false if ((!currentUser || !currentUser.locked) && set.has('lockedUser')) return false
if (!hasChats && set.has('chats')) return false if (!hasChats && set.has('chats')) return false
if (!hasAnnouncements && set.has('announcements')) return false
return true return true
}) })
} }

View File

@ -76,6 +76,7 @@ export const ROOT_ITEMS = {
route: 'announcements', route: 'announcements',
icon: 'bullhorn', icon: 'bullhorn',
label: 'nav.announcements', label: 'nav.announcements',
badgeGetter: 'unreadAnnouncementCount' badgeGetter: 'unreadAnnouncementCount',
criteria: ['announcements']
} }
} }

View File

@ -95,7 +95,8 @@ const SideDrawer = {
} }
}, },
...mapState({ ...mapState({
pleromaChatMessagesAvailable: state => state.instance.pleromaChatMessagesAvailable pleromaChatMessagesAvailable: state => state.instance.pleromaChatMessagesAvailable,
supportsAnnouncements: state => state.announcements.supportsAnnouncements
}), }),
...mapGetters(['unreadChatCount', 'unreadAnnouncementCount']) ...mapGetters(['unreadChatCount', 'unreadAnnouncementCount'])
}, },

View File

@ -192,6 +192,7 @@
</a> </a>
</li> </li>
<li <li
v-if="currentUser && supportsAnnouncements"
@click="toggleDrawer" @click="toggleDrawer"
> >
<router-link <router-link

View File

@ -2,6 +2,7 @@ const FETCH_ANNOUNCEMENT_INTERVAL_MS = 1000 * 60 * 5
export const defaultState = { export const defaultState = {
announcements: [], announcements: [],
supportsAnnouncements: true,
fetchAnnouncementsTimer: undefined fetchAnnouncementsTimer: undefined
} }
@ -20,6 +21,9 @@ export const mutations = {
}, },
setFetchAnnouncementsTimer (state, timer) { setFetchAnnouncementsTimer (state, timer) {
state.fetchAnnouncementsTimer = timer state.fetchAnnouncementsTimer = timer
},
setSupportsAnnouncements (state, supportsAnnouncements) {
state.supportsAnnouncements = supportsAnnouncements
} }
} }
@ -40,6 +44,10 @@ const announcements = {
getters, getters,
actions: { actions: {
fetchAnnouncements (store) { fetchAnnouncements (store) {
if (!store.state.supportsAnnouncements) {
return Promise.resolve()
}
const currentUser = store.rootState.users.currentUser const currentUser = store.rootState.users.currentUser
const isAdmin = currentUser && currentUser.role === 'admin' const isAdmin = currentUser && currentUser.role === 'admin'
@ -72,6 +80,15 @@ const announcements = {
.then(announcements => { .then(announcements => {
store.commit('setAnnouncements', announcements) store.commit('setAnnouncements', announcements)
}) })
.catch(error => {
// If and only if backend does not support announcements, it would return 404.
// In this case, silently ignores it.
if (error && error.statusCode === 404) {
store.commit('setSupportsAnnouncements', false)
} else {
throw error
}
})
}, },
markAnnouncementAsRead (store, id) { markAnnouncementAsRead (store, id) {
return store.rootState.api.backendInteractor.dismissAnnouncement({ id }) return store.rootState.api.backendInteractor.dismissAnnouncement({ id })