Skip to content

Commit d6059b7

Browse files
better positioning
1 parent 695f1dd commit d6059b7

File tree

1 file changed

+57
-22
lines changed
  • src/components/guided-modal-tour

1 file changed

+57
-22
lines changed

src/components/guided-modal-tour/index.js

Lines changed: 57 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)