Skip to content

Commit e51f63c

Browse files
authored
Revert "[CP staging] Revert "Improve HybridApp initialProps""
1 parent 0a8ae6b commit e51f63c

4 files changed

Lines changed: 74 additions & 41 deletions

File tree

src/App.tsx

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ import CONFIG from './CONFIG';
3939
import Expensify from './Expensify';
4040
import {CurrentReportIDContextProvider} from './hooks/useCurrentReportID';
4141
import useDefaultDragAndDrop from './hooks/useDefaultDragAndDrop';
42+
import HybridAppHandler from './HybridAppHandler';
4243
import OnyxUpdateManager from './libs/actions/OnyxUpdateManager';
4344
import {ReportAttachmentsProvider} from './pages/home/report/ReportAttachmentsContext';
4445
import type {Route} from './ROUTES';
@@ -54,8 +55,6 @@ type AppProps = {
5455
url?: Route;
5556
/** Serialized configuration data required to initialize the React Native app (e.g. authentication details) */
5657
hybridAppSettings?: string;
57-
/** A timestamp indicating when the initial properties were last updated, used to detect changes */
58-
timestamp?: string;
5958
};
6059

6160
LogBox.ignoreLogs([
@@ -71,18 +70,14 @@ const fill = {flex: 1};
7170

7271
const StrictModeWrapper = CONFIG.USE_REACT_STRICT_MODE_IN_DEV ? React.StrictMode : ({children}: {children: React.ReactElement}) => children;
7372

74-
function App({url, hybridAppSettings, timestamp}: AppProps) {
73+
function App({url, hybridAppSettings}: AppProps) {
7574
useDefaultDragAndDrop();
7675
OnyxUpdateManager();
7776

7877
return (
7978
<StrictModeWrapper>
8079
<SplashScreenStateContextProvider>
81-
<InitialURLContextProvider
82-
url={url}
83-
hybridAppSettings={hybridAppSettings}
84-
timestamp={timestamp}
85-
>
80+
<InitialURLContextProvider url={url}>
8681
<GestureHandlerRootView style={fill}>
8782
<ComposeProviders
8883
components={[
@@ -119,6 +114,12 @@ function App({url, hybridAppSettings, timestamp}: AppProps) {
119114
>
120115
<CustomStatusBarAndBackground />
121116
<ErrorBoundary errorMessage="NewExpensify crash caught by error boundary">
117+
{CONFIG.IS_HYBRID_APP && (
118+
<HybridAppHandler
119+
url={url}
120+
hybridAppSettings={hybridAppSettings}
121+
/>
122+
)}
122123
<ColorSchemeWrapper>
123124
<Expensify />
124125
</ColorSchemeWrapper>

src/Expensify.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,10 @@ function Expensify() {
215215

216216
// Open chat report from a deep link (only mobile native)
217217
Linking.addEventListener('url', (state) => {
218+
// We use custom deeplink handler in HybridAppHandler
219+
if (CONFIG.IS_HYBRID_APP) {
220+
return;
221+
}
218222
Report.openReportFromDeepLink(state.url);
219223
});
220224

src/HybridAppHandler.tsx

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import {findFocusedRoute} from '@react-navigation/native';
2+
import {useContext, useEffect, useState} from 'react';
3+
import {Linking} from 'react-native';
4+
import type {AppProps} from './App';
5+
import CONST from './CONST';
6+
import {signInAfterTransitionFromOldDot} from './libs/actions/Session';
7+
import Navigation, {navigationRef} from './libs/Navigation/Navigation';
8+
import type {Route} from './ROUTES';
9+
import ROUTES from './ROUTES';
10+
import SCREENS from './SCREENS';
11+
import SplashScreenStateContext from './SplashScreenStateContext';
12+
13+
function handleHybridUrlNavigation(url: Route) {
14+
const parsedUrl = Navigation.parseHybridAppUrl(url);
15+
16+
Navigation.isNavigationReady().then(() => {
17+
if (parsedUrl.startsWith(`/${ROUTES.SHARE_ROOT}`)) {
18+
const focusRoute = findFocusedRoute(navigationRef.getRootState());
19+
if (focusRoute?.name === SCREENS.SHARE.SHARE_DETAILS || focusRoute?.name === SCREENS.SHARE.SUBMIT_DETAILS) {
20+
Navigation.goBack(ROUTES.SHARE_ROOT);
21+
return;
22+
}
23+
}
24+
Navigation.navigate(parsedUrl);
25+
});
26+
}
27+
28+
function HybridAppHandler({url, hybridAppSettings}: AppProps) {
29+
const [signInHandled, setSignInHandled] = useState(false);
30+
const {setSplashScreenState} = useContext(SplashScreenStateContext);
31+
32+
useEffect(() => {
33+
const listener = Linking.addEventListener('url', (state) => {
34+
handleHybridUrlNavigation(state.url as Route);
35+
});
36+
37+
return () => {
38+
listener.remove();
39+
};
40+
}, []);
41+
42+
if (!url || !hybridAppSettings || signInHandled) {
43+
return null;
44+
}
45+
46+
signInAfterTransitionFromOldDot(hybridAppSettings).then(() => {
47+
handleHybridUrlNavigation(url);
48+
setSplashScreenState(CONST.BOOT_SPLASH_STATE.READY_TO_BE_HIDDEN);
49+
setSignInHandled(true);
50+
});
51+
52+
return null;
53+
}
54+
55+
HybridAppHandler.displayName = 'HybridAppHandler';
56+
57+
export default HybridAppHandler;

src/components/InitialURLContextProvider.tsx

Lines changed: 4 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,8 @@
1-
import {findFocusedRoute} from '@react-navigation/native';
21
import React, {createContext, useEffect, useMemo, useState} from 'react';
32
import type {ReactNode} from 'react';
43
import {Linking} from 'react-native';
5-
import {signInAfterTransitionFromOldDot} from '@libs/actions/Session';
6-
import Navigation, {navigationRef} from '@navigation/Navigation';
74
import type {AppProps} from '@src/App';
8-
import CONST from '@src/CONST';
95
import type {Route} from '@src/ROUTES';
10-
import ROUTES from '@src/ROUTES';
11-
import SCREENS from '@src/SCREENS';
12-
import {useSplashScreenStateContext} from '@src/SplashScreenStateContext';
136

147
type InitialUrlContextType = {
158
initialURL: Route | undefined;
@@ -27,40 +20,18 @@ type InitialURLContextProviderProps = AppProps & {
2720
children: ReactNode;
2821
};
2922

30-
function InitialURLContextProvider({children, url, hybridAppSettings, timestamp}: InitialURLContextProviderProps) {
23+
function InitialURLContextProvider({children, url}: InitialURLContextProviderProps) {
3124
const [initialURL, setInitialURL] = useState<Route | undefined>();
32-
const {splashScreenState, setSplashScreenState} = useSplashScreenStateContext();
3325

3426
useEffect(() => {
35-
if (url && hybridAppSettings) {
36-
signInAfterTransitionFromOldDot(hybridAppSettings).then(() => {
37-
setInitialURL(url);
38-
39-
const parsedUrl = Navigation.parseHybridAppUrl(url);
40-
41-
Navigation.isNavigationReady().then(() => {
42-
if (parsedUrl.startsWith(`/${ROUTES.SHARE_ROOT}`)) {
43-
const focusRoute = findFocusedRoute(navigationRef.getRootState());
44-
if (focusRoute?.name === SCREENS.SHARE.SHARE_DETAILS || focusRoute?.name === SCREENS.SHARE.SUBMIT_DETAILS) {
45-
Navigation.goBack(ROUTES.SHARE_ROOT);
46-
return;
47-
}
48-
}
49-
Navigation.navigate(parsedUrl);
50-
});
51-
52-
if (splashScreenState === CONST.BOOT_SPLASH_STATE.HIDDEN) {
53-
return;
54-
}
55-
setSplashScreenState(CONST.BOOT_SPLASH_STATE.READY_TO_BE_HIDDEN);
56-
});
27+
if (url) {
28+
setInitialURL(url);
5729
return;
5830
}
5931
Linking.getInitialURL().then((initURL) => {
6032
setInitialURL(initURL as Route);
6133
});
62-
// eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps
63-
}, [url, hybridAppSettings, timestamp]);
34+
}, [url]);
6435

6536
const initialUrlContext = useMemo(
6637
() => ({

0 commit comments

Comments
 (0)