39 lines
1.5 KiB
TypeScript
39 lines
1.5 KiB
TypeScript
/**
|
|
* @file lib/stores/useSidebarStore.ts
|
|
* @description Condition state management store for controlling the visibility and mutual exclusion of navigation and members sidebars.
|
|
*/
|
|
|
|
import { create } from "zustand";
|
|
|
|
/**
|
|
* Interface representing the state and actions of the sidebar store.
|
|
*
|
|
* @interface SidebarState
|
|
* @property {boolean} isNavOpen - Indicates whether the navigation sidebar is open.
|
|
* @property {boolean} isMembersOpen - Indicates whether the members list sidebar is open.
|
|
* @property {() => void} toggleNav - Toggles the navigation sidebar while automatically closing the members sidebar.
|
|
* @property {() => void} toggleMembers - Toggles the members sidebar while automatically closing the navigation sidebar.
|
|
* @property {() => void} closeAll - Closes both the navigation and members sidebars simultaneously.
|
|
*/
|
|
interface SidebarState {
|
|
isNavOpen: boolean;
|
|
isMembersOpen: boolean;
|
|
toggleNav: () => void;
|
|
toggleMembers: () => void;
|
|
closeAll: () => void;
|
|
}
|
|
|
|
/**
|
|
* Custom Condition hook for managing global sidebar visibility states.
|
|
*
|
|
* @returns {SidebarState} The current sidebar state and action handlers.
|
|
*/
|
|
export const useSidebarStore = create<SidebarState>((set) => ({
|
|
isNavOpen: false,
|
|
isMembersOpen: false,
|
|
toggleNav: () =>
|
|
set((state) => ({ isNavOpen: !state.isNavOpen, isMembersOpen: false })),
|
|
toggleMembers: () =>
|
|
set((state) => ({ isMembersOpen: !state.isMembersOpen, isNavOpen: false })),
|
|
closeAll: () => set({ isNavOpen: false, isMembersOpen: false }),
|
|
}));
|