import { create } from "zustand"; import { persist, createJSONStorage } from "zustand/middleware"; import AsyncStorage from "@react-native-async-storage/async-storage"; export type UserRole = | "ADMIN" | "BUSINESS_OWNER" | "EMPLOYEE" | "ACCOUNTANT" | "CUSTOMER_SERVICE" | "AUDITOR" | "VIEWER"; export interface User { id: string; email: string; firstName: string; lastName: string; phone: string; role: UserRole; avatar?: string; } interface AuthState { user: User | null; token: string | null; refreshToken: string | null; isAuthenticated: boolean; setAuth: (user: User, token: string, refreshToken?: string) => void; logout: () => Promise; updateUser: (user: Partial) => void; } export const useAuthStore = create()( persist( (set) => ({ user: null, token: null, refreshToken: null, isAuthenticated: false, setAuth: (user, token, refreshToken = undefined) => { console.log("[AuthStore] Setting auth state:", { hasUser: !!user, hasToken: !!token, hasRefreshToken: !!refreshToken, }); set({ user, token, refreshToken: refreshToken ?? null, isAuthenticated: true, }); }, logout: async () => { console.log("[AuthStore] Logging out..."); const { isAuthenticated, token } = useAuthStore.getState(); if (isAuthenticated && token) { try { // Use require to avoid circularity and module flag errors const { api } = require("./api"); await api.auth.logout(); console.log("[AuthStore] Server-side logout success."); } catch (e: any) { console.warn("[AuthStore] Server-side logout failed:", e.message); } } set({ user: null, token: null, refreshToken: null, isAuthenticated: false, }); }, updateUser: (updatedUser) => set((state) => { console.log("[AuthStore] Updating user profile."); return { user: state.user ? { ...state.user, ...updatedUser } : null, }; }), }), { name: "yaltopia-auth-storage", storage: createJSONStorage(() => AsyncStorage), }, ), );