95 lines
2.4 KiB
TypeScript
95 lines
2.4 KiB
TypeScript
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;
|
|
permissions: string[];
|
|
isAuthenticated: boolean;
|
|
setAuth: (user: User, token: string, refreshToken?: string, permissions?: string[]) => void;
|
|
logout: () => Promise<void>;
|
|
updateUser: (user: Partial<User>) => void;
|
|
}
|
|
|
|
export const useAuthStore = create<AuthState>()(
|
|
persist(
|
|
(set) => ({
|
|
user: null,
|
|
token: null,
|
|
refreshToken: null,
|
|
permissions: [],
|
|
isAuthenticated: false,
|
|
setAuth: (user, token, refreshToken = undefined, permissions = []) => {
|
|
console.log("[AuthStore] Setting auth state:", {
|
|
hasUser: !!user,
|
|
hasToken: !!token,
|
|
hasRefreshToken: !!refreshToken,
|
|
permissions,
|
|
});
|
|
set({
|
|
user,
|
|
token,
|
|
refreshToken: refreshToken ?? null,
|
|
permissions,
|
|
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,
|
|
permissions: [],
|
|
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),
|
|
},
|
|
),
|
|
);
|