Yaltopia-Tickets-App/lib/auth-store.ts

90 lines
2.3 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;
isAuthenticated: boolean;
setAuth: (user: User, token: string, refreshToken?: string) => void;
logout: () => Promise<void>;
updateUser: (user: Partial<User>) => void;
}
export const useAuthStore = create<AuthState>()(
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),
},
),
);