import type { IRouterPaths, RouteName, RouterPathPattern } from '@rocket.chat/ui-contexts'; import { type ElementType, type ReactNode } from 'react'; import { appLayout } from './appLayout'; import { router } from '../providers/RouterProvider'; import MainLayout from '../views/root/MainLayout'; type GroupName = 'omnichannel' | 'marketplace' | 'account' | 'admin'; type GroupPrefix = IRouterPaths[`${TGroupName}-index`]['pattern']; type RouteNamesOf = ( | keyof { [TRouteName in RouteName as IRouterPaths[TRouteName]['pattern'] extends `${GroupPrefix}/${string}` ? TRouteName : never]: never; } | `${GroupName}-index` ) & RouteName; type TrimPrefix = T extends `${P}${infer U}` ? U : T; export const createRouteGroup = ( name: TGroupName, prefix: NoInfer>, RouterComponent: ElementType<{ children?: ReactNode; }>, ) => { router.defineRoutes([ { path: prefix, id: `${name}-index`, element: appLayout.wrap( , ), }, ]); return >( path: TrimPrefix>, { name, component: RouteComponent, props, ready = true, }: { name: TRouteName; component: ElementType; props?: Record; ready?: boolean; }, ): [register: () => void, unregister: () => void] => { let unregister: (() => void) | undefined; const register = () => { unregister = router.defineRoutes([ { path: `${prefix}${path}` as RouterPathPattern, id: name, element: appLayout.wrap( , ), }, ]); }; if (ready) { register(); } return [register, () => unregister?.()]; }; };