68 lines
1.8 KiB
TypeScript
68 lines
1.8 KiB
TypeScript
import { basename, wrapBasename } from '@/modules/basename';
|
|
import { queryLogin } from '@/modules/query';
|
|
import { create } from 'zustand';
|
|
|
|
interface UserState {
|
|
user: {
|
|
avatar?: string;
|
|
description?: string;
|
|
id?: string;
|
|
needChangePassword?: boolean;
|
|
orgs?: string[];
|
|
type?: string;
|
|
username?: string;
|
|
canChangeUsername?: boolean;
|
|
} | null;
|
|
open: boolean;
|
|
setOpen: (open: boolean) => void;
|
|
setUser: (user: UserState['user']) => void;
|
|
clearUser: () => Promise<void>;
|
|
queryUser: () => void;
|
|
queryMe: (token?: string) => void;
|
|
init: () => void;
|
|
}
|
|
|
|
export const useUserStore = create<UserState>((set, get) => ({
|
|
user: null,
|
|
open: false,
|
|
setOpen: (open) => set({ open }),
|
|
setUser: (user) => set({ user }),
|
|
clearUser: async () => {
|
|
await queryLogin.logout()
|
|
set({ user: null });
|
|
},
|
|
queryUser: async () => {
|
|
const user = await queryLogin.checkLocalUser();
|
|
console.log('查询到的用户信息:', user);
|
|
if (!user) {
|
|
const token = localStorage.getItem('token');
|
|
if (token) {
|
|
get().queryMe(token);
|
|
}
|
|
} else {
|
|
set({ user });
|
|
}
|
|
},
|
|
queryMe: async (token?: string) => {
|
|
const res = await queryLogin.getMe(token);
|
|
console.log('获取到的用户信息:', res);
|
|
if (res.code === 200) {
|
|
set({ user: res.data || null });
|
|
const canChangeUsername = res.data?.canChangeUsername ?? false;
|
|
if (canChangeUsername) {
|
|
// 打开修改用户名的页面
|
|
window.open(wrapBasename('/first'), '_blank');
|
|
}
|
|
}
|
|
},
|
|
init: () => {
|
|
const url = new URL(window.location.href);
|
|
const code = url.searchParams.get('code');
|
|
const state = url.searchParams.get('state');
|
|
if (code && state) {
|
|
set({ open: true })
|
|
}
|
|
}
|
|
}));
|
|
|