🚧 WIP: copy command bar from existing PR

This commit is contained in:
Fred KISSIE
2026-06-11 23:46:11 +02:00
parent 3e977ba00d
commit 444d293a29
11 changed files with 986 additions and 39 deletions
@@ -0,0 +1,57 @@
"use client";
import type { SidebarNavSection } from "@app/components/SidebarNav";
import { flattenNavSections } from "@app/lib/flattenNavItems";
import {
hydrateNavHref,
navHrefParamsFromRoute
} from "@app/lib/hydrateNavHref";
import { useParams } from "next/navigation";
import { useMemo } from "react";
import { useTranslations } from "next-intl";
export type NavigationCommand = {
id: string;
title: string;
href: string;
icon?: React.ReactNode;
sectionHeading: string;
};
export type NavigationCommandGroup = {
heading: string;
items: NavigationCommand[];
};
export function useCommandPaletteNavigation(
navItems: SidebarNavSection[]
): NavigationCommandGroup[] {
const params = useParams();
const t = useTranslations();
return useMemo(() => {
const hrefParams = navHrefParamsFromRoute(params);
const flat = flattenNavSections(navItems);
const groups = new Map<string, NavigationCommand[]>();
for (const item of flat) {
const href = hydrateNavHref(item.href, hrefParams);
if (!href) continue;
const groupItems = groups.get(item.sectionHeading) ?? [];
groupItems.push({
id: `nav-${item.sectionHeading}-${item.title}-${href}`,
title: t(item.title),
href,
icon: item.icon,
sectionHeading: item.sectionHeading
});
groups.set(item.sectionHeading, groupItems);
}
return Array.from(groups.entries()).map(([heading, items]) => ({
heading: t(heading),
items
}));
}, [navItems, params, t]);
}