Skip to content

Commit b196416

Browse files
committed
Merge branch 'implement-hybrid-version-of-get-initial-url' into fix-reload-on-new-sign-in-page
# Conflicts: # modules/hybrid-app/android/src/main/java/com/expensify/reactnativehybridapp/ReactNativeHybridApp.kt # modules/hybrid-app/ios/ReactNativeHybridApp.mm # modules/hybrid-app/src/NativeReactNativeHybridApp.ts # modules/hybrid-app/src/index.native.ts # modules/hybrid-app/src/index.ts # modules/hybrid-app/src/types.ts # src/App.tsx
2 parents b79248d + 62ed2f4 commit b196416

File tree

12 files changed

+81
-55
lines changed

12 files changed

+81
-55
lines changed

modules/hybrid-app/android/src/main/java/com/expensify/reactnativehybridapp/ReactNativeHybridApp.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@ class ReactNativeHybridApp(reactContext: ReactApplicationContext) :
3838
Log.d(NAME, "`sendAuthToken` should never be called in standalone `New Expensify` app")
3939
}
4040

41+
override fun getInitialURL(promise: Promise) {
42+
Log.d(NAME, "`getInitialURL` should never be called in standalone `New Expensify` app")
43+
promise.reject("NOT_IMPLEMENTED", "getInitialURL is not implemented in standalone New Expensify app")
44+
}
45+
4146
override fun signInToOldDot(
4247
autoGeneratedLogin: String,
4348
autoGeneratedPassword: String,
@@ -57,7 +62,7 @@ class ReactNativeHybridApp(reactContext: ReactApplicationContext) :
5762
}
5863

5964
override fun getHybridAppSettings(promise: Promise) {
60-
Log.d(NAME, "`getHybridAppSettings` should never be called in standalone `New Expensify` app")
65+
Log.d(NAME, "`getHybridAppSettings` should never be called in standalone `New Expensify` app")
6166
promise.reject("NOT_IMPLEMENTED", "getHybridAppSettings is not implemented in standalone New Expensify app")
6267
}
6368
}

modules/hybrid-app/ios/ReactNativeHybridApp.mm

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ - (void)sendAuthToken:(NSString *)authToken {
2727
NSLog(@"[ReactNativeHybridApp] `sendAuthToken` should never be called in standalone `New Expensify` app");
2828
}
2929

30+
- (void)getInitialURL:(RCTPromiseResolveBlock)resolve
31+
reject:(RCTPromiseRejectBlock)reject {
32+
NSLog(@"[ReactNativeHybridApp] `getInitialURL` should never be called in standalone `New Expensify` app");
33+
reject(@"NOT_IMPLEMENTED", @"This method is not available in standalone New Expensify app", nil);
34+
}
35+
3036
- (void)signInToOldDot:(NSString *)autoGeneratedLogin autoGeneratedPassword:(NSString *)autoGeneratedPassword authToken:(NSString *)authToken email:(NSString *)email policyID:(NSString *)policyID {
3137
NSLog(@"[ReactNativeHybridApp] `signInToOldDot` should never be called in standalone `New Expensify` app");
3238
}
@@ -41,7 +47,7 @@ - (void)clearOldDotAfterSignOut {
4147

4248
- (void)getHybridAppSettings:(RCTPromiseResolveBlock)resolve
4349
reject:(RCTPromiseRejectBlock)reject {
44-
NSLog(@"[ReactNativeHybridApp] `getHybridAppSettings` should never be called in standalone `New Expensify` app");
50+
NSLog(@"[ReactNativeHybridApp] `getHybridAppSettings` should never be called in standalone `New Expensify` app");
4551
reject(@"NOT_IMPLEMENTED", @"This method is not available in standalone New Expensify app", nil);
4652
}
4753

modules/hybrid-app/src/NativeReactNativeHybridApp.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export interface Spec extends TurboModule {
99
completeOnboarding: (status: boolean) => void;
1010
switchAccount: (newDotCurrentAccountEmail: string, authToken: string, policyID: string, accountID: string) => void;
1111
sendAuthToken: (authToken: string) => void;
12+
getInitialURL(): Promise<string | null>;
1213
signInToOldDot: (autoGeneratedLogin: string, autoGeneratedPassword: string, authToken: string, email: string, policyID: string) => void;
1314
signOutFromOldDot: () => void;
1415
clearOldDotAfterSignOut: () => void;

modules/hybrid-app/src/index.native.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ const HybridAppModule: HybridAppModuleType = {
2020
sendAuthToken({authToken}) {
2121
ReactNativeHybridApp.sendAuthToken(authToken);
2222
},
23+
getInitialURL() {
24+
return ReactNativeHybridApp.getInitialURL();
25+
},
2326
signInToOldDot({autoGeneratedLogin, autoGeneratedPassword, authToken, email, policyID}) {
2427
ReactNativeHybridApp.signInToOldDot(autoGeneratedLogin, autoGeneratedPassword, authToken, email, policyID);
2528
},

modules/hybrid-app/src/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ const HybridAppModule: HybridAppModuleType = {
2424
// eslint-disable-next-line no-console
2525
console.warn('HybridAppModule: `sendAuthToken` should never be called on web');
2626
},
27+
getInitialURL() {
28+
// eslint-disable-next-line no-console
29+
console.warn('HybridAppModule: `getInitialURL` should never be called on web');
30+
return new Promise((resolve) => {
31+
resolve(null);
32+
});
33+
},
2734
signInToOldDot() {
2835
// eslint-disable-next-line no-console
2936
console.warn('HybridAppModule: `signInToOldDot` should never be called on web');

modules/hybrid-app/src/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ type HybridAppModuleType = {
55
completeOnboarding: (args: {status: boolean}) => void;
66
switchAccount: (args: {newDotCurrentAccountEmail: string; authToken: string; policyID: string; accountID: string}) => void;
77
sendAuthToken: (args: {authToken: string}) => void;
8+
getInitialURL(): Promise<string | null>;
89
signInToOldDot: (args: {autoGeneratedLogin: string; autoGeneratedPassword: string; authToken: string; email: string; policyID: string}) => void;
910
signOutFromOldDot: () => void;
1011
clearOldDotAfterSignOut: () => void;

src/App.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ import HybridAppHandler from './HybridAppHandler';
4343
import OnyxUpdateManager from './libs/actions/OnyxUpdateManager';
4444
import './libs/HybridApp';
4545
import {AttachmentModalContextProvider} from './pages/media/AttachmentModalScreen/AttachmentModalContext';
46-
import type {Route} from './ROUTES';
4746
import './setup/backgroundTask';
4847
import './setup/hybridApp';
4948
import {SplashScreenStateContextProvider} from './SplashScreenStateContext';
@@ -53,8 +52,6 @@ import {SplashScreenStateContextProvider} from './SplashScreenStateContext';
5352
* These will always be `undefined` in "pure" NewDot builds.
5453
*/
5554
type AppProps = {
56-
/** The URL specifying the initial navigation destination when the app opens */
57-
url?: Route;
5855
};
5956

6057
LogBox.ignoreLogs([
@@ -70,15 +67,15 @@ const fill = {flex: 1};
7067

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

73-
function App({url}: AppProps) {
70+
function App({}: AppProps) {
7471
useDefaultDragAndDrop();
7572
OnyxUpdateManager();
7673

7774
return (
7875
<StrictModeWrapper>
7976
<SplashScreenStateContextProvider>
80-
<InitialURLContextProvider url={url}>
81-
<HybridAppHandler />
77+
<InitialURLContextProvider>
78+
<HybridAppHandler/>
8279
<GestureHandlerRootView style={fill}>
8380
<SafeAreaProvider
8481
initialMetrics={{

src/Expensify.tsx

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ function Expensify() {
104104

105105
useDebugShortcut();
106106

107-
const [initialUrl, setInitialUrl] = useState<string | null>(null);
107+
const [initialUrl, setInitialUrl] = useState<Route | null>(null);
108108

109109
useEffect(() => {
110110
if (isCheckingPublicRoom) {
@@ -209,18 +209,14 @@ function Expensify() {
209209
// We use custom deeplink handler in setup/hybridApp
210210
if (CONFIG.IS_HYBRID_APP) {
211211
Report.doneCheckingPublicRoom();
212-
return;
213212
}
214-
setInitialUrl(url);
213+
214+
setInitialUrl(url as Route);
215215
Report.openReportFromDeepLink(url ?? '');
216216
});
217217

218218
// Open chat report from a deep link (only mobile native)
219219
Linking.addEventListener('url', (state) => {
220-
// We use custom deeplink handler in setup/hybridApp
221-
if (CONFIG.IS_HYBRID_APP) {
222-
return;
223-
}
224220
Report.openReportFromDeepLink(state.url);
225221
});
226222

src/components/InitialURLContextProvider.tsx

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ import type {AppProps} from '@src/App';
55
import type {Route} from '@src/ROUTES';
66

77
type InitialUrlContextType = {
8-
initialURL: Route | undefined;
9-
setInitialURL: React.Dispatch<React.SetStateAction<Route | undefined>>;
8+
initialURL: Route | null;
9+
setInitialURL: React.Dispatch<React.SetStateAction<Route | null>>;
1010
};
1111

1212
/** Initial url that will be opened when NewDot is embedded into Hybrid App. */
1313
const InitialURLContext = createContext<InitialUrlContextType>({
14-
initialURL: undefined,
14+
initialURL: null,
1515
setInitialURL: () => {},
1616
});
1717

@@ -20,18 +20,17 @@ type InitialURLContextProviderProps = AppProps & {
2020
children: ReactNode;
2121
};
2222

23-
function InitialURLContextProvider({children, url}: InitialURLContextProviderProps) {
24-
const [initialURL, setInitialURL] = useState<Route | undefined>();
23+
function InitialURLContextProvider({children}: InitialURLContextProviderProps) {
24+
const [initialURL, setInitialURL] = useState<Route | null>(null);
2525

2626
useEffect(() => {
27-
if (url) {
28-
setInitialURL(url);
29-
return;
30-
}
3127
Linking.getInitialURL().then((initURL) => {
28+
if (!initURL) {
29+
return;
30+
}
3231
setInitialURL(initURL as Route);
3332
});
34-
}, [url]);
33+
}, []);
3534

3635
const initialUrlContext = useMemo(
3736
() => ({

src/libs/Navigation/Navigation.ts

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,11 @@ import type {Writable} from 'type-fest';
1010
import getIsNarrowLayout from '@libs/getIsNarrowLayout';
1111
import Log from '@libs/Log';
1212
import {shallowCompare} from '@libs/ObjectUtils';
13-
import {generateReportID} from '@libs/ReportUtils';
1413
import CONST from '@src/CONST';
1514
import NAVIGATORS from '@src/NAVIGATORS';
1615
import ONYXKEYS from '@src/ONYXKEYS';
17-
import type {HybridAppRoute, Route} from '@src/ROUTES';
18-
import ROUTES, {HYBRID_APP_ROUTES} from '@src/ROUTES';
16+
import type {Route} from '@src/ROUTES';
17+
import ROUTES from '@src/ROUTES';
1918
import SCREENS, {PROTECTED_SCREENS} from '@src/SCREENS';
2019
import type {Account} from '@src/types/onyx';
2120
import getInitialSplitNavigatorState from './AppNavigator/createSplitNavigator/getInitialSplitNavigatorState';
@@ -116,23 +115,6 @@ const getTopmostReportActionId = (state = navigationRef.getState()) => getTopmos
116115
*/
117116
const closeRHPFlow = (ref = navigationRef) => originalCloseRHPFlow(ref);
118117

119-
/**
120-
* Function that generates dynamic urls from paths passed from OldDot.
121-
*/
122-
function parseHybridAppUrl(url: HybridAppRoute | Route): Route {
123-
switch (url) {
124-
case HYBRID_APP_ROUTES.MONEY_REQUEST_CREATE_TAB_MANUAL:
125-
return ROUTES.MONEY_REQUEST_CREATE_TAB_MANUAL.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.SUBMIT, CONST.IOU.OPTIMISTIC_TRANSACTION_ID, generateReportID());
126-
case HYBRID_APP_ROUTES.MONEY_REQUEST_CREATE_TAB_DISTANCE:
127-
return ROUTES.MONEY_REQUEST_CREATE_TAB_DISTANCE.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.SUBMIT, CONST.IOU.OPTIMISTIC_TRANSACTION_ID, generateReportID());
128-
case HYBRID_APP_ROUTES.MONEY_REQUEST_CREATE:
129-
case HYBRID_APP_ROUTES.MONEY_REQUEST_CREATE_TAB_SCAN:
130-
return ROUTES.MONEY_REQUEST_CREATE_TAB_SCAN.getRoute(CONST.IOU.ACTION.CREATE, CONST.IOU.TYPE.SUBMIT, CONST.IOU.OPTIMISTIC_TRANSACTION_ID, generateReportID());
131-
default:
132-
return url;
133-
}
134-
}
135-
136118
/**
137119
* Returns the current active route.
138120
*/
@@ -662,7 +644,6 @@ export default {
662644
getRouteNameFromStateEvent,
663645
getTopmostReportActionId,
664646
waitForProtectedRoutes,
665-
parseHybridAppUrl,
666647
resetToHome,
667648
goBackToHome,
668649
closeRHPFlow,

0 commit comments

Comments
 (0)