FactuGES_ERP/apps/web/src/components/module-routes.tsx
2026-05-05 13:34:36 +02:00

58 lines
1.6 KiB
TypeScript

import type { IModuleClient, ModuleClientParams } from "@erp/core/client";
import type { JSX } from "react";
import { type RouteObject, useRoutes } from "react-router-dom";
interface ModuleRoutesProps {
modules: IModuleClient[];
params: ModuleClientParams;
}
interface WarpIfProtectedProps {
component: JSX.Element;
isProtected: boolean;
}
// biome-ignore lint/correctness/noUnusedVariables: <posible uso futuro>
const WarpIfProtected = ({ component, isProtected }: WarpIfProtectedProps) => {
return isProtected ? <>{component}</> : component;
};
export const ModuleRoutes = ({ modules, params }: ModuleRoutesProps) => {
const routes: RouteObject[] = [];
if (modules) {
for (const module of modules) {
if (typeof module.routes !== "function") {
console.warn(`[ModuleRoutes] El módulo "${module.name}" no define una función 'routes()'`);
continue;
}
const moduleRoutes = module.routes(params);
if (!Array.isArray(moduleRoutes)) {
console.error(
`[ModuleRoutes] El módulo "${module.name}" debe devolver un RouteObject[], pero devolvió:`,
moduleRoutes
);
continue;
}
const allAreRouteObjects = moduleRoutes.every(
(r) => typeof r === "object" && r.element !== undefined
);
if (!allAreRouteObjects) {
console.error(
`[ModuleRoutes] El módulo "${module.name}" contiene elementos inválidos en su RouteObject[]`,
moduleRoutes
);
continue;
}
routes.push(...moduleRoutes);
}
}
return useRoutes(routes);
};