From 0f33d37a783ada66f773e02d1ecd0b6a2d5081c0 Mon Sep 17 00:00:00 2001 From: Minit Date: Tue, 21 Apr 2026 22:28:04 +0530 Subject: [PATCH 1/4] feat: add Google Analytics 4 via @next/third-parties Co-Authored-By: Claude Sonnet 4.6 --- .env.local.example | 4 ++++ app/layout.tsx | 4 ++++ package-lock.json | 20 ++++++++++++++++++++ package.json | 5 +++-- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/.env.local.example b/.env.local.example index 9a90b2c..130c722 100644 --- a/.env.local.example +++ b/.env.local.example @@ -13,3 +13,7 @@ SUPABASE_SERVICE_ROLE_KEY=your-service-role-key # Random secret for Vercel cron authentication — set same value in Vercel env vars CRON_SECRET=your-random-secret + +# Google Analytics 4 Measurement ID (format: G-XXXXXXXXXX) +# Get from analytics.google.com -> Admin -> Data Streams -> your stream -> Measurement ID +NEXT_PUBLIC_GA_MEASUREMENT_ID=G-CCRK2NRGSL diff --git a/app/layout.tsx b/app/layout.tsx index 4ad2fe2..072cea8 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -2,6 +2,7 @@ import type { Metadata, Viewport } from 'next' import { DM_Sans, Plus_Jakarta_Sans, JetBrains_Mono } from 'next/font/google' import { ThemeProvider } from 'next-themes' import { Analytics } from '@vercel/analytics/next' +import { GoogleAnalytics } from '@next/third-parties/google' import { FaviconInit } from '@/components/ui/FaviconInit' import './globals.css' @@ -118,6 +119,9 @@ export default function RootLayout({ {children} + {process.env.NEXT_PUBLIC_GA_MEASUREMENT_ID && ( + + )} diff --git a/package-lock.json b/package-lock.json index 72dc8fe..2d325e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "bonfire", "version": "0.1.0", "dependencies": { + "@next/third-parties": "^16.2.4", "@react-three/fiber": "^8.18.0", "@supabase/ssr": "^0.5.0", "@supabase/supabase-js": "^2.45.0", @@ -721,6 +722,19 @@ "node": ">= 10" } }, + "node_modules/@next/third-parties": { + "version": "16.2.4", + "resolved": "https://registry.npmjs.org/@next/third-parties/-/third-parties-16.2.4.tgz", + "integrity": "sha512-FhDDX02cAr0WIo3la+QHP3XaAAV6twCfFk/y8pHikFT8MHwNpB3XgEdaT0omLrIWBORhM5wkbbUJFq+pBqZzmw==", + "license": "MIT", + "dependencies": { + "third-party-capital": "1.0.20" + }, + "peerDependencies": { + "next": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0-beta.0", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -7851,6 +7865,12 @@ "node": ">=0.8" } }, + "node_modules/third-party-capital": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/third-party-capital/-/third-party-capital-1.0.20.tgz", + "integrity": "sha512-oB7yIimd8SuGptespDAZnNkzIz+NWaJCu2RMsbs4Wmp9zSDUM8Nhi3s2OOcqYuv3mN4hitXc8DVx+LyUmbUDiA==", + "license": "ISC" + }, "node_modules/three": { "version": "0.184.0", "resolved": "https://registry.npmjs.org/three/-/three-0.184.0.tgz", diff --git a/package.json b/package.json index d669626..a500c62 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "test:watch": "vitest" }, "dependencies": { + "@next/third-parties": "^16.2.4", "@react-three/fiber": "^8.18.0", "@supabase/ssr": "^0.5.0", "@supabase/supabase-js": "^2.45.0", @@ -34,6 +35,7 @@ "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", + "@types/three": "^0.184.0", "@vitejs/plugin-react": "^6.0.1", "autoprefixer": "^10.0.1", "eslint": "^8", @@ -42,7 +44,6 @@ "postcss": "^8", "tailwindcss": "^3.4.0", "typescript": "^5", - "vitest": "^4.1.4", - "@types/three": "^0.184.0" + "vitest": "^4.1.4" } } From a1546313c220230431206bc3ec343426f6b26733 Mon Sep 17 00:00:00 2001 From: Minit Date: Tue, 21 Apr 2026 22:34:48 +0530 Subject: [PATCH 2/4] fix: address CodeRabbit review findings from PR #31 Co-Authored-By: Claude Sonnet 4.6 --- app/layout.tsx | 6 +++--- app/privacy/page.tsx | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/layout.tsx b/app/layout.tsx index 072cea8..30cdc6c 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -95,6 +95,9 @@ export default function RootLayout({ suppressHydrationWarning className={`${dmSans.variable} ${plusJakartaSans.variable} ${jetbrainsMono.variable}`} > + {process.env.NEXT_PUBLIC_GA_MEASUREMENT_ID && ( + + )}