mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-07-24 21:11:53 +00:00
55 lines
1.4 KiB
TypeScript
55 lines
1.4 KiB
TypeScript
import { create } from "zustand";
|
|
import { createJSONStorage, persist } from "zustand/middleware";
|
|
|
|
import { APP_SIDEBAR_MODE, type AppSidebarMode } from "./types";
|
|
|
|
interface PersistedAppSidebarState {
|
|
mode: AppSidebarMode;
|
|
}
|
|
|
|
interface AppSidebarModeStore extends PersistedAppSidebarState {
|
|
setMode: (mode: AppSidebarMode) => void;
|
|
}
|
|
|
|
function isAppSidebarMode(value: unknown): value is AppSidebarMode {
|
|
return Object.values(APP_SIDEBAR_MODE).some((mode) => mode === value);
|
|
}
|
|
|
|
export function migrateAppSidebarState(
|
|
persistedState: unknown,
|
|
): PersistedAppSidebarState {
|
|
if (typeof persistedState !== "object" || persistedState === null) {
|
|
return { mode: APP_SIDEBAR_MODE.BROWSE };
|
|
}
|
|
|
|
if ("mode" in persistedState && isAppSidebarMode(persistedState.mode)) {
|
|
return { mode: persistedState.mode };
|
|
}
|
|
|
|
if (
|
|
"navigationMode" in persistedState &&
|
|
isAppSidebarMode(persistedState.navigationMode)
|
|
) {
|
|
return { mode: persistedState.navigationMode };
|
|
}
|
|
|
|
return { mode: APP_SIDEBAR_MODE.BROWSE };
|
|
}
|
|
|
|
export const useAppSidebarMode = create<AppSidebarModeStore>()(
|
|
persist(
|
|
(set) => ({
|
|
mode: APP_SIDEBAR_MODE.BROWSE,
|
|
setMode: (mode) => set({ mode }),
|
|
}),
|
|
{
|
|
name: "sidebar",
|
|
storage: createJSONStorage(() => localStorage),
|
|
merge: (persistedState, currentState) => ({
|
|
...currentState,
|
|
...migrateAppSidebarState(persistedState),
|
|
}),
|
|
},
|
|
),
|
|
);
|