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;
|
2026-05-31 23:56:16 +03:30
|
|
|
/** 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;
|
2026-05-31 23:56:16 +03:30
|
|
|
_setHasHydrated: (v: boolean) => void;
|
2026-05-28 18:45:57 +03:30
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const useAdminAuthStore = create<AdminAuthState>()(
|
|
|
|
|
persist(
|
|
|
|
|
(set, get) => ({
|
|
|
|
|
user: null,
|
2026-05-31 23:56:16 +03:30
|
|
|
_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,
|
|
|
|
|
}),
|
2026-05-31 23:56:16 +03:30
|
|
|
{
|
|
|
|
|
name: "meezi_admin_auth",
|
|
|
|
|
onRehydrateStorage: () => (state) => {
|
|
|
|
|
state?._setHasHydrated(true);
|
|
|
|
|
},
|
|
|
|
|
}
|
2026-05-28 18:45:57 +03:30
|
|
|
)
|
|
|
|
|
);
|