85 lines
1.8 KiB
TypeScript
85 lines
1.8 KiB
TypeScript
import type { Metadata } from 'next';
|
|
import { url as baseUrl } from './layout.shared';
|
|
|
|
const siteName = 'OpenPanel';
|
|
const defaultDescription =
|
|
'OpenPanel is a simple, affordable open-source alternative to Mixpanel for web and product analytics. Get powerful insights without the complexity.';
|
|
const defaultImage = baseUrl('/ogimage.png');
|
|
|
|
export function getOgImageUrl(url: string): string {
|
|
return `/og/${url.replace(baseUrl('/'), '/')}`;
|
|
}
|
|
|
|
export function getRootMetadata(): Metadata {
|
|
return getRawMetadata({
|
|
url: baseUrl('/'),
|
|
title: `${siteName} | An open-source alternative to Mixpanel`,
|
|
description: defaultDescription,
|
|
image: defaultImage,
|
|
});
|
|
}
|
|
|
|
export function getPageMetadata({
|
|
url,
|
|
title,
|
|
description,
|
|
image,
|
|
}: {
|
|
url: string;
|
|
title: string;
|
|
description: string;
|
|
image?: string;
|
|
}): Metadata {
|
|
return getRawMetadata({
|
|
url,
|
|
title: `${title} | ${siteName}`,
|
|
description,
|
|
image: image ?? getOgImageUrl(url),
|
|
});
|
|
}
|
|
|
|
export function getRawMetadata(
|
|
{
|
|
url,
|
|
title,
|
|
description,
|
|
image,
|
|
}: { url: string; title: string; description: string; image: string },
|
|
meta: Metadata = {},
|
|
): Metadata {
|
|
return {
|
|
title,
|
|
description,
|
|
alternates: {
|
|
canonical: baseUrl(url),
|
|
},
|
|
icons: {
|
|
apple: '/apple-touch-icon.png',
|
|
icon: '/favicon.ico',
|
|
},
|
|
manifest: '/site.webmanifest',
|
|
openGraph: {
|
|
title,
|
|
description,
|
|
siteName: siteName,
|
|
url: baseUrl(url),
|
|
type: 'website',
|
|
images: [
|
|
{
|
|
url: image,
|
|
width: 1200,
|
|
height: 630,
|
|
alt: title,
|
|
},
|
|
],
|
|
},
|
|
twitter: {
|
|
card: 'summary_large_image',
|
|
title,
|
|
description,
|
|
images: [image],
|
|
},
|
|
...meta,
|
|
};
|
|
}
|