Files
pos-system/apps/web-admin/src/stores/auth.store.ts
Ho Ngoc Hai 4da46b5b8e Sure! Pl
2025-12-27 01:31:10 +07:00

104 lines
2.8 KiB
TypeScript

import { create } from 'zustand';
import { persist } from 'zustand/middleware';
import { UserResponse } from '@goodgo/types';
import { authApi } from '../services/api/auth.api';
interface AuthState {
user: UserResponse | null;
isAuthenticated: boolean;
isLoading: boolean;
login: (email: string, password: string) => Promise<void>;
register: (email: string, password: string, confirmPassword: string) => Promise<void>;
logout: () => Promise<void>;
fetchUser: () => Promise<void>;
}
export const useAuthStore = create<AuthState>()(
persist(
(set) => ({
user: null,
isAuthenticated: false,
isLoading: false,
login: async (email: string, password: string) => {
set({ isLoading: true });
try {
const response = await authApi.login({ email, password });
if (response.success && response.data) {
set({
user: response.data.user,
isAuthenticated: true,
isLoading: false,
});
} else {
throw new Error(response.error?.message || 'Login failed');
}
} catch (error) {
set({ isLoading: false });
throw error;
}
},
register: async (email: string, password: string, confirmPassword: string) => {
set({ isLoading: true });
try {
const response = await authApi.register({ email, password, confirmPassword });
if (response.success && response.data) {
set({
user: response.data.user,
isAuthenticated: true,
isLoading: false,
});
} else {
throw new Error(response.error?.message || 'Registration failed');
}
} catch (error) {
set({ isLoading: false });
throw error;
}
},
logout: async () => {
try {
await authApi.logout();
} finally {
set({
user: null,
isAuthenticated: false,
});
}
},
fetchUser: async () => {
set({ isLoading: true });
try {
const response = await authApi.getMe();
if (response.success && response.data) {
set({
user: response.data,
isAuthenticated: true,
isLoading: false,
});
} else {
set({
user: null,
isAuthenticated: false,
isLoading: false,
});
}
} catch (error) {
set({
user: null,
isAuthenticated: false,
isLoading: false,
});
}
},
}),
{
name: 'auth-storage',
partialize: (state) => ({ user: state.user, isAuthenticated: state.isAuthenticated }),
}
)
);