From 94f9731b2c4ed067c7a70bf2edfbafbb1abe076d Mon Sep 17 00:00:00 2001 From: adevopg Date: Wed, 15 Jul 2026 19:49:00 +0000 Subject: [PATCH] Google Analytics 4, con interruptor y respetando el consentimiento MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se añade GA4 (gtag.js) con el componente oficial `@next/third-parties`, que es lo que recomienda el doc de Next 16 y carga el mismo gtag pero tras la hidratación. DOS interruptores: 1. `NEXT_PUBLIC_GA_ID` en el .env (no versionado). Vacío o sin poner = no se carga nada. Documentada en el README. 2. El consentimiento del visitante. El sitio YA tenía un banner con la categoría «Analíticas» que se puede rechazar: soltar gtag en el lo habría convertido en mentira, y con visitantes en la UE, en un problema legal. Para lo segundo se expone `useConsent(categoría)` desde CookieConsent, que además reacciona en caliente: `writeConsent`/`revokeConsent` ya disparaban el evento `ns:consentchange`, así que la analítica entra en cuanto se acepta y desaparece si se revoca, sin recargar. Arranca en `false` a propósito: hasta confirmar el consentimiento no se carga nada. Verificado en el build: sin consentimiento no hay ni rastro de googletagmanager en el HTML, y la condición compilada es `id && consent ? : null`. Co-Authored-By: Claude Opus 4.8 (1M context) --- README.md | 1 + web-next/app/[locale]/layout.tsx | 4 ++++ web-next/components/Analytics.tsx | 26 ++++++++++++++++++++++++++ web-next/components/CookieConsent.tsx | 21 +++++++++++++++++++++ web-next/package-lock.json | 18 ++++++++++++++++++ web-next/package.json | 1 + 6 files changed, 71 insertions(+) create mode 100644 web-next/components/Analytics.tsx diff --git a/README.md b/README.md index d78248f..7a17735 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ npm run dev # http://127.0.0.1:3000 | `NEXT_PUBLIC_TURNSTILE_SITE_KEY` / `TURNSTILE_SECRET_KEY` | Captcha de Cloudflare | | `ADMIN_EMAILS` / `ADMIN_GMLEVEL` | Acceso al panel de administración | | `CRON_SECRET` | Protege el endpoint de reconciliación de SumUp | +| `NEXT_PUBLIC_GA_ID` | Google Analytics 4 (p. ej. `G-XXXXXXXXXX`). **Vacío o sin poner = analítica desactivada**, no se carga nada. Además, aunque esté puesta, solo se carga si el visitante acepta la categoría «Analíticas» del banner de cookies. Al ser `NEXT_PUBLIC_*` se incrusta en el build: activar o desactivar exige `npm run build` + reinicio | ## 3. Producción diff --git a/web-next/app/[locale]/layout.tsx b/web-next/app/[locale]/layout.tsx index 75a12e3..012ce7e 100644 --- a/web-next/app/[locale]/layout.tsx +++ b/web-next/app/[locale]/layout.tsx @@ -9,6 +9,7 @@ import { Video } from '@/components/Video' import { Social } from '@/components/Social' import { Footer } from '@/components/Footer' import { CookieBanner } from '@/components/CookieConsent' +import { Analytics } from '@/components/Analytics' import '../globals.css' export function generateStaticParams() { @@ -92,6 +93,9 @@ export default async function LocaleLayout({