diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 2341206..93e5a5f 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -1,33 +1,34 @@ -{ - "permissions": { - "allow": [ - "Bash(docker-compose:*)", - "Bash(docker container prune:*)", - "Bash(npx prisma migrate dev:*)", - "Bash(npx prisma:*)", - "Bash(npm run dev)", - "Bash(timeout:*)", - "Bash(taskkill:*)", - "Bash(npx kill-port:*)", - "Bash(docker compose:*)", - "Bash(curl -I https://fonts.googleapis.com)", - "Bash(wsl:*)", - "Read(//c/Users/a931627/.ssh/**)", - "Bash(ssh-keygen:*)", - "Bash(cat:*)", - "Bash(git remote add:*)", - "Bash(git push:*)", - "Bash(git remote set-url:*)", - "Bash(npm install:*)", - "Bash(npm run build:*)", - "Bash(ls:*)", - "Bash(curl:*)", - "Bash(echo \"\n\n## CSRF Debug aktiviert!\n\nBitte teste jetzt:\n1. Browser zu http://localhost:3050/create\n2. Dynamic QR Code erstellen versuchen\n3. Server-Logs zeigen jetzt [CSRF Debug] Output\n\nIch sehe dann:\n- Ob headerToken vorhanden ist\n- Ob cookieToken vorhanden ist \n- Ob sie übereinstimmen\n\n---\n\nStripe Portal 500 Error ist separates Problem:\nhttps://dashboard.stripe.com/test/settings/billing/portal\n→ Customer Portal Configuration muss erstellt werden\n\")", - "Bash(pkill:*)", - "Skill(shadcn-ui)", - "Bash(find:*)" - ], - "deny": [], - "ask": [] - } -} +{ + "permissions": { + "allow": [ + "Bash(docker-compose:*)", + "Bash(docker container prune:*)", + "Bash(npx prisma migrate dev:*)", + "Bash(npx prisma:*)", + "Bash(npm run dev)", + "Bash(timeout:*)", + "Bash(taskkill:*)", + "Bash(npx kill-port:*)", + "Bash(docker compose:*)", + "Bash(curl -I https://fonts.googleapis.com)", + "Bash(wsl:*)", + "Read(//c/Users/a931627/.ssh/**)", + "Bash(ssh-keygen:*)", + "Bash(cat:*)", + "Bash(git remote add:*)", + "Bash(git push:*)", + "Bash(git remote set-url:*)", + "Bash(npm install:*)", + "Bash(npm run build:*)", + "Bash(ls:*)", + "Bash(curl:*)", + "Bash(echo \"\n\n## CSRF Debug aktiviert!\n\nBitte teste jetzt:\n1. Browser zu http://localhost:3050/create\n2. Dynamic QR Code erstellen versuchen\n3. Server-Logs zeigen jetzt [CSRF Debug] Output\n\nIch sehe dann:\n- Ob headerToken vorhanden ist\n- Ob cookieToken vorhanden ist \n- Ob sie übereinstimmen\n\n---\n\nStripe Portal 500 Error ist separates Problem:\nhttps://dashboard.stripe.com/test/settings/billing/portal\n→ Customer Portal Configuration muss erstellt werden\n\")", + "Bash(pkill:*)", + "Skill(shadcn-ui)", + "Bash(find:*)", + "Bash(ls -la \"/c/Users/User/Documents/QR-master/src/app/\\(main\\)/\\(marketing\\)/\")" + ], + "deny": [], + "ask": [] + } +} diff --git a/src/components/marketing/MarketingAnalytics.tsx b/src/components/marketing/MarketingAnalytics.tsx index a66e4bf..29d5af9 100644 --- a/src/components/marketing/MarketingAnalytics.tsx +++ b/src/components/marketing/MarketingAnalytics.tsx @@ -1,7 +1,7 @@ "use client"; import Link from "next/link"; -import { usePathname, useSearchParams } from "next/navigation"; +import { usePathname } from "next/navigation"; import { useEffect } from "react"; import { trackEvent } from "@/components/PostHogProvider"; @@ -14,12 +14,14 @@ type TrackingContext = { useCase?: string; }; -function getUtmProperties(searchParams: ReturnType) { +function getUtmPropertiesFromWindow() { + if (typeof window === "undefined") return {}; + const params = new URLSearchParams(window.location.search); return { - utm_source: searchParams?.get("utm_source") || undefined, - utm_medium: searchParams?.get("utm_medium") || undefined, - utm_campaign: searchParams?.get("utm_campaign") || undefined, - utm_content: searchParams?.get("utm_content") || undefined, + utm_source: params.get("utm_source") || undefined, + utm_medium: params.get("utm_medium") || undefined, + utm_campaign: params.get("utm_campaign") || undefined, + utm_content: params.get("utm_content") || undefined, }; } @@ -29,7 +31,6 @@ export function MarketingPageTracker({ useCase, }: TrackingContext) { const pathname = usePathname(); - const searchParams = useSearchParams(); useEffect(() => { if (!pathname) { @@ -41,9 +42,9 @@ export function MarketingPageTracker({ page_type: pageType, cluster, use_case: useCase, - ...getUtmProperties(searchParams), + ...getUtmPropertiesFromWindow(), }); - }, [cluster, pageType, pathname, searchParams, useCase]); + }, [cluster, pageType, pathname, useCase]); return null; } @@ -69,7 +70,6 @@ export function TrackedCtaLink({ useCase, }: TrackedCtaLinkProps) { const pathname = usePathname(); - const searchParams = useSearchParams(); return (