budgeteer/web/src/main.ts
2022-03-15 12:52:23 +00:00

80 lines
2.0 KiB
TypeScript

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(<string>to.params.budgetid);
const accountStore = useAccountStore();
await accountStore.SetCurrentAccount(
<string>to.params.budgetid,
<string>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;