Files
KnockOutWhist-Frontend/src/router/index.ts
lq64 2fbfca32a0 feat/FRO-36: PWA (#25)
Added a PWA for knockoutwhist including a special offline screen.

Co-authored-by: LQ63 <lkhermann@web.de>
Reviewed-on: #25
Reviewed-by: Janis <janis-e@gmx.de>
Co-authored-by: lq64 <lq@blackhole.local>
Co-committed-by: lq64 <lq@blackhole.local>
2025-12-18 09:46:23 +01:00

112 lines
2.6 KiB
TypeScript

import { createRouter, createWebHistory } from 'vue-router'
import LoginView from '../views/LoginView.vue'
import MainMenuView from '../views/MainMenuView.vue'
import createGameView from '../views/CreateGame.vue'
import joinGameView from "@/views/JoinGameView.vue";
import defaultMenu from "../components/DefaultMenu.vue"
import axios from "axios";
import { useUserInfo } from "@/composables/useUserInfo";
import rulesView from "../components/Rules.vue";
import Game from "@/views/Game.vue";
import OfflineView from "@/views/OfflineView.vue";
const api = window?.__RUNTIME_CONFIG__?.API_URL;
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
{
path: '/',
component: MainMenuView,
meta: { requiresAuth: true },
children: [
{
path: '',
name: 'mainmenu',
component: defaultMenu,
meta: { requiresAuth: true }
},
{
path: 'create',
name: 'create-Game',
component: createGameView,
meta: {requiresAuth: true }
},
{
path: 'join',
name: 'join-Game',
component: joinGameView,
meta: {requiresAuth: true }
},
{
path: 'rules',
name: 'rules-Game',
component: rulesView,
meta: {requiresAuth: true }
},
],
},
{
path: '/login',
name: 'login',
component: LoginView,
meta: { requiresAuth: false }
},
{
path: '/game',
name: 'game',
component: Game,
meta: {requiresAuth: true }
},
{
path: '/offline',
name: 'offline',
component: OfflineView,
meta: {requiresAuth: false }
}
],
})
router.beforeEach(async (to, from, next) => {
const info = useUserInfo();
const isOnline = navigator.onLine;
if (to.name === 'offline') {
if (isOnline) {
try {
const response = await axios.get(`${api}/userInfo`, { withCredentials: true });
info.setUserInfo(response.data.username, response.data.userId);
return next({ name: 'mainmenu' });
} catch (err) {
info.clearUserInfo();
return next('/login');
}
} else {
return next();
}
}
if (!isOnline) {
return next({ name: 'offline' });
}
if (!to.meta.requiresAuth) return next();
try {
await axios.get(`${api}/userInfo`, { withCredentials: true }).then(
res => {
info.setUserInfo(res.data.username, res.data.userId);
}
);
next();
} catch (err) {
info.clearUserInfo();
next('/login');
}
});
export default router