1- import { useEffect , useRef , useState } from 'react' ;
1+ import { useEffect , useRef , useMemo } from 'react' ;
22import Router from 'next/router' ;
33import { useOnboarding } from './use-onboarding' ;
44import { useQuery } from '@connectrpc/connect-query' ;
@@ -10,57 +10,57 @@ import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb
1010 * the conditions based on feature flag and onboarding metadata
1111 */
1212export const useOnboardingNavigation = ( ) => {
13- const { enabled, onboarding , setOnboarding } = useOnboarding ( ) ;
14- const { data, isError, isPending, error } = useQuery ( getOnboarding ) ;
15- const [ initialLoadSuccess , setInitialLoadSuccess ] = useState ( false ) ;
13+ const { enabled, setOnboarding , skipped , currentStep } = useOnboarding ( ) ;
14+ const { data, isError, isPending } = useQuery ( getOnboarding ) ;
15+ const initialRedirect = useRef < boolean > ( false ) ;
1616
17- useEffect (
18- function initialOnboardingFetch ( ) {
19- if ( isPending ) {
20- return ;
21- }
17+ const initialLoadSuccess = useMemo ( ( ) => {
18+ if ( isPending ) return null ;
19+ if ( isError || data ?. response ?. code !== EnumStatusCode . OK ) return false ;
20+ return true ;
21+ } , [ isPending , isError , data ] ) ;
2222
23- if ( isError || data ?. response ?. code !== EnumStatusCode . OK ) {
24- setInitialLoadSuccess ( false ) ;
23+ useEffect (
24+ function syncOnboardingMetadata ( ) {
25+ if ( initialLoadSuccess !== true || ! data ) {
2526 return ;
2627 }
2728
28- setInitialLoadSuccess ( true ) ;
2929 setOnboarding ( {
30- step : Number ( data . step ?? 0 ) ,
3130 finishedAt : data . finishedAt ? new Date ( data . finishedAt ) : undefined ,
3231 federatedGraphsCount : data . federatedGraphsCount ,
3332 } ) ;
3433 } ,
35- [ data , isError , isPending , setOnboarding , error ] ,
34+ [ initialLoadSuccess , data , setOnboarding ] ,
3635 ) ;
3736
3837 useEffect (
3938 function handleNavigationToOnboarding ( ) {
40- // Redirect user back if onboarding metadata failed
41- if ( ! initialLoadSuccess && Router . pathname . startsWith ( '/ onboarding' ) ) {
42- Router . replace ( '/' ) ;
39+ // Wait for the onboarding metadata query to resolve
40+ // Do not initiate redirect if we fail to fetch onboarding metadata. Fail silently in background.
41+ if ( initialLoadSuccess === null || ! initialLoadSuccess ) {
4342 return ;
4443 }
4544
46- // Do not initiate redirect if we fail to fetch onboarding metadata. Fail silently in background.
47- if ( ! initialLoadSuccess ) {
45+ // If user has dissmissed/skipped the onboarding but, do not redirect
46+ if ( skipped ) {
4847 return ;
4948 }
5049
51- // Do not initiate redirect if the user is not eligible for onboarding
52- if ( ! onboarding && ! enabled ) {
50+ // If user has already finished the onboarding, don't redirect
51+ if ( data ?. finishedAt ) {
5352 return ;
5453 }
5554
56- // Do not initiate redirect if user has already finished the onboarding
57- if ( onboarding ?. finishedAt ) {
55+ // skip redirecting on subsequent re-runs of this functions
56+ if ( initialRedirect . current ) {
5857 return ;
5958 }
6059
61- const path = onboarding ? `/onboarding/${ onboarding . step } ` : '/onboarding' ;
60+ const path = currentStep ? `/onboarding/${ currentStep } ` : `/onboarding/1` ;
61+ initialRedirect . current = true ;
6262 Router . replace ( path ) ;
6363 } ,
64- [ onboarding , enabled , initialLoadSuccess ] ,
64+ [ data , enabled , initialLoadSuccess , skipped , currentStep ] ,
6565 ) ;
6666} ;
0 commit comments