![]() Server : Apache/2 System : Linux server-15-235-50-60 5.15.0-164-generic #174-Ubuntu SMP Fri Nov 14 20:25:16 UTC 2025 x86_64 User : gositeme ( 1004) PHP Version : 8.2.29 Disable Function : exec,system,passthru,shell_exec,proc_close,proc_open,dl,popen,show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname Directory : /home/gositeme/domains/lavocat.quebec/private_html/src/components/ |
'use client';
import Head from 'next/head';
import { usePathname } from 'next/navigation';
import { getBaseUrl } from '@/utils/url';
interface SEOProps {
title?: string;
description?: string;
image?: string;
type?: string;
keywords?: string[];
}
const SEO = ({
title = 'Action Collective - Class Action for Prison Rights',
description = 'Join the unprecedented class action against the Attorney General of Quebec to end systemic violations of fundamental rights at Bordeaux Prison.',
image = '/images/og-image.jpg',
type = 'website',
keywords = ['class action', 'prison rights', 'Bordeaux Prison', 'human rights', 'Quebec justice', 'prison reform']
}: SEOProps) => {
const pathname = usePathname();
// Extract locale from pathname (expects '/fr/...' or '/en/...')
const match = (pathname || '').match(/^\/(fr|en)(\/|$)/);
const locale = match ? match[1] : 'en';
const isFrench = locale === 'fr';
const defaultTitle = isFrench
? 'Action Collective - Recours Collectif pour les Droits des Prisonniers'
: 'Action Collective - Class Action for Prison Rights';
const defaultDescription = isFrench
? 'Rejoignez le recours collectif sans précédent contre le Procureur général du Québec pour mettre fin aux violations systémiques des droits fondamentaux à la prison de Bordeaux.'
: 'Join the unprecedented class action against the Attorney General of Quebec to end systemic violations of fundamental rights at Bordeaux Prison.';
const siteTitle = title === defaultTitle ? defaultTitle : `${title} | Action Collective
const baseUrl = getBaseUrl();
const canonicalUrl = `${baseUrl}${pathname}
// Structured data for the class action
const structuredData = {
"@context": "https://schema.org",
"@type": "LegalAction",
"name": siteTitle,
"description": description || defaultDescription,
"url": canonicalUrl,
"potentialAction": {
"@type": "JoinAction",
"target": {
"@type": "EntryPoint",
"urlTemplate": `${baseUrl}/auth/signup
}
},
"location": {
"@type": "Place",
"name": "Bordeaux Prison",
"address": {
"@type": "PostalAddress",
"addressLocality": "Montreal",
"addressRegion": "Quebec",
"addressCountry": "CA"
}
}
};
return (
<Head>
<title>{siteTitle}</title>
<meta name="description" content={description || defaultDescription} />
<meta name="keywords" content={keywords.join(', ')} />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" href="/favicon.ico" />
<link rel="canonical" href={canonicalUrl} />
{/* Open Graph / Facebook */}
<meta property="og:type" content={type} />
<meta property="og:url" content={canonicalUrl} />
<meta property="og:title" content={siteTitle} />
<meta property="og:description" content={description || defaultDescription} />
<meta property="og:image" content={`${baseUrl}${image}
<meta property="og:site_name" content="Action Collective" />
<meta property="og:locale" content={isFrench ? "fr_CA" : "en_CA"} />
{/* Twitter */}
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:url" content={canonicalUrl} />
<meta name="twitter:title" content={siteTitle} />
<meta name="twitter:description" content={description || defaultDescription} />
<meta name="twitter:image" content={`${baseUrl}${image}
{/* Alternate language versions */}
<link rel="alternate" hrefLang="en" href={`${baseUrl}${pathname}
<link rel="alternate" hrefLang="fr" href={`${baseUrl}/fr${pathname}
<link rel="alternate" hrefLang="x-default" href={`${baseUrl}${pathname}
{/* Structured Data */}
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(structuredData) }}
/>
</Head>
);
};
export default SEO;