App
uses tcmts.react.useAppLinks, which uses tcmts.react.router, which uses tcmts.react.createRouter, which uses IntersectionObserver
The web UI a tcm serve server shows (/forge/): a codebase's front page, namespaces and definitions, search,
contributions and their review, history, branches, releases and people. Each page renders on the server from the
codebase it serves (TCM_SHARE_CODEBASE, or this app's own, under tcm dev); links between them are followed
in the app. tcm dev tcmts.share.App serves tcm's own codebase while you work on it.
import { match, navigate, Stylesheet, useAppLinks, useLocation } from "#codebase/tcmts/react"; import { BranchesPage, CodePage, ContributionPage, ContributionsPage, EntryPage, FORGE_ICON, FrontPage, HistoryPage, PageError, PeoplePage, ReleasesPage, SearchPage, SHARE_STYLE, SignInPage, Toasts, TokenFromLink, } from "#codebase/tcmts/share"; import { RouterProvider } from "react-aria-components"; export function App() { useAppLinks(); const { path, query } = useLocation(); const code = path.startsWith("/code/") ? path.slice(6).replace(/\/+$/, "").split("/").map(decodeURIComponent).join(".") : undefined; const contribution = match("/contributions/:id", path); const entry = match("/history/:hash", path); const page = code ? ( <CodePage name={code} /> ) : path === "/search" ? ( <SearchPage q={query.get("q") ?? ""} /> ) : path === "/contributions" ? ( <ContributionsPage state={query.get("state") ?? "open"} /> ) : contribution ? ( <ContributionPage id={Number(contribution.id)} tab={query.get("tab") ?? ""} /> ) : path === "/history" ? ( <HistoryPage branch={query.get("branch") ?? ""} under={query.get("under") ?? ""} page={Math.max(0, Number(query.get("page")) || 0)} /> ) : entry ? ( <EntryPage hash={entry.hash!} /> ) : path === "/branches" ? ( <BranchesPage /> ) : path === "/releases" ? ( <ReleasesPage /> ) : path === "/people" ? ( <PeoplePage /> ) : path === "/sign-in" ? ( <SignInPage then={query.get("then") ?? "/"} /> ) : ( <FrontPage /> ); return ( <RouterProvider navigate={(href) => navigate(href)}> <Stylesheet css={SHARE_STYLE} /> <link rel="icon" href={FORGE_ICON} /> <TokenFromLink /> <PageError at={`${path}?${query}`}>{page}</PageError> <Toasts /> </RouterProvider> ); }
uses
- tcmts.react.Stylesheet
- tcmts.react.match
- tcmts.react.navigate
- tcmts.react.useAppLinks
- tcmts.react.useLocation
- tcmts.share.BranchesPage
- tcmts.share.CodePage
- tcmts.share.ContributionPage
- tcmts.share.ContributionsPage
- tcmts.share.EntryPage
- tcmts.share.FORGE_ICON
- tcmts.share.FrontPage
- tcmts.share.HistoryPage
- tcmts.share.PageError
- tcmts.share.PeoplePage
- tcmts.share.ReleasesPage
- tcmts.share.SHARE_STYLE
- tcmts.share.SearchPage
- tcmts.share.SignInPage
- tcmts.share.Toasts
- tcmts.share.TokenFromLink