83 lines
1.8 KiB
TypeScript
83 lines
1.8 KiB
TypeScript
import type { Metadata } from "next";
|
|
|
|
import { truncateOnWord } from "@calcom/lib/text";
|
|
|
|
type RootMetadataRecipe = Readonly<{
|
|
twitterCreator: string;
|
|
twitterSite: string;
|
|
robots: {
|
|
index: boolean;
|
|
follow: boolean;
|
|
};
|
|
}>;
|
|
|
|
export type PageMetadataRecipe = Readonly<{
|
|
title: string;
|
|
canonical: string;
|
|
image: string;
|
|
description: string;
|
|
siteName: string;
|
|
metadataBase: URL;
|
|
}>;
|
|
|
|
export const prepareRootMetadata = (recipe: RootMetadataRecipe): Metadata => ({
|
|
icons: {
|
|
icon: "/favicon.icon",
|
|
apple: "/api/logo?type=apple-touch-icon",
|
|
other: [
|
|
{
|
|
rel: "icon-mask",
|
|
url: "/safari-pinned-tab.svg",
|
|
color: "#000000",
|
|
},
|
|
{
|
|
url: "/api/logo?type=favicon-16",
|
|
sizes: "16x16",
|
|
type: "image/png",
|
|
},
|
|
{
|
|
url: "/api/logo?type=favicon-32",
|
|
sizes: "32x32",
|
|
type: "image/png",
|
|
},
|
|
],
|
|
},
|
|
manifest: "/site.webmanifest",
|
|
viewport: "width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0",
|
|
robots: recipe.robots,
|
|
other: {
|
|
"application-TileColor": "#ff0000",
|
|
},
|
|
themeColor: [
|
|
{
|
|
media: "(prefers-color-scheme: light)",
|
|
color: "#f9fafb",
|
|
},
|
|
{
|
|
media: "(prefers-color-scheme: dark)",
|
|
color: "#1C1C1C",
|
|
},
|
|
],
|
|
twitter: {
|
|
site: recipe.twitterSite,
|
|
creator: recipe.twitterCreator,
|
|
card: "summary_large_image",
|
|
},
|
|
});
|
|
|
|
export const preparePageMetadata = (recipe: PageMetadataRecipe): Metadata => ({
|
|
title: recipe.title,
|
|
alternates: {
|
|
canonical: recipe.canonical,
|
|
},
|
|
openGraph: {
|
|
description: truncateOnWord(recipe.description, 158),
|
|
url: recipe.canonical,
|
|
type: "website",
|
|
siteName: recipe.siteName,
|
|
title: recipe.title,
|
|
images: [recipe.image],
|
|
},
|
|
metadataBase: recipe.metadataBase,
|
|
});
|