67 lines
1.8 KiB
TypeScript
67 lines
1.8 KiB
TypeScript
'use strict';
|
|
import { create } from 'zustand';
|
|
import { toast } from 'sonner';
|
|
import { useContextKey } from '@kevisual/context';
|
|
import { type QueryLoginBrowser } from '@/query/query-login/index.ts'
|
|
const queryLogin = useContextKey<QueryLoginBrowser>('queryLogin');
|
|
|
|
type Me = {
|
|
id?: string;
|
|
username?: string;
|
|
nickname?: string | null;
|
|
needChangePassword?: boolean;
|
|
role?: string;
|
|
description?: string | null;
|
|
type?: 'user' | 'org';
|
|
orgs?: string[];
|
|
avatar?: string;
|
|
};
|
|
export type LayoutStore = {
|
|
open: boolean;
|
|
setOpen: (open: boolean) => void;
|
|
me: Me;
|
|
setMe: (me: Me) => void;
|
|
getMe: () => Promise<void>;
|
|
openUser: boolean;
|
|
setOpenUser: (openUser: boolean) => void;
|
|
switchOrg: (username?: string, type?: 'user' | 'org') => Promise<void>;
|
|
isAdmin: boolean;
|
|
setIsAdmin: (isAdmin: boolean) => void;
|
|
checkHasOrg: () => boolean;
|
|
};
|
|
export const useLayoutStore = create<LayoutStore>((set, get) => ({
|
|
open: false,
|
|
setOpen: (open) => set({ open }),
|
|
me: {},
|
|
setMe: (me) => set({ me }),
|
|
getMe: async () => {
|
|
const res = await queryLogin.getMe();
|
|
if (res.code === 200) {
|
|
set({ me: res.data });
|
|
set({ isAdmin: res.data.orgs?.includes('admin') });
|
|
}
|
|
},
|
|
openUser: false,
|
|
setOpenUser: (openUser) => set({ openUser }),
|
|
switchOrg: async (username?: string, type?: string) => {
|
|
const res = await queryLogin.switchUser(username || '');
|
|
if (res.code === 200) {
|
|
toast.success('Switch success');
|
|
setTimeout(() => {
|
|
window.location.reload();
|
|
}, 1000);
|
|
} else {
|
|
toast.error(res.message || 'Request failed');
|
|
}
|
|
},
|
|
isAdmin: false,
|
|
setIsAdmin: (isAdmin) => set({ isAdmin }),
|
|
checkHasOrg: () => {
|
|
const user = get().me || {};
|
|
if (!user.orgs) {
|
|
return false;
|
|
}
|
|
return user?.orgs?.length > 0;
|
|
},
|
|
}));
|