diff --git a/src/hooks/useTourEngine.ts b/src/hooks/useTourEngine.ts index 8b4975d8c..ab2e2bb7d 100644 --- a/src/hooks/useTourEngine.ts +++ b/src/hooks/useTourEngine.ts @@ -70,9 +70,13 @@ export default function useTourEngine(props: Props): UseTourEngineReturn { useUpdateEffect(() => { if (run && size && status === STATUS.IDLE) { - store.current.updateState({ status: STATUS.READY }); + if (validateSteps(steps, debug)) { + controls.start(stepIndex ?? initialStepIndex); + } else { + store.current.updateState({ status: STATUS.READY }); + } } - }, [run, size, status]); + }, [controls, debug, initialStepIndex, run, size, status, stepIndex, steps]); usePropSync({ controls, diff --git a/test/hooks/useTourEngine.spec.ts b/test/hooks/useTourEngine.spec.ts index e93bae8c1..b985e1473 100644 --- a/test/hooks/useTourEngine.spec.ts +++ b/test/hooks/useTourEngine.spec.ts @@ -841,6 +841,26 @@ describe('useTourEngine', () => { expect(result.current.state.size).toBe(3); }); }); + + it('should start the tour when run is already true and steps arrive after mount', async () => { + const { rerender, result } = renderHook((props: Props) => useTourEngine(props), { + initialProps: createProps({ run: true, steps: [] }), + }); + + expect(result.current.state.status).toBe(STATUS.IDLE); + expect(mockOnEvent).not.toHaveBeenCalled(); + + rerender(createProps({ run: true, steps: testSteps })); + + await waitFor(() => { + expect(result.current.state.status).toBe(STATUS.RUNNING); + }); + + expect(mockOnEvent).toHaveBeenCalledWith( + expect.objectContaining({ type: EVENTS.TOUR_START }), + expectControls(), + ); + }); }); describe('Scroll', () => {