From 6b179885ce2d1515a0acf92f541537eedd0c2e7e Mon Sep 17 00:00:00 2001 From: wvffle Date: Thu, 21 Jul 2022 21:20:10 +0000 Subject: [PATCH] Fetch inbox data --- front/src/components/Sidebar.vue | 8 +- front/src/components/auth/LoginForm.vue | 160 ++++++++++++------------ front/src/router/guards.ts | 12 +- front/src/router/routes/auth.ts | 5 +- 4 files changed, 99 insertions(+), 86 deletions(-) diff --git a/front/src/components/Sidebar.vue b/front/src/components/Sidebar.vue index e20d9378b..f61ea72fd 100644 --- a/front/src/components/Sidebar.vue +++ b/front/src/components/Sidebar.vue @@ -96,12 +96,18 @@ const moderationNotifications = computed(() => onMounted(async () => { if (store.state.auth.authenticated) { - const [edits, reports, requests] = await Promise.all([ + const [inbox, edits, reports, requests] = await Promise.all([ + axios.get('federation/inbox/', { params: { is_read: false } }).catch(() => ({ data: { count: 0 } })), axios.get('mutations/', { params: { page_size: 1, q: 'is_approved:null' } }).catch(() => ({ data: { count: 0 } })), axios.get('manage/moderation/reports/', { params: { page_size: 1, q: 'resolved:no' } }).catch(() => ({ data: { count: 0 } })), axios.get('manage/moderation/requests/', { params: { page_size: 1, q: 'status:pending' } }).catch(() => ({ data: { count: 0 } })) ]) + store.commit('ui/incrementNotifications', { + type: 'inbox', + value: inbox.data.count + }) + store.commit('ui/incrementNotifications', { type: 'pendingReviewEdits', value: edits.data.count diff --git a/front/src/components/auth/LoginForm.vue b/front/src/components/auth/LoginForm.vue index 7abb98586..9c142cb0a 100644 --- a/front/src/components/auth/LoginForm.vue +++ b/front/src/components/auth/LoginForm.vue @@ -1,10 +1,83 @@ + + - - diff --git a/front/src/router/guards.ts b/front/src/router/guards.ts index 3f16721c6..a0be2c291 100644 --- a/front/src/router/guards.ts +++ b/front/src/router/guards.ts @@ -1,5 +1,5 @@ -import type { NavigationGuardNext, RouteLocationNormalized } from 'vue-router' +import type { NavigationGuardNext, RouteLocationNamedRaw, RouteLocationNormalized } from 'vue-router' import type { Permission } from '~/store/auth' import store from '~/store' @@ -12,3 +12,13 @@ export const hasPermissions = (permission: Permission) => (to: RouteLocationNorm console.log('Not authenticated. Redirecting to library.') next({ name: 'library.index' }) } + +export const requireLoggedIn = (fallbackLocation: RouteLocationNamedRaw) => (to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => { + if (store.state.auth.authenticated) return next() + return next(fallbackLocation) +} + +export const requireLoggedOut = (fallbackLocation: RouteLocationNamedRaw) => (to: RouteLocationNormalized, from: RouteLocationNormalized, next: NavigationGuardNext) => { + if (!store.state.auth.authenticated) return next() + return next(fallbackLocation) +} diff --git a/front/src/router/routes/auth.ts b/front/src/router/routes/auth.ts index a537ec8a1..7ad640388 100644 --- a/front/src/router/routes/auth.ts +++ b/front/src/router/routes/auth.ts @@ -1,12 +1,15 @@ import type { RouteRecordRaw } from 'vue-router' +import { requireLoggedOut } from '../guards' + export default [ { path: '/login', name: 'login', component: () => import('~/views/auth/Login.vue'), // TODO (wvffle): Use named routes EVERYWHERE - props: route => ({ next: route.query.next || '/library' }) + props: route => ({ next: route.query.next || '/library' }), + beforeEnter: requireLoggedOut({ name: 'library.index' }) }, { path: '/auth/password/reset',