@veracity/vui
Version:
Veracity UI is a React component library crafted for use within Veracity applications and pages. Based on Styled Components and @xstyled.
111 lines (109 loc) • 3.08 kB
JavaScript
import { createContext as createContext$1 } from "../utils/react.js";
import { useCallback, useEffect, useMemo, useReducer, useRef, useState } from "react";
import { jsx } from "react/jsx-runtime";
//#region src/sidemenuV2/context.tsx
const submenuReducer = (state, action) => {
let newState;
switch (action.type) {
case "SET_SUBMENU":
if (state[action.itemId] === action.isOpen) return state;
newState = {
...state,
[action.itemId]: action.isOpen
};
break;
case "TOGGLE_SUBMENU": {
const currentValue = state[action.itemId] || false;
newState = {
...state,
[action.itemId]: !currentValue
};
break;
}
case "RESTORE_STATE":
newState = action.state;
break;
case "RESET_ALL":
newState = {};
break;
default: return state;
}
return newState;
};
const [SidemenuProvider, useSidemenuContext] = createContext$1({ isOptional: true });
const SidemenuStateProvider = ({ children, isExpandedInitial = true, onExpandedChange, variant, size, isDark }) => {
const [isExpanded, setIsExpanded] = useState(isExpandedInitial);
const isInternalChangeRef = useRef(false);
useEffect(() => {
if (!isInternalChangeRef.current) setIsExpanded(isExpandedInitial);
isInternalChangeRef.current = false;
}, [isExpandedInitial]);
const [submenuStates, dispatchSubmenu] = useReducer(submenuReducer, {});
const setSubmenuState = useCallback((itemId, isOpen) => {
dispatchSubmenu({
type: "SET_SUBMENU",
itemId,
isOpen
});
}, []);
const toggleSubmenu = useCallback((itemId) => {
dispatchSubmenu({
type: "TOGGLE_SUBMENU",
itemId
});
}, []);
const handleSetIsExpanded = useCallback((newIsExpanded) => {
isInternalChangeRef.current = true;
setIsExpanded(newIsExpanded);
onExpandedChange?.(newIsExpanded);
}, [onExpandedChange]);
const resetAllStates = useCallback(() => {
dispatchSubmenu({ type: "RESET_ALL" });
const defaultExpanded = isExpandedInitial;
setIsExpanded(defaultExpanded);
onExpandedChange?.(defaultExpanded);
}, [isExpandedInitial, onExpandedChange]);
const resetExpansionOnly = useCallback(() => {
const defaultExpanded = isExpandedInitial;
setIsExpanded(defaultExpanded);
onExpandedChange?.(defaultExpanded);
}, [isExpandedInitial, onExpandedChange]);
const resetSubmenuOnly = useCallback(() => {
dispatchSubmenu({ type: "RESET_ALL" });
}, []);
const contextValue = useMemo(() => ({
size,
variant,
isDark,
isMenuExpanded: isExpanded,
submenuStates,
setSubmenuState,
toggleSubmenu,
setIsExpanded: handleSetIsExpanded,
onExpandedChange,
resetAllStates,
resetExpansionOnly,
resetSubmenuOnly
}), [
size,
variant,
isDark,
isExpanded,
submenuStates,
setSubmenuState,
toggleSubmenu,
handleSetIsExpanded,
onExpandedChange,
resetAllStates,
resetExpansionOnly,
resetSubmenuOnly
]);
return /* @__PURE__ */ jsx(SidemenuProvider, {
value: contextValue,
children
});
};
//#endregion
export { SidemenuProvider, SidemenuStateProvider, useSidemenuContext };
globalThis.__vuiVersion__ = "5.3.1"
//# sourceMappingURL=context.js.map