40 lines
1.1 KiB
TypeScript
40 lines
1.1 KiB
TypeScript
import { create } from 'zustand';
|
|
|
|
export interface User {
|
|
id: number;
|
|
username: string;
|
|
email: string;
|
|
is_admin: boolean;
|
|
}
|
|
|
|
interface AuthState {
|
|
user: User | null;
|
|
token: string | null;
|
|
isAuthenticated: boolean;
|
|
login: (user: User, token: string) => void;
|
|
updateUser: (user: Partial<User>) => void;
|
|
logout: () => void;
|
|
}
|
|
|
|
export const useAuthStore = create<AuthState>((set) => ({
|
|
user: JSON.parse(localStorage.getItem('user') || 'null'),
|
|
token: localStorage.getItem('token'),
|
|
isAuthenticated: !!localStorage.getItem('token'),
|
|
login: (user, token) => {
|
|
localStorage.setItem('user', JSON.stringify(user));
|
|
localStorage.setItem('token', token);
|
|
set({ user, token, isAuthenticated: true });
|
|
},
|
|
updateUser: (updatedUser) => set((state) => {
|
|
const user = state.user ? { ...state.user, ...updatedUser } : null;
|
|
if (user) {
|
|
localStorage.setItem('user', JSON.stringify(user));
|
|
}
|
|
return { user };
|
|
}),
|
|
logout: () => {
|
|
localStorage.removeItem('user');
|
|
localStorage.removeItem('token');
|
|
set({ user: null, token: null, isAuthenticated: false });
|
|
},
|
|
})); |