reintroduce umami analytics support

This commit is contained in:
leander committed 2025-08-01 00:19:35 +02:00
1 parent ae59bfeb5f
commit d9a6019c7c
4 files changed
+95

No files matched your search

+3
View File
@@ -2,3 +2,6 @@ NEXT_PUBLIC_SANITY_PROJECT_ID=mmqlu667
NEXT_PUBLIC_SANITY_DATASET=production
SANITY_REVALIDATE_SECRET=your-super-secret-webhook-token-here
NEXT_PUBLIC_UMAMI_SRC=https://umami.uiogaming.no/script.js
NEXT_PUBLIC_UMAMI_WEBSITE_ID=1e985053-9158-4d62-be07-0fe83a9dce6e
+13
View File
@@ -1,5 +1,9 @@
import "@/app/globals.css"
import UmamiAnalytics from "@/components/umamiAnalytics"
import { getAnalyticsConfig } from "@/lib/analyticsConfig"
import type { Metadata } from "next"
export const metadata: Metadata = {
@@ -18,10 +22,19 @@ export default function RootLayout({
}: Readonly<{
children: React.ReactNode
}>) {
const analyticsConfig = getAnalyticsConfig()
return (
<html lang="no">
<body>
<main>{children}</main>
{analyticsConfig?.enabled && (
<UmamiAnalytics
websiteId={analyticsConfig.websiteId}
src={analyticsConfig.src}
domains={analyticsConfig.domains}
/>
)}
</body>
</html>
)
+50
View File
@@ -0,0 +1,50 @@
"use client"
import Script from "next/script"
interface UmamiAnalyticsProps {
websiteId: string
src?: string
domains?: string[]
}
export default function UmamiAnalytics({
websiteId,
src = "https://analytics.umami.is/script.js",
domains,
}: UmamiAnalyticsProps) {
if (!websiteId) {
console.warn("Umami: Website ID is required")
return null
}
// Only load analytics in production or if explicitly enabled
if (process.env.NODE_ENV !== "production") {
return null
}
// Domain validation (client-side check as additional layer)
if (domains && typeof window !== "undefined") {
const currentDomain = window.location.hostname
const isAllowedDomain = domains.some(
domain => currentDomain === domain || currentDomain.endsWith(`.${domain}`)
)
if (!isAllowedDomain) {
console.warn(
`Umami: Domain ${currentDomain} not in allowed list:`,
domains
)
return null
}
}
return (
<Script
src={src}
data-website-id={websiteId}
data-domains={domains?.join(",")}
strategy="afterInteractive"
/>
)
}
+29
View File
@@ -0,0 +1,29 @@
interface AnalyticsConfig {
websiteId: string
src: string
domains: string[]
enabled: boolean
}
export function getAnalyticsConfig(): AnalyticsConfig | null {
const websiteId = process.env.NEXT_PUBLIC_UMAMI_WEBSITE_ID
const src =
process.env.NEXT_PUBLIC_UMAMI_SRC || "https://analytics.umami.is/script.js"
if (!websiteId) {
return null
}
// Define allowed domains
const domains = ["uiogaming.no", "www.uiogaming.no"]
// Additional environment-based checks
const enabled = process.env.NODE_ENV === "production"
return {
websiteId,
src,
domains,
enabled,
}
}