diff --git a/composables/api.ts b/composables/api.ts index 083c47c..9b5d0e6 100644 --- a/composables/api.ts +++ b/composables/api.ts @@ -38,11 +38,15 @@ export function useApi( .then((data) => { result.data.value = data as T }) - .catch((e: FetchError) => { + .catch(async (e: FetchError) => { result.error.value = e if (e.statusCode === 401) { useIsLoggedIn().value = false - navigateTo('/login') + const route = useRoute() + const settings = await useSettings() + if (!(settings.value.public && route.meta.public)) { + navigateTo('/login') + } } else if (e.statusCode !== 400 && !e.data?.path) { throw createError({ statusCode: e.statusCode, diff --git a/middleware/auth.global.ts b/middleware/auth.global.ts index 07a7f56..3a77d1d 100644 --- a/middleware/auth.global.ts +++ b/middleware/auth.global.ts @@ -1,7 +1,12 @@ -import { useIsLoggedIn, useRedirectUrl } from '@/composables/states' +import { + useIsLoggedIn, + useRedirectUrl, + useSettings, +} from '@/composables/states' -export default defineNuxtRouteMiddleware((to, from) => { +export default defineNuxtRouteMiddleware(async (to, from) => { const isLoggedIn = useIsLoggedIn() + const settings = await useSettings() useRedirectUrl().value = (from.query.r as string) || null if (useRedirectUrl().value && to.name === 'login') { @@ -11,7 +16,7 @@ export default defineNuxtRouteMiddleware((to, from) => { if (to.name === 'login' && isLoggedIn.value) { return navigateTo('/') } - if (to.name !== 'login' && !isLoggedIn.value) { + if (!isLoggedIn.value && !(to.meta.public && settings.value.public)) { return navigateTo('/login') } }) diff --git a/pages/index.vue b/pages/index.vue index af9e65d..6f46f25 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -2,6 +2,10 @@ const { t } = useI18n() const appsData = await useApps() +definePageMeta({ + public: true, +}) + const apps = computed(() => { const appTileColors = [ ['bg-primary', 'text-primary-content'], diff --git a/pages/login.vue b/pages/login.vue index 5c475fa..1a5e41e 100644 --- a/pages/login.vue +++ b/pages/login.vue @@ -5,6 +5,7 @@ import * as yup from 'yup' definePageMeta({ layout: false, + public: true, }) const { t } = useI18n()