Spaces:
Running
Running
File size: 1,565 Bytes
308a91d f2688f7 7d6eeaa 308a91d 454ca1f 308a91d 454ca1f 308a91d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | import { create } from 'zustand';
import { login as loginApi } from '../api/auth';
const useAuthStore = create((set) => ({
user: JSON.parse(localStorage.getItem('user') || 'null'),
token: localStorage.getItem('token') || null,
isLoading: false,
error: null,
login: async (email, password) => {
set({ isLoading: true, error: null });
try {
const { data } = await loginApi(email, password);
localStorage.setItem('token', data.access_token);
localStorage.setItem('user', JSON.stringify(data.user));
set({ user: data.user, token: data.access_token, isLoading: false });
return data.user;
} catch (err) {
const msg = err.response?.data?.detail || 'Login gagal';
set({ error: msg, isLoading: false });
throw new Error(msg);
}
},
logout: () => {
localStorage.removeItem('token');
localStorage.removeItem('user');
// We intentionally don't call set({ user: null }) here.
// Setting state to null would trigger React Router's <Navigate to="/login">
// before the window.location.href reload completes, causing a flash.
window.location.href = '/';
},
isSuperAdmin: () => {
const state = useAuthStore.getState();
return state.user?.role === 'super_admin';
},
isOwner: () => {
const state = useAuthStore.getState();
return state.user?.role === 'owner';
},
isKasir: () => {
const state = useAuthStore.getState();
return state.user?.role === 'kasir';
},
clearError: () => set({ error: null }),
}));
export default useAuthStore;
|