T.ME/BIBIL_0DAY
CasperSecurity


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/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/gositeme/domains/lavocat.quebec/private_html/src/components/SEO.tsx
'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; 

CasperSecurity Mini