add better page metadata titles

This commit is contained in:
miloschwartz
2026-04-18 12:05:54 -07:00
parent dddf060e1a
commit 20ed9966b9
57 changed files with 337 additions and 12 deletions

View File

@@ -12,6 +12,11 @@ import type { ListRolesResponse } from "@server/routers/role";
import type { AxiosResponse } from "axios";
import { getTranslations } from "next-intl/server";
import { tierMatrix } from "@server/lib/billing/tierMatrix";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Approvals"
};
export interface ApprovalFeedPageProps {
params: Promise<{ orgId: string }>;

View File

@@ -7,6 +7,11 @@ import { getTranslations } from "next-intl/server";
import { getCachedOrgUser } from "@app/lib/api/getCachedOrgUser";
import { getCachedOrg } from "@app/lib/api/getCachedOrg";
import { build } from "@server/build";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Billing"
};
type BillingSettingsProps = {
children: React.ReactNode;

View File

@@ -6,6 +6,11 @@ import { authCookieHeader } from "@app/lib/api/cookies";
import { HorizontalTabs, TabItem } from "@app/components/HorizontalTabs";
import SettingsSectionTitle from "@app/components/SettingsSectionTitle";
import { getTranslations } from "next-intl/server";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Identity Provider"
};
interface SettingsLayoutProps {
children: React.ReactNode;

View File

@@ -1,5 +1,10 @@
import type { Metadata } from "next";
import { redirect } from "next/navigation";
export const metadata: Metadata = {
title: "Identity Provider"
};
export default async function IdpPage(props: {
params: Promise<{ orgId: string; idpId: string }>;
}) {

View File

@@ -0,0 +1,10 @@
import type { Metadata } from "next";
import type { ReactNode } from "react";
export const metadata: Metadata = {
title: "Create Identity Provider"
};
export default function Layout({ children }: { children: ReactNode }) {
return children;
}

View File

@@ -7,6 +7,11 @@ import { getTranslations } from "next-intl/server";
import { PaidFeaturesAlert } from "@app/components/PaidFeaturesAlert";
import { IdpGlobalModeBanner } from "@app/components/IdpGlobalModeBanner";
import { tierMatrix } from "@server/lib/billing/tierMatrix";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Identity Providers"
};
type OrgIdpPageProps = {
params: Promise<{ orgId: string }>;

View File

@@ -3,6 +3,11 @@ import { internal } from "@app/lib/api";
import { authCookieHeader } from "@app/lib/api/cookies";
import { ListGeneratedLicenseKeysResponse } from "@server/routers/generatedLicense/types";
import { AxiosResponse } from "axios";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Enterprise Licenses"
};
type Props = {
params: Promise<{ orgId: string }>;

View File

@@ -1,5 +1,10 @@
import type { Metadata } from "next";
import { redirect } from "next/navigation";
export const metadata: Metadata = {
title: "Remote Exit Node"
};
export default async function RemoteExitNodePage(props: {
params: Promise<{ orgId: string; remoteExitNodeId: string }>;
}) {

View File

@@ -0,0 +1,10 @@
import type { Metadata } from "next";
import type { ReactNode } from "react";
export const metadata: Metadata = {
title: "Create Remote Exit Node"
};
export default function Layout({ children }: { children: ReactNode }) {
return children;
}

View File

@@ -7,6 +7,11 @@ import ExitNodesTable, {
} from "@app/components/ExitNodesTable";
import SettingsSectionTitle from "@app/components/SettingsSectionTitle";
import { getTranslations } from "next-intl/server";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Remote Exit Nodes"
};
type RemoteExitNodesPageProps = {
params: Promise<{ orgId: string }>;

View File

@@ -11,6 +11,11 @@ import UserProvider from "@app/providers/UserProvider";
import { verifySession } from "@app/lib/auth/verifySession";
import SettingsSectionTitle from "@app/components/SettingsSectionTitle";
import { getTranslations } from "next-intl/server";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Invitations"
};
type InvitationsPageProps = {
params: Promise<{ orgId: string }>;

View File

@@ -1,5 +1,10 @@
import type { Metadata } from "next";
import { redirect } from "next/navigation";
export const metadata: Metadata = {
title: "Access"
};
type AccessPageProps = {
params: Promise<{ orgId: string }>;
};

View File

@@ -8,6 +8,11 @@ import RolesTable, { type RoleRow } from "@app/components/RolesTable";
import SettingsSectionTitle from "@app/components/SettingsSectionTitle";
import { getTranslations } from "next-intl/server";
import { getCachedOrg } from "@app/lib/api/getCachedOrg";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Roles"
};
type RolesPageProps = {
params: Promise<{ orgId: string }>;

View File

@@ -8,6 +8,11 @@ import { HorizontalTabs } from "@app/components/HorizontalTabs";
import { cache } from "react";
import SettingsSectionTitle from "@app/components/SettingsSectionTitle";
import { getTranslations } from "next-intl/server";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "User"
};
interface UserLayoutProps {
children: React.ReactNode;

View File

@@ -1,5 +1,10 @@
import type { Metadata } from "next";
import { redirect } from "next/navigation";
export const metadata: Metadata = {
title: "User"
};
export default async function UserPage(props: {
params: Promise<{ orgId: string; userId: string }>;
}) {

View File

@@ -0,0 +1,10 @@
import type { Metadata } from "next";
import type { ReactNode } from "react";
export const metadata: Metadata = {
title: "Create User"
};
export default function Layout({ children }: { children: ReactNode }) {
return children;
}

View File

@@ -11,6 +11,11 @@ import UserProvider from "@app/providers/UserProvider";
import { verifySession } from "@app/lib/auth/verifySession";
import SettingsSectionTitle from "@app/components/SettingsSectionTitle";
import { getTranslations } from "next-intl/server";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Users"
};
type UsersPageProps = {
params: Promise<{ orgId: string }>;

View File

@@ -7,6 +7,11 @@ import { GetApiKeyResponse } from "@server/routers/apiKeys";
import ApiKeyProvider from "@app/providers/ApiKeyProvider";
import { HorizontalTabs } from "@app/components/HorizontalTabs";
import { getTranslations } from "next-intl/server";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "API Key"
};
interface SettingsLayoutProps {
children: React.ReactNode;

View File

@@ -1,5 +1,10 @@
import type { Metadata } from "next";
import { redirect } from "next/navigation";
export const metadata: Metadata = {
title: "API Key"
};
export default async function ApiKeysPage(props: {
params: Promise<{ orgId: string; apiKeyId: string }>;
}) {

View File

@@ -0,0 +1,10 @@
import type { Metadata } from "next";
import type { ReactNode } from "react";
export const metadata: Metadata = {
title: "Create API Key"
};
export default function Layout({ children }: { children: ReactNode }) {
return children;
}

View File

@@ -2,11 +2,14 @@ import { internal } from "@app/lib/api";
import { authCookieHeader } from "@app/lib/api/cookies";
import { AxiosResponse } from "axios";
import SettingsSectionTitle from "@app/components/SettingsSectionTitle";
import OrgApiKeysTable, {
OrgApiKeyRow
} from "@app/components/OrgApiKeysTable";
import OrgApiKeysTable, { OrgApiKeyRow } from "@app/components/OrgApiKeysTable";
import { ListOrgApiKeysResponse } from "@server/routers/apiKeys";
import { getTranslations } from "next-intl/server";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "API Keys"
};
type ApiKeyPageProps = {
params: Promise<{ orgId: string }>;

View File

@@ -17,7 +17,7 @@ type BluePrintsPageProps = {
};
export const metadata: Metadata = {
title: "Blueprint Detail"
title: "Edit Blueprint"
};
export default async function BluePrintDetailPage(props: BluePrintsPageProps) {

View File

@@ -12,7 +12,7 @@ export interface CreateBlueprintPageProps {
}
export const metadata: Metadata = {
title: "Create blueprint"
title: "Create Blueprint"
};
export default async function CreateBlueprintPage(

View File

@@ -8,6 +8,11 @@ import { GetClientResponse } from "@server/routers/client";
import { AxiosResponse } from "axios";
import { getTranslations } from "next-intl/server";
import { redirect } from "next/navigation";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Machine Client"
};
type SettingsLayoutProps = {
children: React.ReactNode;

View File

@@ -1,5 +1,10 @@
import type { Metadata } from "next";
import { redirect } from "next/navigation";
export const metadata: Metadata = {
title: "Machine Client"
};
export default async function ClientPage(props: {
params: Promise<{ orgId: string; niceId: number | string }>;
}) {

View File

@@ -0,0 +1,10 @@
import type { Metadata } from "next";
import type { ReactNode } from "react";
export const metadata: Metadata = {
title: "Create Machine Client"
};
export default function Layout({ children }: { children: ReactNode }) {
return children;
}

View File

@@ -8,6 +8,11 @@ import { ListClientsResponse } from "@server/routers/client";
import { AxiosResponse } from "axios";
import { getTranslations } from "next-intl/server";
import type { Pagination } from "@server/types/Pagination";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Machine Clients"
};
type ClientsPageProps = {
params: Promise<{ orgId: string }>;

View File

@@ -1,5 +1,10 @@
import type { Metadata } from "next";
import { redirect } from "next/navigation";
export const metadata: Metadata = {
title: "Clients"
};
type ClientsPageProps = {
params: Promise<{ orgId: string }>;
searchParams: Promise<{ view?: string }>;

View File

@@ -8,6 +8,11 @@ import { GetClientResponse } from "@server/routers/client";
import { AxiosResponse } from "axios";
import { getTranslations } from "next-intl/server";
import { redirect } from "next/navigation";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "User Device"
};
type SettingsLayoutProps = {
children: React.ReactNode;

View File

@@ -1,10 +1,13 @@
import type { Metadata } from "next";
import { redirect } from "next/navigation";
export const metadata: Metadata = {
title: "User Device"
};
export default async function ClientPage(props: {
params: Promise<{ orgId: string; niceId: number | string }>;
}) {
const params = await props.params;
redirect(
`/${params.orgId}/settings/clients/user/${params.niceId}/general`
);
redirect(`/${params.orgId}/settings/clients/user/${params.niceId}/general`);
}

View File

@@ -7,6 +7,11 @@ import { type ListUserDevicesResponse } from "@server/routers/client";
import type { Pagination } from "@server/types/Pagination";
import { AxiosResponse } from "axios";
import { getTranslations } from "next-intl/server";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "User Devices"
};
type ClientsPageProps = {
params: Promise<{ orgId: string }>;

View File

@@ -11,6 +11,11 @@ import { GetDNSRecordsResponse } from "@server/routers/domain";
import DNSRecordsTable from "@app/components/DNSRecordTable";
import DomainCertForm from "@app/components/DomainCertForm";
import { build } from "@server/build";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Domain"
};
interface DomainSettingsPageProps {
params: Promise<{ domainId: string; orgId: string }>;

View File

@@ -11,6 +11,11 @@ import OrgProvider from "@app/providers/OrgProvider";
import { ListDomainsResponse } from "@server/routers/domain";
import { toUnicode } from "punycode";
import { getCachedOrg } from "@app/lib/api/getCachedOrg";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Domains"
};
type Props = {
params: Promise<{ orgId: string }>;

View File

@@ -11,6 +11,7 @@ import {
GetLoginPageResponse
} from "@server/routers/loginPage/types";
import { AxiosResponse } from "axios";
import type { Metadata } from "next";
import { redirect } from "next/navigation";
export interface AuthPageProps {

View File

@@ -11,6 +11,11 @@ import { getCachedOrg } from "@app/lib/api/getCachedOrg";
import { getCachedOrgUser } from "@app/lib/api/getCachedOrgUser";
import { build } from "@server/build";
import { pullEnv } from "@app/lib/pullEnv";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Organization"
};
type GeneralSettingsProps = {
children: React.ReactNode;

View File

@@ -0,0 +1,10 @@
import type { Metadata } from "next";
import type { ReactNode } from "react";
export const metadata: Metadata = {
title: "Access Logs"
};
export default function Layout({ children }: { children: ReactNode }) {
return children;
}

View File

@@ -0,0 +1,10 @@
import type { Metadata } from "next";
import type { ReactNode } from "react";
export const metadata: Metadata = {
title: "Action Logs"
};
export default function Layout({ children }: { children: ReactNode }) {
return children;
}

View File

@@ -2,6 +2,11 @@ import { LogAnalyticsData } from "@app/components/LogAnalyticsData";
import SettingsSectionTitle from "@app/components/SettingsSectionTitle";
import { getTranslations } from "next-intl/server";
import { Suspense } from "react";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Log Analytics"
};
export interface AnalyticsPageProps {
params: Promise<{ orgId: string }>;

View File

@@ -0,0 +1,10 @@
import type { Metadata } from "next";
import type { ReactNode } from "react";
export const metadata: Metadata = {
title: "Connection Logs"
};
export default function Layout({ children }: { children: ReactNode }) {
return children;
}

View File

@@ -1,3 +1,9 @@
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Logs"
};
export default function GeneralPage() {
return null;
}

View File

@@ -0,0 +1,10 @@
import type { Metadata } from "next";
import type { ReactNode } from "react";
export const metadata: Metadata = {
title: "Request Logs"
};
export default function Layout({ children }: { children: ReactNode }) {
return children;
}

View File

@@ -0,0 +1,10 @@
import type { Metadata } from "next";
import type { ReactNode } from "react";
export const metadata: Metadata = {
title: "Streaming Logs"
};
export default function Layout({ children }: { children: ReactNode }) {
return children;
}

View File

@@ -1,5 +1,10 @@
import type { Metadata } from "next";
import { redirect } from "next/navigation";
export const metadata: Metadata = {
title: "Settings"
};
type OrgPageProps = {
params: Promise<{ orgId: string }>;
};

View File

@@ -12,6 +12,11 @@ import DismissableBanner from "@app/components/DismissableBanner";
import Link from "next/link";
import { Button } from "@app/components/ui/button";
import { ArrowRight, Plug } from "lucide-react";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Provisioning Keys"
};
type ProvisioningKeysPageProps = {
params: Promise<{ orgId: string }>;

View File

@@ -1,5 +1,10 @@
import type { Metadata } from "next";
import { redirect } from "next/navigation";
export const metadata: Metadata = {
title: "Provisioning"
};
type ProvisioningPageProps = {
params: Promise<{ orgId: string }>;
};
@@ -7,4 +12,4 @@ type ProvisioningPageProps = {
export default async function ProvisioningPage(props: ProvisioningPageProps) {
const params = await props.params;
redirect(`/${params.orgId}/settings/provisioning/keys`);
}
}

View File

@@ -11,6 +11,11 @@ import { Button } from "@app/components/ui/button";
import { ArrowRight, Plug } from "lucide-react";
import { PaidFeaturesAlert } from "@app/components/PaidFeaturesAlert";
import { TierFeature, tierMatrix } from "@server/lib/billing/tierMatrix";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Pending Sites"
};
type PendingSitesPageProps = {
params: Promise<{ orgId: string }>;

View File

@@ -10,8 +10,13 @@ import type { ListResourcesResponse } from "@server/routers/resource";
import type { ListAllSiteResourcesByOrgResponse } from "@server/routers/siteResource";
import type { AxiosResponse } from "axios";
import { getTranslations } from "next-intl/server";
import type { Metadata } from "next";
import { redirect } from "next/navigation";
export const metadata: Metadata = {
title: "Private Resources"
};
export interface ClientResourcesPageProps {
params: Promise<{ orgId: string }>;
searchParams: Promise<Record<string, string>>;

View File

@@ -1,5 +1,10 @@
import type { Metadata } from "next";
import { redirect } from "next/navigation";
export const metadata: Metadata = {
title: "Public Resources"
};
export interface ResourcesPageProps {
params: Promise<{ orgId: string }>;
}

View File

@@ -14,6 +14,11 @@ import OrgProvider from "@app/providers/OrgProvider";
import { cache } from "react";
import ResourceInfoBox from "@app/components/ResourceInfoBox";
import { getTranslations } from "next-intl/server";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Public Resource"
};
export const dynamic = "force-dynamic";

View File

@@ -1,5 +1,10 @@
import type { Metadata } from "next";
import { redirect } from "next/navigation";
export const metadata: Metadata = {
title: "Proxy Resource"
};
export default async function ResourcePage(props: {
params: Promise<{ niceId: string; orgId: string }>;
}) {

View File

@@ -0,0 +1,10 @@
import type { Metadata } from "next";
import type { ReactNode } from "react";
export const metadata: Metadata = {
title: "Create Public Resource"
};
export default function Layout({ children }: { children: ReactNode }) {
return children;
}

View File

@@ -13,6 +13,11 @@ import { getTranslations } from "next-intl/server";
import { redirect } from "next/navigation";
import { toUnicode } from "punycode";
import { cache } from "react";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Proxy Resources"
};
export interface ProxyResourcesPageProps {
params: Promise<{ orgId: string }>;

View File

@@ -7,10 +7,13 @@ import { cache } from "react";
import { GetOrgResponse } from "@server/routers/org";
import OrgProvider from "@app/providers/OrgProvider";
import { ListAccessTokensResponse } from "@server/routers/accessToken";
import ShareLinksTable, {
ShareLinkRow
} from "@app/components/ShareLinksTable";
import ShareLinksTable, { ShareLinkRow } from "@app/components/ShareLinksTable";
import { getTranslations } from "next-intl/server";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Shareable Links"
};
type ShareLinksPageProps = {
params: Promise<{ orgId: string }>;

View File

@@ -8,7 +8,11 @@ import { HorizontalTabs } from "@app/components/HorizontalTabs";
import SettingsSectionTitle from "@app/components/SettingsSectionTitle";
import SiteInfoCard from "@app/components/SiteInfoCard";
import { getTranslations } from "next-intl/server";
import type { Metadata } from "next";
export const metadata: Metadata = {
title: "Site"
};
interface SettingsLayoutProps {
children: React.ReactNode;

View File

@@ -1,5 +1,10 @@
import type { Metadata } from "next";
import { redirect } from "next/navigation";
export const metadata: Metadata = {
title: "Site"
};
export default async function SitePage(props: {
params: Promise<{ orgId: string; niceId: string }>;
}) {

View File

@@ -0,0 +1,10 @@
import type { Metadata } from "next";
import type { ReactNode } from "react";
export const metadata: Metadata = {
title: "Create Site"
};
export default function Layout({ children }: { children: ReactNode }) {
return children;
}

View File

@@ -5,8 +5,13 @@ import { AxiosResponse } from "axios";
import SitesTable, { SiteRow } from "@app/components/SitesTable";
import SettingsSectionTitle from "@app/components/SettingsSectionTitle";
import SitesBanner from "@app/components/SitesBanner";
import type { Metadata } from "next";
import { getTranslations } from "next-intl/server";
export const metadata: Metadata = {
title: "Sites"
};
type SitesPageProps = {
params: Promise<{ orgId: string }>;
searchParams: Promise<Record<string, string>>;