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); });