import { createApp } from "vue"; import App from "./App.vue"; import "./index.css"; import router from "./router"; import { createPinia } from "pinia"; import { useBudgetsStore } from "./stores/budget"; import { useAccountStore } from "./stores/budget-account"; import PiniaLogger from "./pinia-logger"; import { useSessionStore } from "./stores/session"; const app = createApp(App); app.use(router); const pinia = createPinia(); pinia.use( PiniaLogger({ expanded: false, showDuration: true, }) ); app.use(pinia); app.mount("#app"); router.beforeEach(async (to, from, next) => { const budgetStore = useBudgetsStore(); await budgetStore.SetCurrentBudget(to.params.budgetid); const accountStore = useAccountStore(); await accountStore.SetCurrentAccount( to.params.budgetid, to.params.accountid ); next(); }); router.beforeEach((to, from, next) => { const sessionStore = useSessionStore(); const token = sessionStore.Session?.Token; let loggedIn = false; if (token != null) { const jwt = parseJwt(token); if (jwt.exp > Date.now() / 1000) loggedIn = true; } if (to.matched.some((record) => record.meta.requiresAuth)) { if (!loggedIn) { next({ path: "/login" }); } else { next(); } } else if (to.matched.some((record) => record.meta.hideForAuth)) { if (loggedIn) { next({ path: "/dashboard" }); } else { next(); } } else { next(); } }); function parseJwt(token: string) { var base64Url = token.split(".")[1]; var base64 = base64Url.replace(/-/g, "+").replace(/_/g, "/"); var jsonPayload = decodeURIComponent( atob(base64) .split("") .map(function (c) { return "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2); }) .join("") ); return JSON.parse(jsonPayload); } 1646426130; 1646512855755;