Some checks are pending
Deploy to Cloudflare Workers (OpenNext) / deploy (push) Waiting to run
102 lines
2.9 KiB
TypeScript
102 lines
2.9 KiB
TypeScript
import type { Metadata } from "next";
|
|
import { site } from "@/content/site";
|
|
|
|
export const SITE_URL =
|
|
process.env.NEXT_PUBLIC_SITE_URL?.replace(/\/$/, "") || "https://grvsummit.com";
|
|
|
|
export const defaultKeywords = [
|
|
"Great Rift Valley Innovation Summit",
|
|
"GRV Summit",
|
|
"Ethiopia innovation",
|
|
"Addis Ababa conference",
|
|
"EDTF",
|
|
"startup pitch Ethiopia",
|
|
"agriculture health education innovation",
|
|
"Skylight Hotel summit",
|
|
];
|
|
|
|
export const staticRoutes = [
|
|
{ path: "/", priority: 1, changeFrequency: "weekly" as const },
|
|
{ path: "/program", priority: 0.9, changeFrequency: "weekly" as const },
|
|
{ path: "/speakers", priority: 0.9, changeFrequency: "weekly" as const },
|
|
{ path: "/pitch-competition", priority: 0.9, changeFrequency: "weekly" as const },
|
|
{ path: "/partners", priority: 0.85, changeFrequency: "monthly" as const },
|
|
{ path: "/exhibit", priority: 0.85, changeFrequency: "monthly" as const },
|
|
{ path: "/sponsor", priority: 0.85, changeFrequency: "monthly" as const },
|
|
{ path: "/payment", priority: 0.8, changeFrequency: "weekly" as const },
|
|
{ path: "/contact", priority: 0.75, changeFrequency: "monthly" as const },
|
|
{ path: "/privacy", priority: 0.3, changeFrequency: "yearly" as const },
|
|
];
|
|
|
|
type PageMetaInput = {
|
|
title: string;
|
|
description: string;
|
|
path?: string;
|
|
keywords?: string[];
|
|
noIndex?: boolean;
|
|
ogImage?: string;
|
|
};
|
|
|
|
export function absoluteUrl(path = ""): string {
|
|
const normalized = path.startsWith("/") ? path : path ? `/${path}` : "";
|
|
return `${SITE_URL}${normalized}`;
|
|
}
|
|
|
|
export function createPageMetadata({
|
|
title,
|
|
description,
|
|
path = "",
|
|
keywords = [],
|
|
noIndex = false,
|
|
ogImage = "/branding/logo.png",
|
|
}: PageMetaInput): Metadata {
|
|
const url = absoluteUrl(path);
|
|
const fullTitle = title === site.name ? title : title;
|
|
const ogTitle = title.includes(site.shortName) ? title : `${title} | ${site.shortName}`;
|
|
|
|
return {
|
|
title: fullTitle,
|
|
description,
|
|
keywords: [...defaultKeywords, ...keywords],
|
|
alternates: { canonical: url },
|
|
robots: noIndex
|
|
? { index: false, follow: false }
|
|
: { index: true, follow: true, googleBot: { index: true, follow: true } },
|
|
openGraph: {
|
|
type: "website",
|
|
locale: "en_US",
|
|
url,
|
|
siteName: site.name,
|
|
title: ogTitle,
|
|
description,
|
|
images: [
|
|
{
|
|
url: ogImage,
|
|
width: 1200,
|
|
height: 630,
|
|
alt: site.name,
|
|
},
|
|
],
|
|
},
|
|
twitter: {
|
|
card: "summary_large_image",
|
|
title: ogTitle,
|
|
description,
|
|
images: [ogImage],
|
|
},
|
|
};
|
|
}
|
|
|
|
export const rootMetadata: Metadata = {
|
|
metadataBase: new URL(SITE_URL),
|
|
...createPageMetadata({
|
|
title: site.name,
|
|
description: `${site.tagline} ${site.dates.label} at ${site.venue.name}, ${site.venue.address}. Presented by ${site.presentedBy}.`,
|
|
path: "/",
|
|
}),
|
|
title: {
|
|
default: site.name,
|
|
template: `%s | ${site.shortName}`,
|
|
},
|
|
};
|