11import { defineStore } from "pinia" ;
22import { computed , ref } from "vue" ;
3- import {
4- type Serializer ,
5- useLocalStorage ,
6- useSessionStorage ,
7- } from "@vueuse/core" ;
8- import { notifyErr , requestApi , requestWithToken } from "./network.ts" ;
9- import { MCSLNotif } from "@repo/ui/src/utils/notifications.ts" ;
10- import { useLocale } from "@repo/ui/src/utils/stores.ts" ;
3+ import { useLocalStorage , useSessionStorage } from "@vueuse/core" ;
4+ import { notifyErr , requestWithToken } from "./network.ts" ;
115import router from "@repo/shared/src/router.ts" ;
126
13- export type TokenPair = { access_token : string ; refresh_token : string } ;
14-
157export type UserInfo = {
16- id : number ;
178 name : string ;
189 permissions : string [ ] ;
1910} ;
2011
2112export const useAccount = defineStore ( "account" , ( ) => {
22- const serializer : Serializer < TokenPair | null > = {
23- write : ( token : TokenPair | null ) =>
24- token == null ? "" : JSON . stringify ( token ) ,
25- read : ( token : string ) =>
26- token == "" ? null : ( JSON . parse ( token ) as TokenPair ) ,
27- } ;
28-
29- const tokenPermanent = useLocalStorage < TokenPair | null > (
30- "mcsl-web-token" ,
31- null ,
32- { serializer } ,
33- ) ;
34- const tokenTemporary = useSessionStorage < TokenPair | null > (
13+ const tokenPermanent = useLocalStorage < string | null > ( "mcsl-web-token" , null ) ;
14+ const tokenTemporary = useSessionStorage < string | null > (
3515 "mcsl-web-token" ,
3616 null ,
37- { serializer } ,
3817 ) ;
3918
4019 const token = computed ( ( ) => {
4120 return tokenPermanent . value ?? tokenTemporary . value ;
4221 } ) ;
4322
44- const accessToken = computed ( ( ) => {
45- return token . value ?. access_token ;
46- } ) ;
47-
48- async function setToken ( token : TokenPair | null , isPermanent ?: boolean ) {
23+ async function setToken ( token : string | null , isPermanent ?: boolean ) {
4924 if ( isPermanent === true || isPermanent == undefined ) {
5025 tokenPermanent . value = token ;
5126 }
@@ -61,59 +36,28 @@ export const useAccount = defineStore("account", () => {
6136 await router . push ( "/auth" ) ;
6237 }
6338
64- async function refreshToken ( ) {
65- if ( ! token . value ) return ;
66- try {
67- const res = await requestApi < TokenPair > (
68- "/account/refresh" ,
69- "POST" ,
70- async ( e ) => {
71- if ( e . err == "invalid-token" ) {
72- await logout ( ) ;
73- const t = useLocale ( ) . getI18n ( ) . t ;
74- new MCSLNotif ( {
75- data : {
76- title : t ( "ui.notification.title.warning" ) ,
77- message : t ( "web.auth.login.expired" ) ,
78- color : "warning" ,
79- } ,
80- } ) . open ( ) ;
81- } else notifyErr ( e , "web.auth.login.refresh-error" ) ;
82- } ,
83- token . value ,
84- ) ;
85- await setToken ( res , true ) ;
86- } catch {
87- /* ignore */
88- }
89- }
90-
9139 const selfInfo = ref < UserInfo | null > ( null ) ;
9240
9341 async function updateSelfInfo ( ) {
94- if ( ! accessToken . value ) {
42+ if ( ! token . value ) {
9543 selfInfo . value = null ;
9644 return ;
9745 }
9846 try {
9947 selfInfo . value = await requestWithToken < UserInfo > (
10048 "/user/self" ,
10149 "GET" ,
102- async ( err ) => {
103- if ( err . err == "invalid-token" ) await useAccount ( ) . refreshToken ( ) ;
104- else notifyErr ( err , "web.user-center.user-fetch-error" ) ;
105- } ,
50+ ( err ) => notifyErr ( err , "web.user-center.user-fetch-error" ) ,
10651 ) ;
10752 } catch {
10853 /* ignore */
10954 }
11055 }
11156
11257 return {
113- accessToken,
11458 setToken,
59+ token,
11560 logout,
116- refreshToken,
11761 selfInfo,
11862 updateSelfInfo,
11963 } ;
0 commit comments