From 489d56dad1e6200192251d1730ea98feaa0d8bda Mon Sep 17 00:00:00 2001 From: Benny Joo Date: Mon, 25 Aug 2025 08:34:46 -0400 Subject: [PATCH] perf: Make /icons page a static page (#23324) * write _generateMetadataForStaticPage * refactor /icons/page.tsx --- apps/web/app/_utils.tsx | 42 +++++++++++++++++++++++++++++++++++++ apps/web/app/icons/page.tsx | 27 ++++++++++++------------ 2 files changed, 56 insertions(+), 13 deletions(-) diff --git a/apps/web/app/_utils.tsx b/apps/web/app/_utils.tsx index f9d6c3705b..166b5782ef 100644 --- a/apps/web/app/_utils.tsx +++ b/apps/web/app/_utils.tsx @@ -80,6 +80,48 @@ export const _generateMetadata = async ( }; }; +export const _generateMetadataForStaticPage = ( + title: string, + description: string, + hideBranding?: boolean, + origin?: string, + pathname?: string +) => { + const _pathname = pathname ?? ""; + const canonical = buildCanonical({ path: _pathname, origin: origin ?? CAL_URL }); + const titleSuffix = `| ${APP_NAME}`; + const displayedTitle = title.includes(titleSuffix) || hideBranding ? title : `${title} ${titleSuffix}`; + const metadataBase = new URL(IS_CALCOM ? getCalcomUrl() : WEBAPP_URL); + + const metadata = { + title: title.length === 0 ? APP_NAME : displayedTitle, + description, + alternates: { canonical }, + openGraph: { + description: truncateOnWord(description, 158), + url: canonical, + type: "website", + siteName: APP_NAME, + title: displayedTitle, + }, + metadataBase, + }; + const image = + SEO_IMG_OGIMG + + constructGenericImage({ + title: metadata.title, + description: metadata.description, + }); + + return { + ...metadata, + openGraph: { + ...metadata.openGraph, + images: [image], + }, + }; +}; + export const generateMeetingMetadata = async ( meeting: MeetingImageProps, getTitle: (t: TFunction) => string, diff --git a/apps/web/app/icons/page.tsx b/apps/web/app/icons/page.tsx index 8a49fd47b4..1fa1696cd9 100644 --- a/apps/web/app/icons/page.tsx +++ b/apps/web/app/icons/page.tsx @@ -1,4 +1,5 @@ -import { _generateMetadata, getTranslate } from "app/_utils"; +import { _generateMetadataForStaticPage } from "app/_utils"; +import type { Metadata } from "next"; import { Inter } from "next/font/google"; import localFont from "next/font/local"; @@ -8,6 +9,15 @@ import type { IconName } from "@calcom/ui/components/icon"; import { lucideIconList } from "../../../../packages/ui/components/icon/icon-list.mjs"; import { IconGrid } from "./IconGrid"; +export const dynamic = "force-static"; +export const metadata: Metadata = _generateMetadataForStaticPage( + "Icons Showcase", + "", + undefined, + undefined, + "/icons" +); + const interFont = Inter({ subsets: ["latin"], variable: "--font-inter", preload: true, display: "swap" }); const calFont = localFont({ src: "../../fonts/CalSans-SemiBold.woff2", @@ -16,25 +26,16 @@ const calFont = localFont({ display: "swap", weight: "600", }); -export const generateMetadata = async () => { - return await _generateMetadata( - (t) => t("icon_showcase"), - () => "", - undefined, - undefined, - "/icons" - ); -}; -export default async function IconsPage() { + +export default function IconsPage() { const icons = Array.from(lucideIconList).sort() as IconName[]; - const t = await getTranslate(); return (
-

{t("icons_showcase")}

+

Icons Showcase