34 lines
866 B
TypeScript
34 lines
866 B
TypeScript
import { create } from "zustand"
|
|
import {
|
|
AUTH_EVENT,
|
|
getUserInfo,
|
|
getUserToken,
|
|
type UserInfoRecord,
|
|
} from "@/api/token"
|
|
|
|
export type ProfileState = {
|
|
token: string | null
|
|
userInfo: UserInfoRecord | null
|
|
}
|
|
|
|
type ProfileActions = {
|
|
refreshFromStorage: () => void
|
|
}
|
|
|
|
export type ProfileStore = ProfileState & ProfileActions
|
|
|
|
export const useProfileStore = create<ProfileStore>()(set => ({
|
|
token: getUserToken(),
|
|
userInfo: getUserInfo<UserInfoRecord>(),
|
|
refreshFromStorage: () => {
|
|
set({ token: getUserToken(), userInfo: getUserInfo<UserInfoRecord>() })
|
|
},
|
|
}))
|
|
|
|
// 应用入口调用一次,监听登录态变化(含跨标签页 focus 同步)
|
|
export function initProfileStore() {
|
|
const sync = () => useProfileStore.getState().refreshFromStorage()
|
|
window.addEventListener(AUTH_EVENT, sync)
|
|
window.addEventListener("focus", sync)
|
|
}
|