Uecko_ERP/apps/web/src/components/module-routes.tsx
2025-05-28 16:21:09 +02:00

57 lines
1.5 KiB
TypeScript

import { IModuleClient, ModuleClientParams } from "@erp/core/client";
import { JSX } from "react";
import { RouteObject, useRoutes } from "react-router-dom";
interface ModuleRoutesProps {
modules: IModuleClient[];
params: ModuleClientParams;
}
interface WarpIfProtectedProps {
component: JSX.Element;
isProtected: boolean;
}
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);
};