All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- [slug].vue : sommaire sticky (overflow:clip sur parent), prev/next en haut, 6 shadoks geek (pinguin+USB, web-of-trust, rubber-duck, caféine, debugger loupe, rack serveur) - Nouveaux types de sections : territoire (bouquet sweethomeCloud, 2 modèles éco, tableau matériel dépliable), projet (carte gestation) - cloud-libre.yml : section sweethomeCloud complète avec infra 50 000 hab. (~2€/an/hab) - authentification-wot.yml : trustWallet, correction WoT Duniter (Ed25519+Scrypt, sigQty=5, stepMax=3), DID/VC standards - logiciel-libre.yml : carte projet wishBounty - home.yml + numerique.yml : cloud-libre → sweethomeCloud, description RGPD/local-first - AxisBlock.vue : bulles de présentation inline dans les cards (plus de tooltip absolu) - Analytics : useTracking.ts (Umami), docker-compose.umami.yml, /api/stats fédération - nuxt.config.ts : config Umami runtime Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
21 lines
664 B
TypeScript
21 lines
664 B
TypeScript
/**
|
|
* Umami analytics wrapper — safe server-side, no-op when not configured.
|
|
* Usage: const { track } = useTracking()
|
|
* track('player:open')
|
|
* track('axis:navigate', { axis: 'numerique' })
|
|
*/
|
|
export function useTracking() {
|
|
const runtimeConfig = useRuntimeConfig()
|
|
const enabled = !!runtimeConfig.public.umamiWebsiteId
|
|
|
|
function track(event: string, data?: Record<string, unknown>) {
|
|
if (!import.meta.client || !enabled) return
|
|
const umami = (window as Record<string, unknown>).umami as
|
|
| { track: (event: string, data?: unknown) => void }
|
|
| undefined
|
|
umami?.track(event, data)
|
|
}
|
|
|
|
return { track, enabled }
|
|
}
|