refactor: LNB 동작 수정
This commit is contained in:
@@ -40,8 +40,7 @@ export function LNB({
|
||||
enabled: !viewOnly,
|
||||
});
|
||||
|
||||
const [openMenuIds, setOpenMenuIds] = useState<number[]>([]);
|
||||
const userClosedMenusRef = useRef(new Set());
|
||||
const [defaultOpenMenuIds, setDefaultOpenMenuIds] = useState<number[]>([]);
|
||||
const prevPathRef = useRef(currentPath);
|
||||
|
||||
function isPathMatched(path: string) {
|
||||
@@ -70,14 +69,13 @@ export function LNB({
|
||||
findMatchedMenus(menuList);
|
||||
|
||||
if (matchedMenuIds.length > 0) {
|
||||
const filteredIds = matchedMenuIds.filter(
|
||||
(id) => !userClosedMenusRef.current.has(id),
|
||||
);
|
||||
setOpenMenuIds((prev) => [...new Set([...prev, ...filteredIds])]);
|
||||
setDefaultOpenMenuIds((prev) => [
|
||||
...new Set([...prev, ...matchedMenuIds]),
|
||||
]);
|
||||
}
|
||||
|
||||
if (prevPathRef.current !== currentPath) {
|
||||
setOpenMenuIds(matchedMenuIds);
|
||||
setDefaultOpenMenuIds(matchedMenuIds);
|
||||
prevPathRef.current = currentPath;
|
||||
}
|
||||
}, [menuList, currentPath]);
|
||||
@@ -133,29 +131,11 @@ export function LNB({
|
||||
}
|
||||
|
||||
function MenuGroup({ item }: { item: MenuItem }) {
|
||||
const { open: isSidebarOpen, setOpen } = useSidebar();
|
||||
const isOpen = openMenuIds.includes(item.menuCd);
|
||||
|
||||
const handleOpenChange = (open: boolean) => {
|
||||
if (!isSidebarOpen) setOpen(true);
|
||||
if (open) {
|
||||
// 열 때는 부모들도 함께 열기
|
||||
if (!openMenuIds.includes(item.menuCd)) {
|
||||
const parentIds = getParentIds(item.menuCd)(menuList ?? []);
|
||||
setOpenMenuIds((prev) => [...prev, ...parentIds, item.menuCd]);
|
||||
}
|
||||
userClosedMenusRef.current.delete(item.menuCd);
|
||||
} else {
|
||||
// 닫을 때는 현재 메뉴만 닫기
|
||||
setOpenMenuIds((prev) => prev.filter((id) => id !== item.menuCd));
|
||||
userClosedMenusRef.current.add(item.menuCd);
|
||||
}
|
||||
};
|
||||
const { open: isSidebarOpen } = useSidebar();
|
||||
|
||||
return (
|
||||
<Collapsible
|
||||
open={isOpen}
|
||||
onOpenChange={handleOpenChange}
|
||||
defaultOpen={defaultOpenMenuIds.includes(item.menuCd)}
|
||||
className="group/collapsible"
|
||||
>
|
||||
<SidebarMenuItem>
|
||||
|
||||
Reference in New Issue
Block a user