56 lines
1.3 KiB
TypeScript
56 lines
1.3 KiB
TypeScript
|
|
import { create } from 'zustand';
|
||
|
|
|
||
|
|
export interface Tenant {
|
||
|
|
id: string;
|
||
|
|
name: string;
|
||
|
|
slug: string;
|
||
|
|
}
|
||
|
|
|
||
|
|
export interface User {
|
||
|
|
id: string;
|
||
|
|
email: string;
|
||
|
|
first_name: string;
|
||
|
|
last_name: string;
|
||
|
|
role: string;
|
||
|
|
avatar_url: string | null;
|
||
|
|
tenants: Tenant[];
|
||
|
|
}
|
||
|
|
|
||
|
|
export interface AuthState {
|
||
|
|
user: User | null;
|
||
|
|
currentTenant: Tenant | null; isAuthenticated: boolean;
|
||
|
|
isLoading: boolean;
|
||
|
|
error: string | null;
|
||
|
|
setUser: (user: User | null) => void;
|
||
|
|
setTenant: (tenant: Tenant | null) => void;
|
||
|
|
setAuthenticated: (authed: boolean) => void;
|
||
|
|
setLoading: (loading: boolean) => void;
|
||
|
|
setError: (error: string | null) => void;
|
||
|
|
logout: () => void;
|
||
|
|
}
|
||
|
|
|
||
|
|
export const useAuthStore = create<AuthState>((set) => ({
|
||
|
|
user: null,
|
||
|
|
currentTenant: null,
|
||
|
|
isAuthenticated: false,
|
||
|
|
isLoading: false,
|
||
|
|
error: null,
|
||
|
|
setUser: (user) =>
|
||
|
|
set({
|
||
|
|
user,
|
||
|
|
isAuthenticated: !!user,
|
||
|
|
currentTenant: user?.tenants?.[0] ?? null,
|
||
|
|
}),
|
||
|
|
setTenant: (tenant) => set({ currentTenant: tenant }),
|
||
|
|
setAuthenticated: (authed) => set({ isAuthenticated: authed }),
|
||
|
|
setLoading: (loading) => set({ isLoading: loading }),
|
||
|
|
setError: (error) => set({ error }),
|
||
|
|
logout: () =>
|
||
|
|
set({
|
||
|
|
user: null,
|
||
|
|
currentTenant: null,
|
||
|
|
isAuthenticated: false,
|
||
|
|
error: null,
|
||
|
|
}),
|
||
|
|
}));
|