Files
meezi/web/admin/src/lib/stores/admin-auth.store.ts
T

45 lines
1.3 KiB
TypeScript
Raw Normal View History

2026-05-28 18:45:57 +03:30
import { create } from "zustand";
import { persist } from "zustand/middleware";
import type { AuthTokenResponse } from "@/lib/api/types";
interface AdminAuthState {
user: AuthTokenResponse | null;
/** True once Zustand has finished rehydrating from localStorage. */
_hasHydrated: boolean;
2026-05-28 18:45:57 +03:30
setAuth: (user: AuthTokenResponse) => void;
clearAuth: () => void;
isAuthenticated: () => boolean;
_setHasHydrated: (v: boolean) => void;
2026-05-28 18:45:57 +03:30
}
export const useAdminAuthStore = create<AdminAuthState>()(
persist(
(set, get) => ({
user: null,
_hasHydrated: false,
_setHasHydrated: (v) => set({ _hasHydrated: v }),
2026-05-28 18:45:57 +03:30
setAuth: (user) => {
if (typeof window !== "undefined") {
localStorage.setItem("meezi_admin_access_token", user.accessToken);
localStorage.setItem("meezi_admin_refresh_token", user.refreshToken);
}
set({ user });
},
clearAuth: () => {
if (typeof window !== "undefined") {
localStorage.removeItem("meezi_admin_access_token");
localStorage.removeItem("meezi_admin_refresh_token");
}
set({ user: null });
},
isAuthenticated: () => !!get().user?.accessToken,
}),
{
name: "meezi_admin_auth",
onRehydrateStorage: () => (state) => {
state?._setHasHydrated(true);
},
}
2026-05-28 18:45:57 +03:30
)
);