47 lines
1.6 KiB
TypeScript
47 lines
1.6 KiB
TypeScript
'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;
|
||
|
|
}
|