FactuGES_ERP/apps/web/src/components/module-routes.tsx

58 lines
1.6 KiB
TypeScript
Raw Normal View History

2026-05-04 18:33:24 +00:00
import type { IModuleClient, ModuleClientParams } from "@erp/core/client";
import type { JSX } from "react";
import { type RouteObject, useRoutes } from "react-router-dom";
2025-05-28 14:21:09 +00:00
interface ModuleRoutesProps {
modules: IModuleClient[];
params: ModuleClientParams;
}
interface WarpIfProtectedProps {
component: JSX.Element;
isProtected: boolean;
}
2026-05-05 11:34:36 +00:00
// biome-ignore lint/correctness/noUnusedVariables: <posible uso futuro>
2025-05-28 14:21:09 +00:00
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);
};