import { Outlet, useRouteLoaderData } from "@remix-run/react"; import { type LoaderFunctionArgs } from "@remix-run/server-runtime"; import { VERSION as coreVersion } from "@trigger.dev/core"; import { type ReactNode } from "react"; import { typedjson, useTypedLoaderData } from "remix-typedjson"; import { RouteErrorDisplay } from "~/components/ErrorDisplay"; import { AppContainer, MainBody } from "~/components/layout/AppLayout"; import { type BuildInfo, OrganizationSettingsSideMenu, } from "~/components/navigation/OrganizationSettingsSideMenu"; import { useOrganization } from "~/hooks/useOrganizations"; import { rbac } from "~/services/rbac.server"; import { ssoController } from "~/services/sso.server"; const SETTINGS_ROUTE_ID = "routes/_app.orgs.$organizationSlug.settings"; export const loader = async ({ request, params }: LoaderFunctionArgs) => { const [isUsingPlugin, isSsoUsingPlugin] = await Promise.all([ rbac.isUsingPlugin(), ssoController.isUsingPlugin(), ]); return typedjson({ buildInfo: { appVersion: process.env.BUILD_APP_VERSION, packageVersion: coreVersion, gitSha: process.env.BUILD_GIT_SHA, gitRefName: process.env.BUILD_GIT_REF_NAME, buildTimestampSeconds: process.env.BUILD_TIMESTAMP_SECONDS, } satisfies BuildInfo, isUsingPlugin, isSsoUsingPlugin, }); }; function SettingsChrome({ buildInfo, isUsingPlugin, isSsoUsingPlugin, children, }: { buildInfo: BuildInfo; isUsingPlugin: boolean; isSsoUsingPlugin: boolean; children: ReactNode; }) { const organization = useOrganization(); return (
{children}
); } export default function Page() { const { buildInfo, isUsingPlugin, isSsoUsingPlugin } = useTypedLoaderData(); return ( ); } // Reconstruct the settings chrome so a permission denial or error on a settings // page renders in the content pane with the settings nav intact. This route's // loader has already run (the error comes from a child route), so its data is // available via useRouteLoaderData. export function ErrorBoundary() { const data = useRouteLoaderData(SETTINGS_ROUTE_ID) as | { buildInfo: BuildInfo; isUsingPlugin: boolean; isSsoUsingPlugin: boolean } | undefined; if (!data) { return ; } return ( ); }