Skip to content
32 linesCodeBlameRaw

Pick any line to see why it is the way it is: the commit, the pull request and issue it came from, and what the agent was thinking.

Navigation: the workspace's own page with tabs, pins and recent in the sidebar1import { data } from "react-router";
2
3import type { Route } from "./+types/tab-soon";
4import { page } from "../../lib/meta";
5import { roadmapItem } from "../../lib/roadmap";
6import { getViewer, roleIn } from "../../lib/session.server";
Billing: credits with a kind and expiry, discounts instead of comped, and safer charging7import { pagePath } from "../../lib/workspace-nav";
Navigation: the workspace's own page with tabs, pins and recent in the sidebar8import { SoonView } from "../repo/soon";
9
Teams and CODEOWNERS, labels and milestones, dependency updates, the security suite, and a clearer top bar10/** The tab is the last part of the address: `-/insights`. */
Billing: credits with a kind and expiry, discounts instead of comped, and safer charging11const tabOf = (pathname: string) => pagePath(pathname).split("/").pop() ?? "";
Navigation: the workspace's own page with tabs, pins and recent in the sidebar12
13export function meta({ params, ...args }: Route.MetaArgs) {
14 const item = roadmapItem(tabOf(args.location.pathname));
15 return page(args, {
16 title: `${item?.title ?? "Soon"} · ${params.owner} · g1t`,
17 description: item ? `Soon on g1t: ${item.summary}` : null,
18 });
19}
20
21export function loader({ params, context, request }: Route.LoaderArgs) {
22 // For the workspace's members, as their tabs are.
23 if (!roleIn(getViewer(context), params.owner)) throw data(null, { status: 404 });
24 const item = roadmapItem(tabOf(new URL(request.url).pathname));
25 if (!item || item.section !== "Workspace") throw data(null, { status: 404 });
26 return { item };
27}
28
Teams and CODEOWNERS, labels and milestones, dependency updates, the security suite, and a clearer top bar29/** A tab of the workspace's page that is coming: Insights. */
Navigation: the workspace's own page with tabs, pins and recent in the sidebar30export default function WorkspaceTabSoon({ loaderData, params }: Route.ComponentProps) {
31 return <SoonView item={loaderData.item} base={`/${params.owner}/-`} newProject={`/new?workspace=${params.owner}`} />;
32}