2 Commits

Author SHA1 Message Date
90e9f37849 fix: umami
Some checks failed
Build & Deploy / 🔍 Prepare Environment (push) Successful in 4s
Build & Deploy / 🧪 QA (push) Successful in 1m23s
Build & Deploy / 🏗️ Build (push) Failing after 3m6s
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / 🔔 Notifications (push) Successful in 2s
2026-02-09 22:32:35 +01:00
9eaaa798a3 fix: umami
All checks were successful
Build & Deploy / 🔍 Prepare Environment (push) Successful in 12s
Build & Deploy / 🧪 QA (push) Successful in 1m24s
Build & Deploy / 🏗️ Build (push) Successful in 5m58s
Build & Deploy / 🚀 Deploy (push) Successful in 15s
Build & Deploy / 🔔 Notifications (push) Successful in 2s
2026-02-09 19:30:52 +01:00
6 changed files with 25 additions and 5 deletions

View File

@@ -200,6 +200,7 @@ jobs:
--build-arg NEXT_PUBLIC_TARGET=${{ needs.prepare.outputs.target }} \ --build-arg NEXT_PUBLIC_TARGET=${{ needs.prepare.outputs.target }} \
--build-arg DIRECTUS_URL=${{ needs.prepare.outputs.directus_url }} \ --build-arg DIRECTUS_URL=${{ needs.prepare.outputs.directus_url }} \
--build-arg UMAMI_API_ENDPOINT=${{ secrets.UMAMI_API_ENDPOINT || secrets.NEXT_PUBLIC_UMAMI_SCRIPT_URL || vars.UMAMI_API_ENDPOINT || 'https://analytics.infra.mintel.me' }} \ --build-arg UMAMI_API_ENDPOINT=${{ secrets.UMAMI_API_ENDPOINT || secrets.NEXT_PUBLIC_UMAMI_SCRIPT_URL || vars.UMAMI_API_ENDPOINT || 'https://analytics.infra.mintel.me' }} \
--build-arg NEXT_PUBLIC_UMAMI_WEBSITE_ID=${{ secrets.UMAMI_WEBSITE_ID || secrets.NEXT_PUBLIC_UMAMI_WEBSITE_ID || vars.UMAMI_WEBSITE_ID || vars.NEXT_PUBLIC_UMAMI_WEBSITE_ID }} \
-t registry.infra.mintel.me/mintel/mb-grid-solutions:${{ needs.prepare.outputs.image_tag }} \ -t registry.infra.mintel.me/mintel/mb-grid-solutions:${{ needs.prepare.outputs.image_tag }} \
--push . --push .
@@ -269,6 +270,7 @@ jobs:
GOTIFY_URL=${{ secrets.GOTIFY_URL || vars.GOTIFY_URL }} GOTIFY_URL=${{ secrets.GOTIFY_URL || vars.GOTIFY_URL }}
GOTIFY_TOKEN=${{ secrets.GOTIFY_TOKEN || vars.GOTIFY_TOKEN }} GOTIFY_TOKEN=${{ secrets.GOTIFY_TOKEN || vars.GOTIFY_TOKEN }}
UMAMI_WEBSITE_ID=${{ secrets.UMAMI_WEBSITE_ID || secrets.NEXT_PUBLIC_UMAMI_WEBSITE_ID || vars.UMAMI_WEBSITE_ID || vars.NEXT_PUBLIC_UMAMI_WEBSITE_ID }} UMAMI_WEBSITE_ID=${{ secrets.UMAMI_WEBSITE_ID || secrets.NEXT_PUBLIC_UMAMI_WEBSITE_ID || vars.UMAMI_WEBSITE_ID || vars.NEXT_PUBLIC_UMAMI_WEBSITE_ID }}
NEXT_PUBLIC_UMAMI_WEBSITE_ID=${{ secrets.UMAMI_WEBSITE_ID || secrets.NEXT_PUBLIC_UMAMI_WEBSITE_ID || vars.UMAMI_WEBSITE_ID || vars.NEXT_PUBLIC_UMAMI_WEBSITE_ID }}
UMAMI_API_ENDPOINT=${{ secrets.UMAMI_API_ENDPOINT || secrets.NEXT_PUBLIC_UMAMI_SCRIPT_URL || vars.UMAMI_API_ENDPOINT || 'https://analytics.infra.mintel.me' }} UMAMI_API_ENDPOINT=${{ secrets.UMAMI_API_ENDPOINT || secrets.NEXT_PUBLIC_UMAMI_SCRIPT_URL || vars.UMAMI_API_ENDPOINT || 'https://analytics.infra.mintel.me' }}
# Project # Project

View File

@@ -11,12 +11,14 @@ ARG NEXT_PUBLIC_BASE_URL
ARG UMAMI_API_ENDPOINT ARG UMAMI_API_ENDPOINT
ARG NEXT_PUBLIC_TARGET ARG NEXT_PUBLIC_TARGET
ARG DIRECTUS_URL ARG DIRECTUS_URL
ARG NEXT_PUBLIC_UMAMI_WEBSITE_ID
ARG NPM_TOKEN ARG NPM_TOKEN
ENV NEXT_PUBLIC_BASE_URL=$NEXT_PUBLIC_BASE_URL ENV NEXT_PUBLIC_BASE_URL=$NEXT_PUBLIC_BASE_URL
ENV UMAMI_API_ENDPOINT=$UMAMI_API_ENDPOINT ENV UMAMI_API_ENDPOINT=$UMAMI_API_ENDPOINT
ENV NEXT_PUBLIC_TARGET=$NEXT_PUBLIC_TARGET ENV NEXT_PUBLIC_TARGET=$NEXT_PUBLIC_TARGET
ENV DIRECTUS_URL=$DIRECTUS_URL ENV DIRECTUS_URL=$DIRECTUS_URL
ENV NEXT_PUBLIC_UMAMI_WEBSITE_ID=$NEXT_PUBLIC_UMAMI_WEBSITE_ID
ENV NPM_TOKEN=$NPM_TOKEN ENV NPM_TOKEN=$NPM_TOKEN
ENV SENTRY_SUPPRESS_TURBOPACK_WARNING=1 ENV SENTRY_SUPPRESS_TURBOPACK_WARNING=1
ENV SKIP_RUNTIME_ENV_VALIDATION=true ENV SKIP_RUNTIME_ENV_VALIDATION=true

View File

@@ -6,6 +6,8 @@ import { NextIntlClientProvider } from "next-intl";
import { getMessages } from "next-intl/server"; import { getMessages } from "next-intl/server";
import { notFound } from "next/navigation"; import { notFound } from "next/navigation";
import { LazyMotion, domAnimation } from "framer-motion"; import { LazyMotion, domAnimation } from "framer-motion";
import AnalyticsProvider from "@/components/analytics/AnalyticsProvider";
import { config } from "@/lib/config";
const inter = Inter({ const inter = Inter({
subsets: ["latin"], subsets: ["latin"],
@@ -108,10 +110,12 @@ export default async function RootLayout({
// Track pageview on the server // Track pageview on the server
// This is safe to call here because layout is a Server Component // This is safe to call here because layout is a Server Component
const services = ( const serverServices = (
await import("@/lib/services/create-services.server") await import("@/lib/services/create-services.server")
).getServerAppServices(); ).getServerAppServices();
services.analytics.trackPageview();
// Track server-side (initial load)
serverServices.analytics.trackPageview("/");
return ( return (
<html lang={locale} className={`${inter.variable}`}> <html lang={locale} className={`${inter.variable}`}>
@@ -123,6 +127,7 @@ export default async function RootLayout({
</head> </head>
<body className="antialiased"> <body className="antialiased">
<NextIntlClientProvider messages={messages}> <NextIntlClientProvider messages={messages}>
<AnalyticsProvider websiteId={config.analytics.umami.websiteId} />
<LazyMotion features={domAnimation}> <LazyMotion features={domAnimation}>
<Layout>{children}</Layout> <Layout>{children}</Layout>
</LazyMotion> </LazyMotion>

View File

@@ -27,9 +27,11 @@ function createConfig() {
analytics: { analytics: {
umami: { umami: {
websiteId: env.UMAMI_WEBSITE_ID, websiteId: env.NEXT_PUBLIC_UMAMI_WEBSITE_ID || env.UMAMI_WEBSITE_ID,
apiEndpoint: env.UMAMI_API_ENDPOINT, apiEndpoint: env.UMAMI_API_ENDPOINT,
enabled: Boolean(env.UMAMI_WEBSITE_ID), enabled: Boolean(
env.NEXT_PUBLIC_UMAMI_WEBSITE_ID || env.UMAMI_WEBSITE_ID,
),
}, },
}, },

View File

@@ -26,6 +26,10 @@ export const envSchema = z
preprocessEmptyString, preprocessEmptyString,
z.string().optional(), z.string().optional(),
), ),
NEXT_PUBLIC_UMAMI_WEBSITE_ID: z.preprocess(
preprocessEmptyString,
z.string().optional(),
),
UMAMI_API_ENDPOINT: z.preprocess( UMAMI_API_ENDPOINT: z.preprocess(
preprocessEmptyString, preprocessEmptyString,
z.string().url().default("https://analytics.infra.mintel.me"), z.string().url().default("https://analytics.infra.mintel.me"),
@@ -115,6 +119,7 @@ export function getRawEnv() {
NEXT_PUBLIC_TARGET: process.env.NEXT_PUBLIC_TARGET, NEXT_PUBLIC_TARGET: process.env.NEXT_PUBLIC_TARGET,
UMAMI_WEBSITE_ID: UMAMI_WEBSITE_ID:
process.env.UMAMI_WEBSITE_ID || process.env.NEXT_PUBLIC_UMAMI_WEBSITE_ID, process.env.UMAMI_WEBSITE_ID || process.env.NEXT_PUBLIC_UMAMI_WEBSITE_ID,
NEXT_PUBLIC_UMAMI_WEBSITE_ID: process.env.NEXT_PUBLIC_UMAMI_WEBSITE_ID,
UMAMI_API_ENDPOINT: UMAMI_API_ENDPOINT:
process.env.UMAMI_API_ENDPOINT || process.env.UMAMI_API_ENDPOINT ||
process.env.UMAMI_SCRIPT_URL || process.env.UMAMI_SCRIPT_URL ||

View File

@@ -14,5 +14,9 @@ export default createMiddleware({
export const config = { export const config = {
// Matcher for all pages and internationalized pathnames // Matcher for all pages and internationalized pathnames
// excluding api, _next, static files, etc. // excluding api, _next, static files, etc.
matcher: ["/((?!api|_next|_vercel|.*\\..*).*)", "/", "/(de)/:path*"], matcher: [
"/((?!api|stats|errors|_next|_vercel|.*\\..*).*)",
"/",
"/(de)/:path*",
],
}; };