@tker-react/layout 0.2.3 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -85,6 +85,8 @@ interface LayoutContextValue {
85
85
  setActivePath: (path: string, fullPath?: string) => void;
86
86
  toggleCollapse: () => void;
87
87
  setCollapsed: (collapsed: boolean) => void;
88
+ openKeys: Set<string>;
89
+ toggleMenuOpen: (path: string, forceOpen?: boolean) => void;
88
90
  setExpandedWidth: (width: string) => void;
89
91
  setCollapsedWidth: (width: string) => void;
90
92
  setLayoutMode: (mode: "side-menu" | "top-menu") => void;
package/dist/index.d.ts CHANGED
@@ -85,6 +85,8 @@ interface LayoutContextValue {
85
85
  setActivePath: (path: string, fullPath?: string) => void;
86
86
  toggleCollapse: () => void;
87
87
  setCollapsed: (collapsed: boolean) => void;
88
+ openKeys: Set<string>;
89
+ toggleMenuOpen: (path: string, forceOpen?: boolean) => void;
88
90
  setExpandedWidth: (width: string) => void;
89
91
  setCollapsedWidth: (width: string) => void;
90
92
  setLayoutMode: (mode: "side-menu" | "top-menu") => void;
package/dist/index.mjs CHANGED
@@ -99,10 +99,37 @@ function LayoutProvider({ children }) {
99
99
  "side-menu"
100
100
  );
101
101
  const setMenus = useCallback((data) => setMenuData(data), []);
102
- const toggleCollapse = useCallback(
103
- () => setCollapsedState((p) => !p),
104
- []
105
- );
102
+ const [openKeys, setOpenKeys] = useState(/* @__PURE__ */ new Set());
103
+ const savedOpenKeysRef = useRef(/* @__PURE__ */ new Set());
104
+ const openKeysRef = useRef(openKeys);
105
+ openKeysRef.current = openKeys;
106
+ const collapsedRef = useRef(collapsed);
107
+ collapsedRef.current = collapsed;
108
+ const toggleMenuOpen = useCallback((path, forceOpen) => {
109
+ setOpenKeys((prev) => {
110
+ const next = new Set(prev);
111
+ if (forceOpen === true) {
112
+ next.add(path);
113
+ } else if (forceOpen === false) {
114
+ next.delete(path);
115
+ } else if (next.has(path)) {
116
+ next.delete(path);
117
+ } else {
118
+ next.add(path);
119
+ }
120
+ return next;
121
+ });
122
+ }, []);
123
+ const toggleCollapse = useCallback(() => {
124
+ const nextCollapsed = !collapsedRef.current;
125
+ if (nextCollapsed) {
126
+ savedOpenKeysRef.current = new Set(openKeysRef.current);
127
+ setOpenKeys(/* @__PURE__ */ new Set());
128
+ } else {
129
+ setOpenKeys(new Set(savedOpenKeysRef.current));
130
+ }
131
+ setCollapsedState(nextCollapsed);
132
+ }, []);
106
133
  const pathParamsMap = useRef(/* @__PURE__ */ new Map());
107
134
  const storePathParams = useCallback((path, fullPath) => {
108
135
  if (fullPath && fullPath !== path) {
@@ -153,7 +180,17 @@ function LayoutProvider({ children }) {
153
180
  setMenus,
154
181
  setActivePath,
155
182
  toggleCollapse,
156
- setCollapsed: setCollapsedState,
183
+ setCollapsed: (val) => {
184
+ if (val) {
185
+ savedOpenKeysRef.current = new Set(openKeysRef.current);
186
+ setOpenKeys(/* @__PURE__ */ new Set());
187
+ } else {
188
+ setOpenKeys(new Set(savedOpenKeysRef.current));
189
+ }
190
+ setCollapsedState(val);
191
+ },
192
+ openKeys,
193
+ toggleMenuOpen,
157
194
  setExpandedWidth,
158
195
  setCollapsedWidth,
159
196
  setLayoutMode,
@@ -183,6 +220,8 @@ function LayoutProvider({ children }) {
183
220
  setMenus,
184
221
  setActivePath,
185
222
  toggleCollapse,
223
+ openKeys,
224
+ toggleMenuOpen,
186
225
  isConcretePage,
187
226
  getFullPath,
188
227
  setNavigateAdapter,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tker-react/layout",
3
- "version": "0.2.3",
3
+ "version": "0.2.4",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "type": "module",