'use client'; /** * Fires `place_viewed` once per location page. * * A separate client component because PlaceView is a server component and * cannot call into the browser. It renders nothing — its whole job is the * effect, which keeps the page itself server-rendered. * * Umami already counts a pageview for every one of these URLs, so this is not * about traffic. It is about `kind`: whether to keep investing in the location * layer turns on which *sort* of page earns engagement — towns, authorities, * London localities or postcode districts — and a pageview cannot say, because * all four families share the /schools/ prefix and only the registry knows * which is which. */ import { useEffect } from 'react'; import { track, getNavigationSource } from '@/lib/analytics'; interface Props { kind: string; slug: string; count: number; phase?: 'primary' | 'secondary'; } export function TrackPlaceView({ kind, slug, count, phase }: Props) { useEffect(() => { track('place_viewed', { kind, slug, // "all" rather than omitting it, so the unphased page is a value in the // same field rather than a gap that has to be interpreted. phase: phase ?? 'all', school_count: count, // Internal navigation only. An arrival from Google reads as 'direct' // here; Umami's own pageview referrer is where external attribution // lives, and these pages exist to be arrived at externally. from: getNavigationSource(), }); // Once per place, not once per render. // eslint-disable-next-line react-hooks/exhaustive-deps }, [kind, slug, phase]); return null; }