import React, { useEffect } from 'react'; interface SEOProps { title: string; description: string; keywords?: string[]; canonicalUrl?: string; schema?: object; // JSON-LD schema ogImage?: string; ogType?: string; } const SEO: React.FC = ({ title, description, keywords, canonicalUrl, schema, ogImage, ogType }) => { useEffect(() => { // Update Title document.title = title; // Helper to set meta tag (name attribute) const setMetaTag = (name: string, content: string) => { let element = document.querySelector(`meta[name="${name}"]`); if (!element) { element = document.createElement('meta'); element.setAttribute('name', name); document.head.appendChild(element); } element.setAttribute('content', content); }; // Helper to set OG tag (property attribute) const setOgTag = (property: string, content: string) => { let element = document.querySelector(`meta[property="${property}"]`); if (!element) { element = document.createElement('meta'); element.setAttribute('property', property); document.head.appendChild(element); } element.setAttribute('content', content); }; // Update Meta Description setMetaTag('description', description); // Update Keywords if (keywords && keywords.length > 0) { setMetaTag('keywords', keywords.join(', ')); } // Update Canonical if (canonicalUrl) { let link = document.querySelector('link[rel="canonical"]'); if (!link) { link = document.createElement('link'); link.setAttribute('rel', 'canonical'); document.head.appendChild(link); } link.setAttribute('href', canonicalUrl); } // Open Graph Tags setOgTag('og:title', title); setOgTag('og:description', description); setOgTag('og:type', ogType || 'website'); setOgTag('og:site_name', 'Bay Area IT'); if (canonicalUrl) setOgTag('og:url', canonicalUrl); if (ogImage) setOgTag('og:image', ogImage); // Twitter Card Tags setMetaTag('twitter:card', 'summary'); setMetaTag('twitter:title', title); setMetaTag('twitter:description', description); // Inject Schema if (schema) { const scriptId = 'seo-schema-script'; let script = document.getElementById(scriptId); if (!script) { script = document.createElement('script'); script.id = scriptId; script.setAttribute('type', 'application/ld+json'); document.head.appendChild(script); } script.textContent = JSON.stringify(schema); } }, [title, description, keywords, canonicalUrl, schema, ogImage, ogType]); return null; }; export default SEO;