import React, { useCallback, useContext, useEffect, useState } from 'react' import clsx from 'clsx' import { CSSTransition } from 'react-transition-group' import createActivityDetector from 'activity-detector-ssr' import { Trans } from './trans' import { useDecisions } from '@consent-manager/core' import { Styles, IconProps, ButtonProps } from './index' import defaultStyles from './index.module.css' import defaultAnimationStyles from './animation-slide.module.css' import { ConsentManagerDefaultInterfaceContext } from './context' export interface IntroductionProps { CloseIcon: React.ComponentType introductionFinished: Function styles?: Styles animationStyles?: Styles slideDuration: number noActionDelay?: number Button: React.ComponentType } interface ActivityDetector { on: Function stop: Function } export const Introduction: React.FC = ({ CloseIcon, introductionFinished, styles = defaultStyles, animationStyles = defaultAnimationStyles, slideDuration, Button, noActionDelay = 4000, }) => { const { setFormVisible } = useContext(ConsentManagerDefaultInterfaceContext) const [decisions, setAndStoreDecisions] = useDecisions() const [show, setShow] = useState(false) const [isIdle, setIsIdle] = React.useState(false) const [activityDetectorInstance, setActivityDetector] = useState< ActivityDetector >() // Listen for user interaction React.useEffect(() => { const activityDetector: ActivityDetector = createActivityDetector({ timeToIdle: noActionDelay, inactivityEvents: [], }) activityDetector.on('idle', () => setIsIdle(true)) activityDetector.on('active', () => setIsIdle(false)) setActivityDetector(activityDetector) return () => activityDetector.stop() }, [noActionDelay, setActivityDetector]) // As soon user is idle for the first time, show the intro and stop listening useEffect(() => { if (isIdle && activityDetectorInstance) { setShow(true) activityDetectorInstance.stop() } }, [isIdle, setShow, activityDetectorInstance]) const onLearnMore = useCallback( e => { e.preventDefault() setShow(false) setFormVisible(true) }, [setShow, setFormVisible] ) const onEnableAll = useCallback( e => { e.preventDefault() setShow(false) for (const integrationId of Object.keys(decisions)) { decisions[integrationId] = true } setAndStoreDecisions(decisions) }, [setShow, decisions, setAndStoreDecisions] ) const onClose = useCallback( e => { e.preventDefault() setShow(false) }, [setShow] ) return ( introductionFinished()} >

( )} />
) }