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;