Skip to content

g1t/apps/web/app/routes/workspace/tab-soon.tsx

31 lines1,380 bytesCodeBlame
1import { 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";
7import { SoonView } from "../repo/soon";
8
9/** The tab is the last part of the address: `-/teams` or `-/insights`. */
10const tabOf = (pathname: string) => pathname.replace(/\/+$/, "").split("/").pop() ?? "";
11
12export function meta({ params, ...args }: Route.MetaArgs) {
13 const item = roadmapItem(tabOf(args.location.pathname));
14 return page(args, {
15 title: `${item?.title ?? "Soon"} · ${params.owner} · g1t`,
16 description: item ? `Soon on g1t: ${item.summary}` : null,
17 });
18}
19
20export function loader({ params, context, request }: Route.LoaderArgs) {
21 // For the workspace's members, as their tabs are.
22 if (!roleIn(getViewer(context), params.owner)) throw data(null, { status: 404 });
23 const item = roadmapItem(tabOf(new URL(request.url).pathname));
24 if (!item || item.section !== "Workspace") throw data(null, { status: 404 });
25 return { item };
26}
27
28/** A tab of the workspace's page that is coming: Teams, Insights. */
29export default function WorkspaceTabSoon({ loaderData, params }: Route.ComponentProps) {
30 return <SoonView item={loaderData.item} base={`/${params.owner}/-`} newProject={`/new?workspace=${params.owner}`} />;
31}