Skip to content

Commit 14d7627

Browse files
committed
feat: manage engament time depending on simulator
1 parent 82f448f commit 14d7627

3 files changed

Lines changed: 50 additions & 10 deletions

File tree

app/(iframes)/iframes/livraison/etiquette-animee/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import LivraisonEtiquette from 'components/outils/livraison/LivraisonEtiquette'
55
const page = () => {
66
return (
77
<TranslationProvider>
8-
<TrackingProvider tracking='Livraison etiquette'>
8+
<TrackingProvider tracking='Livraison étiquette'>
99
<LivraisonEtiquette id='animated' animated />
1010
</TrackingProvider>
1111
</TranslationProvider>

src/components/outils/TransportComparisonMode.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import classNames from 'classnames'
22
import { useTranslations } from 'next-intl'
33
import useParamContext from 'src/providers/ParamProvider'
4+
import useTrackingContext from 'src/providers/TrackingProvider'
45
import { track } from 'utils/matomo'
56
import CheckRoundIcon from 'components/base/icons/check-round'
67
import ComparisonIcon from 'components/base/icons/comparison'
@@ -11,6 +12,7 @@ const TransportComparisonMode = ({ tracking }: { tracking: string }) => {
1112
const {
1213
transport: { comparisonMode, setComparisonMode },
1314
} = useParamContext()
15+
const { trackOnce } = useTrackingContext()
1416
const t = useTranslations('transport.mode-selector')
1517
return (
1618
<div className={classNames(styles.container, { [styles.withBorder]: comparisonMode === 'list' })}>
@@ -24,6 +26,7 @@ const TransportComparisonMode = ({ tracking }: { tracking: string }) => {
2426
onClick={() => {
2527
setComparisonMode('list')
2628
track(tracking, 'Display list', 'display_list')
29+
trackOnce('List mode')
2730
}}
2831
/>
2932
<span className={classNames(styles.leftLabel, { [styles.clickeable]: comparisonMode !== 'list' })}>
@@ -40,6 +43,7 @@ const TransportComparisonMode = ({ tracking }: { tracking: string }) => {
4043
onClick={() => {
4144
setComparisonMode('comparison')
4245
track(tracking, 'Display comparison', 'display_comparison')
46+
trackOnce('Comparison mode')
4347
}}
4448
/>
4549
<span className={classNames(styles.rightLabel, { [styles.clickeable]: comparisonMode !== 'comparison' })}>

src/providers/TrackingProvider.tsx

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,53 @@
11
'use client'
2-
2+
import { ReadonlyURLSearchParams, usePathname, useSearchParams } from 'next/navigation'
33
import React, { ReactNode, useCallback, useContext, useEffect, useRef, useState } from 'react'
44
import { track } from 'utils/matomo'
55

66
const TrackingContext = React.createContext<{
77
trackOnce: (action: string) => void
88
} | null>(null)
99

10+
const trackingTime: Record<string, number | ((pathname: string, params: ReadonlyURLSearchParams) => number)> = {
11+
// Simulateur
12+
Livraison: 30000,
13+
'Fruits et légumes': 30000,
14+
Alimentation: 30000,
15+
Chauffage: 30000,
16+
'Usage numérique': 30000,
17+
Télétravail: 30000,
18+
OsezChanger: 30000,
19+
Quiz: 30000,
20+
Comparateur: 30000,
21+
// Graphique dynamique
22+
Numérique: 30000,
23+
Habillement: 30000,
24+
Mobilier: 30000,
25+
Boisson: 30000,
26+
Électroménager: 30000,
27+
Repas: 30000,
28+
// Transport
29+
Transport: (pathname: string, params: ReadonlyURLSearchParams) => {
30+
if (pathname.includes('itineraire')) {
31+
return 15000
32+
}
33+
const defaultMode = params.get('defaultMode')
34+
if (defaultMode === 'comparison') {
35+
return 15000
36+
}
37+
38+
return 30000
39+
},
40+
}
41+
1042
export function TrackingProvider({ children, tracking }: { children: ReactNode; tracking: string }) {
1143
// inspired from https://usehooks-ts.com/react-hook/use-intersection-observer
1244
const ref = useRef<HTMLDivElement | null>(null)
1345
const [entry, setEntry] = useState<IntersectionObserverEntry>()
1446

1547
const hasTracked = useRef(false)
1648
const timeoutRef = useRef<NodeJS.Timeout | null>(null)
49+
const params = useSearchParams()
50+
const pathname = usePathname()
1751

1852
const trackOnce = useCallback(
1953
(action: string) => {
@@ -31,7 +65,7 @@ export function TrackingProvider({ children, tracking }: { children: ReactNode;
3165
)
3266

3367
useEffect(() => {
34-
const node = ref.current // DOM Ref
68+
const node = ref.current
3569
const hasIOSupport = !!window.IntersectionObserver
3670
if (!hasIOSupport || !node) {
3771
return
@@ -45,18 +79,20 @@ export function TrackingProvider({ children, tracking }: { children: ReactNode;
4579
useEffect(() => {
4680
if (entry) {
4781
if (entry.isIntersecting) {
48-
timeoutRef.current = setTimeout(
49-
() => {
50-
trackOnce('Temps')
51-
},
52-
tracking.toLowerCase().replace(/é/g, 'e').includes('etiquette') ? 15000 : 45000
53-
)
82+
// Par défaut 15s sur les étiquettes et les infographies
83+
let timing = trackingTime[tracking] || 15000
84+
if (typeof timing !== 'number') {
85+
timing = timing(pathname, params)
86+
}
87+
timeoutRef.current = setTimeout(() => {
88+
trackOnce('Temps')
89+
}, timing)
5490
} else if (timeoutRef.current) {
5591
clearTimeout(timeoutRef.current)
5692
timeoutRef.current = null
5793
}
5894
}
59-
}, [tracking, entry])
95+
}, [tracking, entry, params, pathname])
6096

6197
return (
6298
<TrackingContext.Provider

0 commit comments

Comments
 (0)