46 lines
1.2 KiB
TypeScript
46 lines
1.2 KiB
TypeScript
import { type NavListLinksProps } from "@/back/Components/Layout/Sidebar/AppSidebar";
|
|
import type { AuthProp, ConfigBackend } from "@/back/types/global";
|
|
|
|
export type SidebarGroupType = "pages" | "admin" | "modules";
|
|
|
|
export interface SidebarGroupLink {
|
|
link: NavListLinksProps;
|
|
group: SidebarGroupType;
|
|
}
|
|
|
|
export type LinkResolver = (
|
|
auth: AuthProp,
|
|
configBackend: ConfigBackend,
|
|
) => SidebarGroupLink;
|
|
|
|
const resolvers: LinkResolver[] = [];
|
|
|
|
export const SidebarRegistry = {
|
|
add(resolver: LinkResolver) {
|
|
resolvers.push(resolver);
|
|
},
|
|
getAll(
|
|
auth: AuthProp,
|
|
configBackend: ConfigBackend,
|
|
group: SidebarGroupType,
|
|
): NavListLinksProps[] {
|
|
return resolvers
|
|
.map((resolver) => resolver(auth, configBackend))
|
|
.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.
|
|
const modules = import.meta.glob<{ default: LinkResolver }>("./Links/*.tsx", {
|
|
eager: true,
|
|
});
|
|
|
|
Object.values(modules).forEach((module) => {
|
|
SidebarRegistry.add(module.default);
|
|
});
|