ldc-supportweb/resources/ts/back/Components/Layout/Sidebar/SidebarRegistry.tsx
2026-04-24 16:53:58 +02:00

48 lines
1.3 KiB
TypeScript

import { NavListLinksProps } from "@/back/Components/Layout/Sidebar/AppSidebar";
import { AuthProp } from "@/back/types/global";
export type SidebarGroupType = "pages" | "admin" | "modules";
export type SidebarGroupLink = {
link: NavListLinksProps;
group: SidebarGroupType;
};
// eslint-disable-next-line no-unused-vars
type LinkResolver = (auth: AuthProp) => SidebarGroupLink;
export class SidebarRegistry {
private static resolvers: LinkResolver[] = [];
static add(resolver: LinkResolver) {
this.resolvers.push(resolver);
}
static getAll(auth: AuthProp, group: SidebarGroupType): NavListLinksProps[] {
return this.resolvers
.map((resolver) => resolver(auth))
.filter((sidebarGroupLink) => sidebarGroupLink.group === group)
.sort((a, b) =>
a.link.title.localeCompare(b.link.title, undefined, {
sensitivity: "base",
}),
)
.map((sidebarGroupLink) => sidebarGroupLink.link);
}
}
// Add all links presents in files to the registry.
// @ts-expect-error Glob error.
const modules = import.meta.glob("./Links/*.tsx", {
eager: true,
}) as Record<
string,
{
// eslint-disable-next-line no-unused-vars
default: (auth: AuthProp) => SidebarGroupLink;
}
>;
Object.values(modules).forEach((module) => {
SidebarRegistry.add(module.default);
});