feat/auth (#29)

Reviewed-on: #29
Co-authored-by: Janis <janis.e.20@gmx.de>
Co-committed-by: Janis <janis.e.20@gmx.de>
This commit is contained in:
2026-01-20 12:28:20 +01:00
committed by Janis
parent 6b8488e7a4
commit d3709ed852
10 changed files with 1411 additions and 151 deletions

View File

@@ -1,5 +1,7 @@
import { createRouter, createWebHistory } from 'vue-router'
import LoginView from '../views/LoginView.vue'
import RegisterView from '../views/RegisterView.vue'
import UsernameSelectionView from '../views/UsernameSelectionView.vue'
import MainMenuView from '../views/MainMenuView.vue'
import createGameView from '../views/CreateGame.vue'
import joinGameView from "@/views/JoinGameView.vue";
@@ -17,13 +19,13 @@ const router = createRouter({
{
path: '/',
component: MainMenuView,
meta: { requiresAuth: true },
meta: { requiresAuth: false },
children: [
{
path: '',
name: 'mainmenu',
component: defaultMenu,
meta: { requiresAuth: true }
meta: { requiresAuth: false }
},
{
path: 'create',
@@ -41,7 +43,7 @@ const router = createRouter({
path: 'rules',
name: 'rules-Game',
component: rulesView,
meta: {requiresAuth: true }
meta: {requiresAuth: false }
},
],
},
@@ -51,6 +53,18 @@ const router = createRouter({
component: LoginView,
meta: { requiresAuth: false }
},
{
path: '/register',
name: 'register',
component: RegisterView,
meta: { requiresAuth: false }
},
{
path: '/select-username',
name: 'select-username',
component: UsernameSelectionView,
meta: { requiresAuth: false }
},
{
path: '/game',
name: 'game',
@@ -69,19 +83,16 @@ const router = createRouter({
router.beforeEach(async (to, from, next) => {
const info = useUserInfo();
const isOnline = navigator.onLine;
if (to.name === 'offline') {
if (isOnline) {
try {
await info.requestState();
if (!info.username) {
info.clearUserInfo();
return next('/login');
}
return next({ name: 'mainmenu' });
} catch (err) {
info.clearUserInfo();
return next('/login');
@@ -90,28 +101,27 @@ router.beforeEach(async (to, from, next) => {
return next();
}
}
if (!isOnline) {
return next({ name: 'offline' });
}
if (!to.meta.requiresAuth) return next();
try {
await info.requestState();
if (!info.username) {
info.clearUserInfo();
return next('/login');
}
if (info.gameId && to.name !== 'game') {
return next({ name: 'game' });
}
next();
} catch (err) {
info.clearUserInfo();
next('/login');
console.error("Routing Error", err);
info.clearUserInfo();
next('/login');
}
});