167 lines
4.3 KiB
TypeScript
167 lines
4.3 KiB
TypeScript
import { Shell } from './shell';
|
|
import { redirect, RouteObject } from 'react-router-dom';
|
|
import { ProjectsSidebar } from './feature-projects/projects-sidebar';
|
|
import { TasksSidebar } from './feature-tasks/tasks-sidebar';
|
|
import { getEnvironmentConfig } from './hooks/use-environment-config';
|
|
// nx-ignore-next-line
|
|
import { ProjectGraphClientResponse } from 'nx/src/command-line/dep-graph';
|
|
import { getProjectGraphDataService } from './hooks/get-project-graph-data-service';
|
|
import { getProjectGraphService } from './machines/get-services';
|
|
|
|
const { appConfig } = getEnvironmentConfig();
|
|
const projectGraphDataService = getProjectGraphDataService();
|
|
|
|
export function getRoutesForEnvironment() {
|
|
if (getEnvironmentConfig().environment === 'dev') {
|
|
return devRoutes;
|
|
} else {
|
|
return releaseRoutes;
|
|
}
|
|
}
|
|
|
|
const workspaceDataLoader = async (selectedWorkspaceId: string) => {
|
|
const workspaceInfo = appConfig.workspaces.find(
|
|
(graph) => graph.id === selectedWorkspaceId
|
|
);
|
|
|
|
const projectGraph: ProjectGraphClientResponse =
|
|
await projectGraphDataService.getProjectGraph(
|
|
workspaceInfo.projectGraphUrl
|
|
);
|
|
|
|
const targetsSet = new Set<string>();
|
|
|
|
projectGraph.projects.forEach((project) => {
|
|
Object.keys(project.data.targets ?? {}).forEach((targetName) => {
|
|
targetsSet.add(targetName);
|
|
});
|
|
});
|
|
|
|
const targets = Array.from(targetsSet).sort((a, b) => a.localeCompare(b));
|
|
|
|
return { ...projectGraph, targets };
|
|
};
|
|
|
|
const taskDataLoader = async (selectedWorkspaceId: string) => {
|
|
const projectInfo = appConfig.workspaces.find(
|
|
(graph) => graph.id === selectedWorkspaceId
|
|
);
|
|
|
|
return await projectGraphDataService.getTaskGraph(projectInfo.taskGraphUrl);
|
|
};
|
|
|
|
const childRoutes: RouteObject[] = [
|
|
{
|
|
path: 'projects',
|
|
children: [
|
|
{
|
|
index: true,
|
|
element: <ProjectsSidebar />,
|
|
},
|
|
{
|
|
path: 'all',
|
|
element: <ProjectsSidebar />,
|
|
},
|
|
{
|
|
path: 'affected',
|
|
element: <ProjectsSidebar />,
|
|
},
|
|
{
|
|
path: ':focusedProject',
|
|
element: <ProjectsSidebar />,
|
|
},
|
|
{
|
|
path: 'trace/:startTrace',
|
|
element: <ProjectsSidebar />,
|
|
},
|
|
{
|
|
path: 'trace/:startTrace/:endTrace',
|
|
element: <ProjectsSidebar />,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
loader: async ({ request, params }) => {
|
|
const selectedWorkspaceId =
|
|
params.selectedWorkspaceId ?? appConfig.defaultWorkspaceId;
|
|
return taskDataLoader(selectedWorkspaceId);
|
|
},
|
|
path: 'tasks',
|
|
id: 'selectedTarget',
|
|
shouldRevalidate: ({ currentParams, nextParams }) => {
|
|
return (
|
|
!currentParams.selectedWorkspaceId ||
|
|
currentParams.selectedWorkspaceId !== nextParams.selectedWorkspaceId
|
|
);
|
|
},
|
|
children: [
|
|
{
|
|
index: true,
|
|
element: <TasksSidebar />,
|
|
},
|
|
{
|
|
path: ':selectedTarget',
|
|
element: <TasksSidebar />,
|
|
},
|
|
],
|
|
},
|
|
];
|
|
|
|
export const devRoutes: RouteObject[] = [
|
|
{
|
|
path: '/',
|
|
children: [
|
|
{
|
|
index: true,
|
|
loader: async ({ request, params }) => {
|
|
const { search } = new URL(request.url);
|
|
|
|
return redirect(`/${appConfig.defaultWorkspaceId}/projects${search}`);
|
|
},
|
|
},
|
|
{
|
|
path: ':selectedWorkspaceId',
|
|
id: 'selectedWorkspace',
|
|
element: <Shell />,
|
|
shouldRevalidate: ({ currentParams, nextParams }) => {
|
|
return (
|
|
currentParams.selectedWorkspaceId !== nextParams.selectedWorkspaceId
|
|
);
|
|
},
|
|
loader: async ({ request, params }) => {
|
|
const selectedWorkspaceId =
|
|
params.selectedWorkspaceId ?? appConfig.defaultWorkspaceId;
|
|
return workspaceDataLoader(selectedWorkspaceId);
|
|
},
|
|
children: childRoutes,
|
|
},
|
|
],
|
|
},
|
|
];
|
|
|
|
export const releaseRoutes: RouteObject[] = [
|
|
{
|
|
path: '/',
|
|
id: 'selectedWorkspace',
|
|
loader: async ({ request, params }) => {
|
|
const selectedWorkspaceId = appConfig.defaultWorkspaceId;
|
|
return workspaceDataLoader(selectedWorkspaceId);
|
|
},
|
|
shouldRevalidate: () => {
|
|
return false;
|
|
},
|
|
element: <Shell />,
|
|
children: [
|
|
{
|
|
index: true,
|
|
loader: ({ request }) => {
|
|
const { search } = new URL(request.url);
|
|
|
|
return redirect(`/projects${search}`);
|
|
},
|
|
},
|
|
...childRoutes,
|
|
],
|
|
},
|
|
];
|