/** * WordPress dependencies */ import { useSelect } from '@wordpress/data'; import type { ExperimentId } from '@nab/types'; /** * Internal dependencies */ import { store as NAB_CHECKER } from '../store'; import { getGoalName, getTestName } from '../utils'; import type { ConversionEvent, ViewEvent } from '../store/types'; import type { ActiveExperimentSummary, InactiveExperimentSummary, HeatmapSummary, } from '../../public/types'; export const Events = (): JSX.Element => { const events = useEventsWithExperiment(); const isAwaitingGdpr = useSelect( ( select ) => select( NAB_CHECKER ).isAwaitingGdpr(), [] ); if ( isAwaitingGdpr ) { return
Awaiting GDPR consent…
; } if ( ! events.length ) { return
No Events
; } return (
{ events.map( ( [ event, experiment ] ) => (
{ stringify( event, experiment ) }
) ) }
); }; // ===== // HOOKS // ===== function useEventsWithExperiment(): ReadonlyArray< [ ViewEvent | ConversionEvent, ActiveExperimentSummary | InactiveExperimentSummary | HeatmapSummary, ] > { const { allEvents, experiments, heatmaps } = useSelect( ( select ) => ( { allEvents: select( NAB_CHECKER ).getEvents(), experiments: select( NAB_CHECKER ).getSettings().experiments, heatmaps: select( NAB_CHECKER ).getSettings().heatmaps, } ), [] ); const tests = [ ...experiments, ...heatmaps ].reduce( ( r, t ) => ( { ...r, [ t.id ]: t, } ), {} as Record< ExperimentId, ActiveExperimentSummary | InactiveExperimentSummary | HeatmapSummary > ); return allEvents .map( ( e ) => [ e, tests[ e.experiment ] ] as const ) .filter( ( p ): p is [ ViewEvent | ConversionEvent, ( | ActiveExperimentSummary | InactiveExperimentSummary | HeatmapSummary ), ] => !! p[ 1 ] ); } // ======= // HELPERS // ======= function stringify( event: ViewEvent | ConversionEvent, experiment: | ActiveExperimentSummary | InactiveExperimentSummary | HeatmapSummary ): string { // eslint-disable-next-line @wordpress/no-unused-vars-before-return const testName = getTestName( experiment ); if ( 'goal' in event ) { if ( ! ( 'goals' in experiment ) ) { return ''; } if ( 1 === experiment.goals.length ) { return `🎯 Conversion in ${ testName }`; } const goalName = getGoalName( 'goals' in experiment ? experiment.goals[ event.goal ] : undefined, event.goal ); return `🎯 Conversion of ${ goalName } in ${ testName }`; } return `👁️ View in ${ testName }`; }