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',