Spaces:
Running
Running
| 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; | |