Fix workspace shortcut navigation

This commit is contained in:
Mohamed Boudra
2026-04-20 18:06:09 +07:00
parent 95c1d1fe0f
commit 2cd296e38f
16 changed files with 513 additions and 155 deletions
@@ -1,16 +1,18 @@
import { useCallback, useEffect, useMemo, useState } from "react";
import { useEffect, useMemo } from "react";
import type { SidebarProjectEntry } from "@/hooks/use-sidebar-workspaces-list";
import { useKeyboardShortcutsStore } from "@/stores/keyboard-shortcuts-store";
import { buildSidebarShortcutModel } from "@/utils/sidebar-shortcuts";
import { isSidebarProjectFlattened } from "@/utils/sidebar-project-row-model";
import { useSidebarCollapsedSectionsStore } from "@/stores/sidebar-collapsed-sections-store";
export function useSidebarShortcutModel(projects: SidebarProjectEntry[]) {
const [collapsedProjectKeys, setCollapsedProjectKeys] = useState<Set<string>>(new Set());
const setSidebarShortcutWorkspaceTargets = useKeyboardShortcutsStore(
(state) => state.setSidebarShortcutWorkspaceTargets,
const collapsedProjectKeys = useSidebarCollapsedSectionsStore(
(state) => state.collapsedProjectKeys,
);
const setVisibleWorkspaceTargets = useKeyboardShortcutsStore(
(state) => state.setVisibleWorkspaceTargets,
const setProjectCollapsed = useSidebarCollapsedSectionsStore(
(state) => state.setProjectCollapsed,
);
const toggleProjectCollapsed = useSidebarCollapsedSectionsStore(
(state) => state.toggleProjectCollapsed,
);
const shortcutModel = useMemo(
@@ -23,62 +25,17 @@ export function useSidebarShortcutModel(projects: SidebarProjectEntry[]) {
);
useEffect(() => {
setCollapsedProjectKeys((prev) => {
const collapsibleProjectKeys = new Set(
projects
.filter((project) => !isSidebarProjectFlattened(project))
.map((project) => project.projectKey),
);
const next = new Set<string>();
for (const key of prev) {
if (collapsibleProjectKeys.has(key)) {
next.add(key);
}
const collapsibleProjectKeys = new Set(
projects
.filter((project) => !isSidebarProjectFlattened(project))
.map((project) => project.projectKey),
);
for (const key of collapsedProjectKeys) {
if (!collapsibleProjectKeys.has(key)) {
setProjectCollapsed(key, false);
}
return next;
});
}, [projects]);
useEffect(() => {
setSidebarShortcutWorkspaceTargets(shortcutModel.shortcutTargets);
setVisibleWorkspaceTargets(shortcutModel.visibleTargets);
}, [
setSidebarShortcutWorkspaceTargets,
setVisibleWorkspaceTargets,
shortcutModel.shortcutTargets,
shortcutModel.visibleTargets,
]);
useEffect(() => {
return () => {
setSidebarShortcutWorkspaceTargets([]);
setVisibleWorkspaceTargets([]);
};
}, [setSidebarShortcutWorkspaceTargets, setVisibleWorkspaceTargets]);
const toggleProjectCollapsed = useCallback((projectKey: string) => {
setCollapsedProjectKeys((prev) => {
const next = new Set(prev);
if (next.has(projectKey)) {
next.delete(projectKey);
} else {
next.add(projectKey);
}
return next;
});
}, []);
const setProjectCollapsed = useCallback((projectKey: string, collapsed: boolean) => {
setCollapsedProjectKeys((prev) => {
const next = new Set(prev);
if (collapsed) {
next.add(projectKey);
} else {
next.delete(projectKey);
}
return next;
});
}, []);
}
}, [collapsedProjectKeys, projects, setProjectCollapsed]);
return {
collapsedProjectKeys,