hooks in config/services.php/.env.example, and updated wizard steps/controllers to store session payloads, attach packages, and surface localized success/error states. - Retooled payment handling for both Stripe and PayPal, adding richer status management in CheckoutController/ PayPalController, fallback flows in the wizard’s PaymentStep.tsx, and fresh feature tests for intent creation, webhooks, and the wizard CTA. - Introduced a consent-aware Matomo analytics stack: new consent context, cookie-banner UI, useAnalytics/ useCtaExperiment hooks, and MatomoTracker component, then instrumented marketing pages (Home, Packages, Checkout) with localized copy and experiment tracking. - Polished package presentation across marketing UIs by centralizing formatting in PresentsPackages, surfacing localized description tables/placeholders, tuning badges/layouts, and syncing guest/marketing translations. - Expanded docs & reference material (docs/prp/*, TODOs, public gallery overview) and added a Playwright smoke test for the hero CTA while reconciling outstanding checklist items.
45 lines
931 B
TypeScript
45 lines
931 B
TypeScript
import { useCallback } from 'react';
|
|
import { useConsent } from '@/contexts/consent';
|
|
|
|
type AnalyticsEvent = {
|
|
category: string;
|
|
action: string;
|
|
name?: string;
|
|
value?: number;
|
|
};
|
|
|
|
export function useAnalytics() {
|
|
const { hasConsent } = useConsent();
|
|
|
|
const trackEvent = useCallback(
|
|
({ category, action, name, value }: AnalyticsEvent) => {
|
|
if (typeof window === 'undefined') {
|
|
return;
|
|
}
|
|
|
|
if (!hasConsent('analytics')) {
|
|
return;
|
|
}
|
|
|
|
const queue = (window._paq = window._paq || []);
|
|
const payload: (string | number)[] = ['trackEvent', category, action];
|
|
|
|
if (typeof name === 'string') {
|
|
payload.push(name);
|
|
}
|
|
|
|
if (typeof value === 'number') {
|
|
if (payload.length === 3) {
|
|
payload.push('');
|
|
}
|
|
payload.push(value);
|
|
}
|
|
|
|
queue.push(payload);
|
|
},
|
|
[hasConsent],
|
|
);
|
|
|
|
return { trackEvent };
|
|
}
|