Files
ridebus-website/components/pageSeo/pageSeo.tsx
Zakhar Timoshenko 142ec97959 feat: add Open Graph image generation and SEO metadata
- Introduced `PageSeo` component for managing page metadata for social sharing.
- Created Open Graph image templates using SVG and static fonts for better visual representation.
- Implemented service alert management with functions to check active alerts and format route numbers.
- Added utility functions for generating and watching alert validity.
- Developed a script to generate Open Graph images dynamically based on page content.
- Included tests for service alert functionalities to ensure correctness and reliability.
2026-10-05 13:02:06 +03:00

70 lines
2.2 KiB
TypeScript

import Head from 'next/head';
import { useRouter } from 'next/router';
import { getSocialMetadata, ogImageSize, socialPages } from '@/lib/social.mjs';
export function PageSeo({ page }: { page: keyof typeof socialPages }) {
const { locale } = useRouter();
const metadata = getSocialMetadata(page, locale || 'en');
return (
<Head>
<title>{metadata.title}</title>
<meta
name="description"
content={metadata.description}
key="description"
/>
<link rel="canonical" href={metadata.url} key="canonical" />
<meta property="og:type" content="website" key="og:type" />
<meta property="og:site_name" content="RideBus" key="og:site_name" />
<meta property="og:url" content={metadata.url} key="og:url" />
<meta property="og:title" content={metadata.title} key="og:title" />
<meta
property="og:description"
content={metadata.description}
key="og:description"
/>
<meta property="og:locale" content={metadata.locale} key="og:locale" />
<meta
property="og:locale:alternate"
content={metadata.alternateLocale}
key="og:locale:alternate"
/>
<meta property="og:image" content={metadata.image} key="og:image" />
<meta property="og:image:type" content="image/png" key="og:image:type" />
<meta
property="og:image:width"
content={String(ogImageSize.width)}
key="og:image:width"
/>
<meta
property="og:image:height"
content={String(ogImageSize.height)}
key="og:image:height"
/>
<meta
property="og:image:alt"
content={metadata.heading.join(' ')}
key="og:image:alt"
/>
<meta
name="twitter:card"
content="summary_large_image"
key="twitter:card"
/>
<meta name="twitter:title" content={metadata.title} key="twitter:title" />
<meta
name="twitter:description"
content={metadata.description}
key="twitter:description"
/>
<meta name="twitter:image" content={metadata.image} key="twitter:image" />
<meta
name="twitter:image:alt"
content={metadata.heading.join(' ')}
key="twitter:image:alt"
/>
</Head>
);
}