import { useEffect } from "react"; export type SEOProps = { pageTitle: string; description?: string; image?: string | null; canonical?: string | null; noIndex?: boolean; }; function upsertMeta(selector: string, attrs: Record) { let el = document.querySelector(selector) as HTMLElement | null; if (!el) { const tag = selector.startsWith('meta[') ? 'meta' : selector.startsWith('link[') ? 'link' : 'meta'; el = document.createElement(tag); document.head.appendChild(el); } Object.entries(attrs).forEach(([k, v]) => (el as any).setAttribute(k, v)); } export default function SEO({ pageTitle, description, image, canonical, noIndex }: SEOProps) { useEffect(() => { const title = `AeThex | ${pageTitle}`; document.title = title; if (canonical) { upsertMeta('link[rel="canonical"]', { rel: 'canonical', href: canonical }); upsertMeta('meta[property="og:url"]', { property: 'og:url', content: canonical }); } if (description) { upsertMeta('meta[name="description"]', { name: 'description', content: description }); upsertMeta('meta[property="og:description"]', { property: 'og:description', content: description }); upsertMeta('meta[name="twitter:description"]', { name: 'twitter:description', content: description }); } upsertMeta('meta[property="og:title"]', { property: 'og:title', content: title }); upsertMeta('meta[name="twitter:title"]', { name: 'twitter:title', content: title }); if (image) { upsertMeta('meta[property="og:image"]', { property: 'og:image', content: image }); upsertMeta('meta[name="twitter:image"]', { name: 'twitter:image', content: image }); } if (noIndex) { upsertMeta('meta[name="robots"]', { name: 'robots', content: 'noindex, nofollow' }); upsertMeta('meta[name="googlebot"]', { name: 'googlebot', content: 'noindex, nofollow' }); } }, [pageTitle, description, image, canonical, noIndex]); return null; }