import { type ReactourStep } from 'reactour' import React, { Suspense } from 'react' import GuidedTourStep, { type GuidedTourStepProps } from './GuidedTourStep' import styles from './_guided-tour.module.scss' import isClient from '../../services/isClient' // this is to exclude `reactour` from the main dist/module.js file. So the main bundle is smaller and so pxm can server render react-ui const Tour = React.lazy(() => import('reactour')) export type GuidedTourProps = { /** We want to display the same text in the step header for all steps. We are using `stepHeaderText` to show a different header in the content. */ stepHeaderText: string /** Function to call when the Got It button is clicked. This will close the Guided Tour */ closeCallout: GuidedTourStepProps['close'] /** Determines whether to show the Guided Tour or not. */ show: boolean /** Steps for the Guided Tour */ steps: Array<{ /** Header text for a specific tour step. */ header: string /** Body text for a specific tour step. */ body: React.ReactNode /** CSS selector for the element highlighted in a tour step. */ selector: string }> /** To trigger an action on clicking the Next button */ nextButtonCallout?: (currentStep: number) => void /** Optional prop to add a test id to the GuidedTour for QA testing */ qaTestId?: string } const GuidedTour = ({ stepHeaderText, closeCallout, show, steps, nextButtonCallout, qaTestId = 'guided-tour', }: GuidedTourProps): React.JSX.Element => { const tourSteps: ReactourStep[] = steps.map((step) => { return { selector: step.selector, content: ({ close, goTo, step: currentStep }) => { const navigate = (stepNumber: number) => { // The steps from reactour are index based and start from 0. Our steps start at 1. The stepIndex will convert our steps to index based steps. const stepIndex = currentStep - 1 if (stepNumber > currentStep) { goTo(stepIndex + 1) } else { goTo(stepIndex - 1) } } return ( ) }, } }) const scrollToElement = () => { isClient && document.querySelector(steps[0].selector)?.scrollIntoView() } return ( ) } export default GuidedTour