diff --git a/src/features/auth/model/stores/authStore/authStore.ts b/src/features/auth/model/stores/authStore/authStore.ts index 1529e3f..2ea3846 100644 --- a/src/features/auth/model/stores/authStore/authStore.ts +++ b/src/features/auth/model/stores/authStore/authStore.ts @@ -1,9 +1,66 @@ import { create } from "zustand"; import type { AuthStore } from "../../types/store"; +import { login, logout, register } from "../../../api"; +import { callApi } from "shared/utils"; export const useAuthStore = create()((set) => ({ user: undefined, status: "idle", setUser: (user) => set({ user }), setStatus: (status) => set({ status }), + + login: async (loginData) => { + set({ status: "loading" }); + try { + const [responseData, loginError] = await callApi(() => login(loginData)); + + if (loginError) { + set({ status: "unauthenticated" }); + return; + } + + set({ + status: "authenticated", + user: responseData?.user, + }); + } catch (err) { + console.warn(err); + set({ status: "idle" }); + } + }, + register: async (registerData) => { + try { + const [responseData, registerError] = await callApi(() => + register(registerData), + ); + + if (registerError) { + set({ status: "unauthenticated" }); + return; + } + + set({ + status: "authenticated", + user: responseData?.user, + }); + } catch (err) { + console.warn(err); + set({ status: "idle" }); + } + }, + logout: async () => { + set({ status: "loading" }); + try { + const [, logoutError] = await callApi(() => logout()); + + if (logoutError) { + set({ status: "authenticated" }); + } + + set({ status: "unauthenticated", user: undefined }); + } catch (err) { + console.warn(err); + set({ status: "idle" }); + } + }, })); diff --git a/src/features/auth/model/types/store.ts b/src/features/auth/model/types/store.ts index 0a25b87..9d23616 100644 --- a/src/features/auth/model/types/store.ts +++ b/src/features/auth/model/types/store.ts @@ -1,7 +1,8 @@ import type { User } from "entities/User"; -import type { AuthStatus } from "./service"; +import type { AuthData, AuthStatus } from "./service"; export interface AuthStoreState { + /** * User's credentials */ @@ -12,9 +13,18 @@ export interface AuthStoreState { status: AuthStatus; } +export type LoginAction = (data: AuthData) => void; +export type RegisterAction = (data: AuthData) => void; +export type LogoutAction = () => void; + export interface AuthStoreActions { setUser: (user: AuthStoreState["user"] | undefined) => void; setStatus: (status: AuthStoreState["status"]) => void; + + // Async actions + login: LoginAction; + register: RegisterAction; + logout: LogoutAction; } export type AuthStore = AuthStoreState & AuthStoreActions;