@@ -82,6 +82,7 @@ const ModalTour = props => {
8282 const [ isVisible , setIsVisible ] = useState ( false )
8383 const [ isVisibleDelayed , setIsVisibleDelayed ] = useState ( false )
8484 const [ forceRefresh , setForceRefresh ] = useState ( 0 )
85+ const [ isTransitioning , setIsTransitioning ] = useState ( false )
8586 const modalRef = useRef ( null )
8687 const glowElementRef = useRef ( null )
8788
@@ -109,45 +110,79 @@ const ModalTour = props => {
109110 // While the modal is visible, just keep on force refreshing the modal in an interval to make sure the modal is always in the correct position.
110111 useEffect ( ( ) => {
111112 let interval
112- if ( isVisible ) {
113+ if ( isVisible && ! isTransitioning ) {
113114 interval = setInterval ( ( ) => {
114115 setForceRefresh ( forceRefresh => forceRefresh + 1 )
115- } , 300 )
116+ } , 500 )
116117 }
117118 return ( ) => clearInterval ( interval )
118- } , [ isVisible , isVisibleDelayed ] )
119+ } , [ isVisible , isVisibleDelayed , isTransitioning ] )
119120
120121 // Create a stable function reference for the event listener
121122 const handleNextEvent = useCallback ( ( ) => {
122- setCurrentStep ( currentStep => {
123+ // Hide modal during transition
124+ setIsVisible ( false )
125+ setIsVisibleDelayed ( false )
126+ setIsTransitioning ( true )
127+
128+ setTimeout ( ( ) => {
129+ setCurrentStep ( currentStep => {
130+ setTimeout ( ( ) => {
131+ steps [ currentStep ] ?. postStep ?. ( currentStep )
132+ } , 50 )
133+ const nextStep = currentStep + 1
134+ steps [ nextStep ] ?. preStep ?. ( nextStep )
135+ return nextStep
136+ } )
137+
138+ // Show modal after 200ms delay
123139 setTimeout ( ( ) => {
124- steps [ currentStep ] ?. postStep ?. ( currentStep )
125- } , 50 )
126- const nextStep = currentStep + 1
127- steps [ nextStep ] ?. preStep ?. ( nextStep )
128- return nextStep
129- } )
140+ setIsVisible ( true )
141+ setTimeout ( ( ) => {
142+ setIsVisibleDelayed ( true )
143+ setIsTransitioning ( false )
144+ } , 150 )
145+ } , 200 )
146+ } , 100 )
147+
130148 setTimeout ( ( ) => {
131149 setForceRefresh ( forceRefresh => forceRefresh + 1 )
132- } , 50 )
150+ } , 350 )
133151 setTimeout ( ( ) => {
134152 setForceRefresh ( forceRefresh => forceRefresh + 1 )
135- } , 350 )
153+ } , 650 )
136154 } , [ currentStep , steps ] )
137155
138156 const handleBackEvent = useCallback ( ( ) => {
139- setCurrentStep ( currentStep => {
140- // steps[ currentStep ]?.postStep?.( currentStep )
141- const nextStep = currentStep - 1
142- steps [ nextStep ] ?. preStep ?. ( nextStep )
143- return nextStep
144- } )
157+ // Hide modal during transition
158+ setIsVisible ( false )
159+ setIsVisibleDelayed ( false )
160+ setIsTransitioning ( true )
161+
145162 setTimeout ( ( ) => {
146- setForceRefresh ( forceRefresh => forceRefresh + 1 )
147- } , 50 )
163+ setCurrentStep ( currentStep => {
164+ // steps[ currentStep ]?.postStep?.( currentStep )
165+ const nextStep = currentStep - 1
166+ steps [ nextStep ] ?. preStep ?. ( nextStep )
167+ return nextStep
168+ } )
169+
170+ // Show modal after 200ms delay
171+ setTimeout ( ( ) => {
172+ setIsVisible ( true )
173+ setTimeout ( ( ) => {
174+ setIsVisibleDelayed ( true )
175+ setIsTransitioning ( false )
176+ } , 150 )
177+ } , 200 )
178+ } , 100 )
179+
148180 setTimeout ( ( ) => {
149181 setForceRefresh ( forceRefresh => forceRefresh + 1 )
150182 } , 350 )
183+ setTimeout ( ( ) => {
184+ setForceRefresh ( forceRefresh => forceRefresh + 1 )
185+ } , 650 )
151186 } , [ currentStep , steps ] )
152187
153188 // Show modal after 1 second delay
@@ -261,7 +296,7 @@ const ModalTour = props => {
261296 default :
262297 return defaultOffset
263298 }
264- } , [ anchor , position , modalRef . current , isVisible , isVisibleDelayed , forceRefresh ] )
299+ } , [ anchor , position , modalRef . current , isVisible , isVisibleDelayed , isTransitioning , forceRefresh ] )
265300
266301 // If we have a glow target, create a new element in the body, placed on the top of the target, below the modal.
267302 useEffect ( ( ) => {
@@ -288,7 +323,7 @@ const ModalTour = props => {
288323 } else if ( glowElementRef . current ) {
289324 glowElementRef . current . className = `ugb-tour-modal__glow ugb-tour-modal__glow--hidden`
290325 }
291- } , [ glowTarget , currentStep , isVisible , isVisibleDelayed , forceRefresh ] )
326+ } , [ glowTarget , currentStep , isVisible , isVisibleDelayed , isTransitioning , forceRefresh ] )
292327
293328 if ( ! isVisible ) {
294329 return null
0 commit comments