48 lines
1.3 KiB
TypeScript
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);
|
|
});
|