42 lines
1.3 KiB
TypeScript
42 lines
1.3 KiB
TypeScript
|
import NProgress from "nprogress";
|
||
|
import { useAuthStore } from "@/stores/auth";
|
||
|
import { useAccountStore } from "@/stores/account";
|
||
|
import { jwtDecode, type JwtPayload } from "jwt-decode";
|
||
|
|
||
|
type Payload = JwtPayload & { userId: number; username: string; firstname: string; lastname: string; mail: string };
|
||
|
|
||
|
export async function isAuthenticated(to: any, from: any, next: any) {
|
||
|
const auth = useAuthStore();
|
||
|
NProgress.start();
|
||
|
if (auth.authCheck && localStorage.getItem("access_token")) {
|
||
|
NProgress.done();
|
||
|
next();
|
||
|
return;
|
||
|
}
|
||
|
await isAuthenticatedPromise()
|
||
|
.then(async (result: any) => {
|
||
|
NProgress.done();
|
||
|
next();
|
||
|
})
|
||
|
.catch((err: Error) => {
|
||
|
NProgress.done();
|
||
|
next({ name: "login" });
|
||
|
});
|
||
|
}
|
||
|
|
||
|
export async function isAuthenticatedPromise(): Promise<Payload> {
|
||
|
return new Promise<Payload>((resolve, reject) => {
|
||
|
const auth = useAuthStore();
|
||
|
const account = useAccountStore();
|
||
|
let decoded = jwtDecode<Payload>(localStorage.getItem("accessToken") ?? "");
|
||
|
|
||
|
auth.setSuccess();
|
||
|
if (typeof decoded == "string" || !decoded) {
|
||
|
reject("jwt failed");
|
||
|
}
|
||
|
var { firstname, lastname, mail, username } = decoded;
|
||
|
account.setAccountData(firstname, lastname, mail, username);
|
||
|
resolve(decoded);
|
||
|
});
|
||
|
}
|