59 lines
1.4 KiB
TypeScript
59 lines
1.4 KiB
TypeScript
import { Metadata } from 'next';
|
|
import { getWebsitePublicEnv } from '@/lib/config/env';
|
|
|
|
interface MetadataOptions {
|
|
title: string;
|
|
description: string;
|
|
path: string;
|
|
image?: string;
|
|
type?: 'website' | 'article' | 'profile';
|
|
}
|
|
|
|
export class MetadataHelper {
|
|
private static readonly DEFAULT_IMAGE = '/og-image.png';
|
|
private static readonly SITE_NAME = 'GridPilot';
|
|
|
|
static generate({
|
|
title,
|
|
description,
|
|
path,
|
|
image = this.DEFAULT_IMAGE,
|
|
type = 'website',
|
|
}: MetadataOptions): Metadata {
|
|
const env = getWebsitePublicEnv();
|
|
const baseUrl = env.NEXT_PUBLIC_SITE_URL || 'https://gridpilot.com';
|
|
const url = `${baseUrl}${path}`;
|
|
const fullTitle = `${title} | ${this.SITE_NAME}`;
|
|
|
|
return {
|
|
title: fullTitle,
|
|
description,
|
|
alternates: {
|
|
canonical: url,
|
|
},
|
|
openGraph: {
|
|
title: fullTitle,
|
|
description,
|
|
url,
|
|
siteName: this.SITE_NAME,
|
|
images: [
|
|
{
|
|
url: image.startsWith('http') ? image : `${baseUrl}${image}`,
|
|
width: 1200,
|
|
height: 630,
|
|
alt: title,
|
|
},
|
|
],
|
|
locale: 'en_US',
|
|
type,
|
|
},
|
|
twitter: {
|
|
card: 'summary_large_image',
|
|
title: fullTitle,
|
|
description,
|
|
images: [image.startsWith('http') ? image : `${baseUrl}${image}`],
|
|
},
|
|
};
|
|
}
|
|
}
|