Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | 1x 7x 7x 7x 7x 7x 7x 7x 7x 6x 7x 3x 3x 3x 7x 4x 4x 4x 7x | import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { NavigationContainerRef } from '@react-navigation/native';
import { CoreNavigation } from '@repo/core/navigation/CoreNavigation';
import { DeepLinkProvider } from '@/contexts/DeepLinkContext';
import { linkingConfig, useNavigateDeepLinks } from '@/hooks/deeplink';
import type { AppStackParamList } from '@/types/navigation';
import { AppStackNavigation } from './AppStackNavigation';
type TimeoutHandle = number | { cancel: () => void };
export const Navigation = () => {
const navigationRef = useRef<NavigationContainerRef<AppStackParamList>>(null);
const isNavigationReadyRef = useRef(false);
const timeoutRefsRef = useRef<TimeoutHandle[]>([]);
const { processPendingDeepLink, setPendingDeepLink, navigateFromDeepLink } = useNavigateDeepLinks(
navigationRef,
isNavigationReadyRef,
timeoutRefsRef,
);
const contextValueRef = useRef({ setPendingDeepLink, navigateFromDeepLink });
contextValueRef.current = { setPendingDeepLink, navigateFromDeepLink };
const [isNavigationReadyState, setIsNavigationReadyState] = useState(false);
const contextValue = useMemo(
() => ({
setPendingDeepLink: (url: string) => contextValueRef.current.setPendingDeepLink(url),
navigateFromDeepLink: (url: string) => contextValueRef.current.navigateFromDeepLink(url),
navigationRef,
isNavigationReady: isNavigationReadyState,
}),
[isNavigationReadyState],
);
useEffect(() => {
return () => {
timeoutRefsRef.current.forEach(handle => {
typeof handle === 'number' ? cancelAnimationFrame(handle) : handle.cancel();
});
timeoutRefsRef.current = [];
};
}, []);
const handleNavigationReady = useCallback(() => {
isNavigationReadyRef.current = true;
setIsNavigationReadyState(true);
processPendingDeepLink();
}, [processPendingDeepLink]);
return (
<DeepLinkProvider value={contextValue}>
<CoreNavigation
navigationRef={navigationRef}
linking={linkingConfig}
onReady={handleNavigationReady}
>
<AppStackNavigation />
</CoreNavigation>
</DeepLinkProvider>
);
};
|