import { type ReactNode, useEffect } from "react"; import type { FoundryBillingPlanId } from "@sandbox-agent/foundry-shared"; import { useInterest } from "@sandbox-agent/foundry-client"; import { Navigate, Outlet, createRootRoute, createRoute, createRouter } from "@tanstack/react-router"; import { MockLayout } from "../components/mock-layout"; import { MockAccountSettingsPage, MockHostedCheckoutPage, MockOrganizationBillingPage, MockOrganizationSelectorPage, MockOrganizationSettingsPage, MockSignInPage, } from "../components/mock-onboarding"; import { defaultWorkspaceId, isMockFrontendClient } from "../lib/env"; import { interestManager } from "../lib/interest"; import { activeMockOrganization, getMockOrganizationById, isAppSnapshotBootstrapping, useMockAppClient, useMockAppSnapshot } from "../lib/mock-app"; const rootRoute = createRootRoute({ component: RootLayout, }); const indexRoute = createRoute({ getParentRoute: () => rootRoute, path: "/", component: IndexRoute, }); const signInRoute = createRoute({ getParentRoute: () => rootRoute, path: "/signin", component: SignInRoute, }); const accountRoute = createRoute({ getParentRoute: () => rootRoute, path: "/account", component: AccountRoute, }); const organizationsRoute = createRoute({ getParentRoute: () => rootRoute, path: "/organizations", component: OrganizationsRoute, }); const organizationSettingsRoute = createRoute({ getParentRoute: () => rootRoute, path: "/organizations/$organizationId/settings", component: OrganizationSettingsRoute, }); const organizationBillingRoute = createRoute({ getParentRoute: () => rootRoute, path: "/organizations/$organizationId/billing", component: OrganizationBillingRoute, }); const organizationCheckoutRoute = createRoute({ getParentRoute: () => rootRoute, path: "/organizations/$organizationId/checkout/$planId", component: OrganizationCheckoutRoute, }); const workspaceRoute = createRoute({ getParentRoute: () => rootRoute, path: "/workspaces/$workspaceId", component: WorkspaceLayoutRoute, }); const workspaceIndexRoute = createRoute({ getParentRoute: () => workspaceRoute, path: "/", component: WorkspaceRoute, }); const taskRoute = createRoute({ getParentRoute: () => workspaceRoute, path: "tasks/$taskId", validateSearch: (search: Record) => ({ sessionId: typeof search.sessionId === "string" && search.sessionId.trim().length > 0 ? search.sessionId : undefined, }), component: TaskRoute, }); const repoRoute = createRoute({ getParentRoute: () => workspaceRoute, path: "repos/$repoId", component: RepoRoute, }); const routeTree = rootRoute.addChildren([ indexRoute, signInRoute, accountRoute, organizationsRoute, organizationSettingsRoute, organizationBillingRoute, organizationCheckoutRoute, workspaceRoute.addChildren([workspaceIndexRoute, taskRoute, repoRoute]), ]); export const router = createRouter({ routeTree }); declare module "@tanstack/react-router" { interface Register { router: typeof router; } } function WorkspaceLayoutRoute() { return ; } function AppLoadingScreen({ label }: { label: string }) { return (
{label}
); } function IndexRoute() { const snapshot = useMockAppSnapshot(); if (!isMockFrontendClient && isAppSnapshotBootstrapping(snapshot)) { return ; } if (snapshot.auth.status === "signed_out") { return ; } const activeOrganization = activeMockOrganization(snapshot); if (activeOrganization) { return ; } return ; } function SignInRoute() { const snapshot = useMockAppSnapshot(); if (!isMockFrontendClient && isAppSnapshotBootstrapping(snapshot)) { return ; } if (snapshot.auth.status === "signed_in") { return ; } return ; } function AccountRoute() { const snapshot = useMockAppSnapshot(); if (!isMockFrontendClient && isAppSnapshotBootstrapping(snapshot)) { return ; } if (snapshot.auth.status === "signed_out") { return ; } return ; } function OrganizationsRoute() { const snapshot = useMockAppSnapshot(); if (!isMockFrontendClient && isAppSnapshotBootstrapping(snapshot)) { return ; } if (snapshot.auth.status === "signed_out") { return ; } return ; } function OrganizationSettingsRoute() { const snapshot = useMockAppSnapshot(); if (!isMockFrontendClient && isAppSnapshotBootstrapping(snapshot)) { return ; } if (snapshot.auth.status === "signed_out") { return ; } const { organizationId } = organizationSettingsRoute.useParams(); const organization = getMockOrganizationById(snapshot, organizationId); if (!organization) { return ; } return ; } function OrganizationBillingRoute() { const snapshot = useMockAppSnapshot(); if (!isMockFrontendClient && isAppSnapshotBootstrapping(snapshot)) { return ; } if (snapshot.auth.status === "signed_out") { return ; } const { organizationId } = organizationBillingRoute.useParams(); const organization = getMockOrganizationById(snapshot, organizationId); if (!organization) { return ; } return ; } function OrganizationCheckoutRoute() { const snapshot = useMockAppSnapshot(); if (!isMockFrontendClient && isAppSnapshotBootstrapping(snapshot)) { return ; } if (snapshot.auth.status === "signed_out") { return ; } const { organizationId, planId } = organizationCheckoutRoute.useParams(); const organization = getMockOrganizationById(snapshot, organizationId); if (!organization) { return ; } return ; } function WorkspaceRoute() { const { workspaceId } = workspaceRoute.useParams(); return ( ); } function WorkspaceView({ workspaceId, selectedTaskId, selectedSessionId, }: { workspaceId: string; selectedTaskId: string | null; selectedSessionId: string | null; }) { return ; } function TaskRoute() { const { workspaceId, taskId } = taskRoute.useParams(); const { sessionId } = taskRoute.useSearch(); return ( ); } function TaskView({ workspaceId, taskId, sessionId }: { workspaceId: string; taskId: string; sessionId: string | null }) { return ; } function RepoRoute() { const { workspaceId, repoId } = repoRoute.useParams(); return ( ); } function AppWorkspaceGate({ workspaceId, children }: { workspaceId: string; children: ReactNode }) { const client = useMockAppClient(); const snapshot = useMockAppSnapshot(); const organization = snapshot.organizations.find((candidate) => candidate.workspaceId === workspaceId) ?? null; useEffect(() => { if (organization && snapshot.activeOrganizationId !== organization.id) { void client.selectOrganization(organization.id); } }, [client, organization, snapshot.activeOrganizationId]); if (!isMockFrontendClient && isAppSnapshotBootstrapping(snapshot)) { return ; } if (snapshot.auth.status === "signed_out") { return ; } if (!organization) { return isMockFrontendClient ? : ; } return <>{children}; } function RepoRouteInner({ workspaceId, repoId }: { workspaceId: string; repoId: string }) { const workspaceState = useInterest(interestManager, "workspace", { workspaceId }); const activeTaskId = workspaceState.data?.taskSummaries.find((task) => task.repoId === repoId)?.id; if (!activeTaskId) { return ; } return ; } function RootLayout() { return ( <> ); }