Rewrite context routes to use useQueryLoader pattern

Replace loaderFromQueryLoader/loadQuery in route definitions with
useQueryLoader inside dedicated Loader components, matching the
compliance-page pattern. Use index routes instead of redirect hacks.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
This commit is contained in:
Bryan Frimin
2026-03-19 18:03:40 +01:00
parent e1133b1e9a
commit 89882d368c
5 changed files with 116 additions and 96 deletions

View File

@@ -1,113 +1,46 @@
import { lazy } from "@probo/react-lazy";
import {
type AppRoute,
loaderFromQueryLoader,
withQueryRef,
} from "@probo/routes";
import { Fragment } from "react";
import { loadQuery } from "react-relay";
import { type LoaderFunctionArgs, redirect } from "react-router";
import type { AppRoute } from "@probo/routes";
import type { ContextPageLoaderQuery } from "#/__generated__/core/ContextPageLoaderQuery.graphql";
import type { MeetingDetailPageQuery } from "#/__generated__/core/MeetingDetailPageQuery.graphql";
import type { MeetingsPageQuery } from "#/__generated__/core/MeetingsPageQuery.graphql";
import { LinkCardSkeleton } from "#/components/skeletons/LinkCardSkeleton";
import { PageSkeleton } from "#/components/skeletons/PageSkeleton";
import { coreEnvironment } from "#/environments";
import { contextPageQuery } from "#/pages/organizations/context/ContextPageLoader";
import { meetingDetailPageQuery } from "#/pages/organizations/meetings/MeetingDetailPage";
import { meetingsPageQuery } from "#/pages/organizations/meetings/MeetingsPage";
const meetingTabs = (prefix: string) => {
return [
{
path: `${prefix}`,
loader: ({
params: { organizationId, meetingId },
}: LoaderFunctionArgs) => {
const basePath = `/organizations/${organizationId}/context/meetings/${meetingId}`;
const redirectPath = `${basePath}/minutes`;
// eslint-disable-next-line
throw redirect(redirectPath);
},
Component: Fragment,
},
{
path: `${prefix}minutes`,
Fallback: LinkCardSkeleton,
Component: lazy(
() => import("../pages/organizations/meetings/tabs/MeetingMinutesTab"),
),
},
];
};
export const contextRoutes = [
{
path: "context",
Fallback: PageSkeleton,
Component: lazy(
() => import("#/pages/organizations/context/ContextLayout"),
() => import("#/pages/organizations/context/ContextLayoutLoader"),
),
children: [
{
path: "",
loader: ({
params: { organizationId },
}: LoaderFunctionArgs) => {
// eslint-disable-next-line
throw redirect(`/organizations/${organizationId}/context/overview`);
},
Component: Fragment,
},
{
path: "overview",
Fallback: PageSkeleton,
loader: loaderFromQueryLoader(({ organizationId }) =>
loadQuery<ContextPageLoaderQuery>(
coreEnvironment,
contextPageQuery,
{ organizationId },
),
),
Component: withQueryRef(
lazy(
() => import("#/pages/organizations/context/ContextPageLoader"),
),
index: true,
Fallback: LinkCardSkeleton,
Component: lazy(
() => import("#/pages/organizations/context/ContextPageLoader"),
),
},
{
path: "meetings",
Fallback: PageSkeleton,
loader: loaderFromQueryLoader(({ organizationId }) =>
loadQuery<MeetingsPageQuery>(
coreEnvironment,
meetingsPageQuery,
{ organizationId },
),
),
Component: withQueryRef(
lazy(
() => import("#/pages/organizations/meetings/MeetingsPage"),
),
Fallback: LinkCardSkeleton,
Component: lazy(
() => import("#/pages/organizations/meetings/MeetingsPageLoader"),
),
},
{
path: "meetings/:meetingId",
Fallback: PageSkeleton,
loader: loaderFromQueryLoader(({ meetingId }) =>
loadQuery<MeetingDetailPageQuery>(
coreEnvironment,
meetingDetailPageQuery,
{ meetingId },
),
Component: lazy(
() => import("#/pages/organizations/meetings/MeetingDetailPageLoader"),
),
Component: withQueryRef(
lazy(
() => import("../pages/organizations/meetings/MeetingDetailPage"),
),
),
children: [...meetingTabs("")],
children: [
{
index: true,
Fallback: LinkCardSkeleton,
Component: lazy(
() => import("#/pages/organizations/meetings/tabs/MeetingMinutesTab"),
),
},
],
},
],
},