1import { useMemo } from "react";
2
3import { orderItemsByPreferredIds, sortSidebarV2ProjectGroups } from "../components/Sidebar.logic";
4import { getProjectOrderKey, selectProjectGroupingSettings } from "../logicalProject";
5import { buildSidebarProjectSnapshots } from "../sidebarProjectGrouping";
6import { useEnvironmentIdentities, usePrimaryEnvironmentId } from "../state/environments";
7import { useProjects, useThreadShells } from "../state/entities";
8import { legacyProjectCwdPreferenceKey, useUiStateStore } from "../uiStateStore";
9import { useClientSettings } from "./useSettings";
10
11/** The sidebar's project groups, in the order the sidebar shows them. */
12export function useSidebarProjectGroups() {
13 const projects = useProjects();
14 const threads = useThreadShells();
15 const projectOrder = useUiStateStore((store) => store.projectOrder);
16 const sortOrder = useClientSettings((s) => s.sidebarProjectSortOrder);
17 const groupingSettings = useClientSettings(selectProjectGroupingSettings);
18 const environments = useEnvironmentIdentities();
19 const primaryEnvironmentId = usePrimaryEnvironmentId();
20 const orderedProjects = useMemo(
21 () =>
22 orderItemsByPreferredIds({
23 items: projects,
24 preferredIds: projectOrder,
25 getId: getProjectOrderKey,
26 getPreferenceIds: (project) => [
27 getProjectOrderKey(project),
28 legacyProjectCwdPreferenceKey(project.workspaceRoot),
29 ],
30 }),
31 [projectOrder, projects],
32 );
33 const unsortedGroups = useMemo(() => {
34 const labels = new Map(
35 environments.map((environment) => [environment.environmentId, environment.label] as const),
36 );
37 return buildSidebarProjectSnapshots({
38 projects: sortOrder === "manual" ? orderedProjects : projects,
39 groupScratchProjects: true,
40 settings: groupingSettings,
41 primaryEnvironmentId,
42 resolveEnvironmentLabel: (environmentId) => labels.get(environmentId) ?? null,
43 });
44 }, [environments, groupingSettings, orderedProjects, primaryEnvironmentId, projects, sortOrder]);
45 return useMemo(
46 () => sortSidebarV2ProjectGroups(unsortedGroups, threads, sortOrder),
47 [sortOrder, threads, unsortedGroups],
48 );
49}