Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
148 commits
Select commit Hold shift + click to select a range
5eaa292
Implement POC of NewDot login page on HybridApp
mateuuszzzzz Oct 22, 2024
404047f
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Oct 28, 2024
f81ec86
fix android crash
war-in Oct 29, 2024
290748d
add HybridApp onyx key
war-in Oct 29, 2024
05c4573
wip - sending native events
war-in Oct 31, 2024
b6e14aa
Merge branch 'refs/heads/main' into war-in/unmock-signing-in
war-in Oct 31, 2024
bb05ef9
js logic
war-in Oct 31, 2024
94ebb8f
fix switching to new experience
war-in Oct 31, 2024
a9ff586
block switching when still signing in to OD
war-in Oct 31, 2024
ec6315e
reset onyx values on start
war-in Oct 31, 2024
db0d806
Merge branch 'refs/heads/main' into make-new-dot-signin-default-for-h…
war-in Oct 31, 2024
e1562bb
preserve HYBRID_APP onyx key when signing out
war-in Oct 31, 2024
efde805
fix
war-in Oct 31, 2024
a1b9e1a
move part of resetting logic
war-in Oct 31, 2024
3ad1b62
move useNewDotSignInPage to HybridApp key
war-in Nov 4, 2024
f9b0e5a
fix lint & typecheck
war-in Nov 4, 2024
377b686
correctly set onyx props when switching from OD
war-in Nov 4, 2024
90f7c0f
don't set HybridApp key in onyx (merge it)
war-in Nov 4, 2024
4b3e539
send error message on failed OD login
war-in Nov 4, 2024
026ac7b
add useOldDot const
war-in Nov 5, 2024
624be42
Merge branch 'main' into war-in/unmock-signing-in
war-in Nov 6, 2024
44dffc8
Merge branch 'war-in/unmock-signing-in' into make-new-dot-signin-defa…
war-in Nov 6, 2024
d976148
Bootsplash logic in hybridapp (#132)
jnowakow Nov 7, 2024
11e444d
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Nov 12, 2024
a78141d
fix clearing onyx
war-in Nov 13, 2024
deaba6f
[HybridApp] Do not use query params in AppProp URL (#125)
mateuuszzzzz Nov 13, 2024
f2e3bb4
Handle OD sing-in errors (#136)
war-in Nov 13, 2024
8859b6c
add disabled to button
war-in Nov 13, 2024
a3436bc
move sign in state to HybridApp key
war-in Nov 13, 2024
703c31d
add loading indicator and error modal
war-in Nov 14, 2024
1f6a0e1
move sign in logic to HybridApp.ts
war-in Nov 14, 2024
63a3de8
fix lint
war-in Nov 14, 2024
9fdeebb
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
mateuuszzzzz Nov 18, 2024
4bc9f90
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
mateuuszzzzz Nov 20, 2024
1a99fd1
Prevent closing NewDot on first transition with button
mateuuszzzzz Nov 20, 2024
0e601bd
use "tryNewDot" value to determine which app should be opened
war-in Nov 21, 2024
1c0c219
first step to fix deeplinks
war-in Nov 21, 2024
c848cfd
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Nov 27, 2024
4170968
improve openApp flow
war-in Nov 27, 2024
50c3fed
[HybridApp] Clean code (#143)
mateuuszzzzz Nov 27, 2024
fb82b65
[HybridApp] Refactor `SignInPage` PR v2 (#144)
mateuuszzzzz Nov 28, 2024
ecb93e2
fix part of signup flow
war-in Nov 27, 2024
6f926fe
[SignIn Page] New user flow (#145)
war-in Nov 28, 2024
f540207
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Nov 28, 2024
5aae4be
Merge remote-tracking branch 'origin/make-new-dot-signin-default-for-…
war-in Nov 28, 2024
90c0954
fix isSingleNewDotEntry logic (travel feature)
war-in Dec 2, 2024
13180c2
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Dec 2, 2024
ddb9aef
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Dec 5, 2024
9cfbaf5
Rename argument
mateuuszzzzz Dec 5, 2024
85eddb2
Change function name
mateuuszzzzz Dec 5, 2024
bddba03
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Dec 9, 2024
68ed516
Dont sign in in old dot (#150)
war-in Dec 9, 2024
9450d21
clear onyx but leave same data as when signing out
war-in Dec 9, 2024
62b861c
Improve data fetching on OldDot side
mateuuszzzzz Dec 10, 2024
8ea545c
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
mateuuszzzzz Dec 11, 2024
837cbfe
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Dec 13, 2024
892dec2
Add named params in HybridAppModule methods (#153)
war-in Dec 13, 2024
7494419
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Jan 22, 2025
1e113cd
fix after merge
war-in Jan 22, 2025
5f18606
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Jan 22, 2025
3655c4f
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Jan 23, 2025
1cc1cd1
adjust copilot to new sign in flow
war-in Jan 23, 2025
e801e92
Merge branch 'refs/heads/main' into make-new-dot-signin-default-for-h…
war-in Feb 3, 2025
4f3a35e
post-merge fixes
war-in Feb 3, 2025
190ec0d
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
jnowakow Feb 4, 2025
fd1d9c9
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Feb 6, 2025
708d8ed
post-merge fixes
war-in Feb 6, 2025
793608f
fix status bar when signing into OldDot
war-in Feb 6, 2025
5e4da6d
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Mar 17, 2025
6aa71bb
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Mar 17, 2025
d9bb31f
post-merge fixes
war-in Mar 17, 2025
a695ee3
fix status bar
war-in Mar 17, 2025
3b82ff2
fix lint
war-in Mar 17, 2025
e9b519a
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Mar 19, 2025
8ca7eec
fix broken sign in logic
war-in Mar 19, 2025
7e57e9a
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Mar 21, 2025
639de0e
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Mar 25, 2025
48472bf
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Apr 1, 2025
47ac77d
fix backend issue
war-in Apr 1, 2025
5934f15
fix wrong if
war-in Apr 1, 2025
e23956a
use useFocusEffect instead of useEffect and migrate component to useOnyx
war-in Apr 1, 2025
9537970
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Apr 8, 2025
b4d2443
remove temporary fix
war-in Apr 8, 2025
8b0ad0b
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
289Adam289 Apr 11, 2025
ee3e904
fix navigation from OD
289Adam289 Apr 22, 2025
529b82d
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
289Adam289 Apr 25, 2025
89b69e7
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
289Adam289 May 5, 2025
8d1d5c7
post-merge new onyxkeys names fix
289Adam289 May 6, 2025
0eb2689
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in May 7, 2025
7d15876
fix copilot navigation issue
war-in May 7, 2025
1a3f988
Fix condition and add useCallback
289Adam289 May 9, 2025
003d215
Fix SAML flow
289Adam289 May 9, 2025
ed2866a
Add temporary growl in google sign in flow
289Adam289 May 9, 2025
fe625b3
Fix sending authToken after signOut
289Adam289 May 12, 2025
2a9b7c8
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
289Adam289 May 12, 2025
ac89c5e
fix lint
289Adam289 May 12, 2025
a9d437d
fix prettier
289Adam289 May 13, 2025
3886d8e
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in May 13, 2025
cd7ef32
Change google sign-in configuration
289Adam289 May 15, 2025
0d82833
Fix iOS client ID on HybridApp
mateuuszzzzz May 16, 2025
8405068
add missing sign-in growls
289Adam289 May 16, 2025
aa3ec95
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
289Adam289 May 19, 2025
2d386c6
Fix comments
289Adam289 May 19, 2025
38c8201
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
289Adam289 May 20, 2025
706730f
Fix should show auth screens
289Adam289 May 21, 2025
18168b3
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
289Adam289 May 21, 2025
2344ace
Merge branch 'refs/heads/main' into make-new-dot-signin-default-for-h…
war-in May 26, 2025
f0f321c
Fix blink in OD -> ND transition after sign-out (#226)
war-in May 27, 2025
6645102
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in May 27, 2025
6977086
fix few review comments
war-in May 27, 2025
f643be4
simplify hybridAppSettings
war-in May 27, 2025
63cadff
fix broken copilot
war-in May 27, 2025
a8bf4a5
Fix Sign in page assets loading
289Adam289 May 27, 2025
dea675d
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
mateuuszzzzz May 28, 2025
379a27a
Fix notification permission prompt on iOS
mateuuszzzzz May 29, 2025
7fc6eb1
fix blinking validate code screen
war-in May 29, 2025
4b3be53
Remove unnecessary workaround
289Adam289 May 29, 2025
dbe184c
Sign out from OldDot when account is closed on NewDot
mateuuszzzzz May 30, 2025
0e54b4b
Add PermissionStatus mock
mateuuszzzzz May 30, 2025
33ca95a
Fix OD sign in for new accounts
289Adam289 May 30, 2025
696eb68
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
289Adam289 Jun 2, 2025
6281f71
Fix lint and prettier
289Adam289 Jun 3, 2025
140438d
Fix changed files lint
289Adam289 Jun 3, 2025
85af8ef
fix google sign-in redirect
289Adam289 Jun 5, 2025
ac0f3e6
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
289Adam289 Jun 6, 2025
24b4c7b
Fix tryNewDot onyx updates
289Adam289 Jun 9, 2025
58b81b0
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
289Adam289 Jun 9, 2025
0822cc2
Disable spell check on ids
289Adam289 Jun 9, 2025
18b2056
Remmove Google and Apple growls
289Adam289 Jun 10, 2025
80dc3a5
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Jun 10, 2025
c86d325
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
war-in Jun 10, 2025
1708d62
post-merge fixes
war-in Jun 10, 2025
4989807
Merge remote-tracking branch 'origin/make-new-dot-signin-default-for-…
war-in Jun 10, 2025
7a74fe9
Fix prettier
289Adam289 Jun 10, 2025
dda0f65
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
289Adam289 Jun 11, 2025
35f5640
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
mateuuszzzzz Jun 13, 2025
31cd24f
Fix account switcher disappearing
289Adam289 Jun 13, 2025
a139586
Fix copilot not working on first try
289Adam289 Jun 13, 2025
28bd4ce
add HYBRID_APP to preserved keys
war-in Jun 13, 2025
40c081c
Merge remote-tracking branch 'origin/make-new-dot-signin-default-for-…
war-in Jun 13, 2025
a268585
Simplify shouldInit
mateuuszzzzz Jun 16, 2025
df50cd4
Remove setRootStatusBarEnabled
mateuuszzzzz Jun 16, 2025
2f0b256
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
mateuuszzzzz Jun 16, 2025
9ef3a91
Fix prettier
mateuuszzzzz Jun 16, 2025
0868500
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
mateuuszzzzz Jun 16, 2025
a747b04
Protect hybridApp functions on standalone
289Adam289 Jun 16, 2025
cc53169
Move setClosingReactNative to a wrapper
289Adam289 Jun 16, 2025
ec57608
Merge branch 'main' into make-new-dot-signin-default-for-hybridapp
mateuuszzzzz Jun 17, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion __mocks__/@ua/react-native-airship.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@ enum EventType {
PushReceived = 'com.airship.push_received',
}

// eslint-disable-next-line no-restricted-syntax
enum PermissionStatus {
Granted = 'granted',
Denied = 'denied',
NotDetermined = 'not_determined',
}

// eslint-disable-next-line @typescript-eslint/no-namespace
namespace iOS {
/**
Expand Down Expand Up @@ -71,4 +78,4 @@ const Airship: Partial<AirshipRoot> = {

export default Airship;

export {EventType, iOS};
export {EventType, iOS, PermissionStatus};
Original file line number Diff line number Diff line change
Expand Up @@ -36,4 +36,22 @@ class ReactNativeHybridApp(reactContext: ReactApplicationContext) :
override fun sendAuthToken(authToken: String?) {
Log.d(NAME, "`sendAuthToken` should never be called in standalone `New Expensify` app")
}

override fun signInToOldDot(
autoGeneratedLogin: String,
autoGeneratedPassword: String,
authToken: String,
email: String,
policyID: String
) {
Log.d(NAME, "`signInToOldDot` should never be called in standalone `New Expensify` app")
}

override fun signOutFromOldDot() {
Log.d(NAME, "`signOutFromOldDot` should never be called in standalone `New Expensify` app")
}

override fun clearOldDotAfterSignOut() {
Log.d(NAME, "`clearOldDotAfterSignOut` should never be called in standalone `New Expensify` app")
}
}
12 changes: 12 additions & 0 deletions modules/hybrid-app/ios/ReactNativeHybridApp.mm
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,18 @@ - (void)sendAuthToken:(NSString *)authToken {
NSLog(@"[ReactNativeHybridApp] `sendAuthToken` should never be called in standalone `New Expensify` app");
}

- (void)signInToOldDot:(NSString *)autoGeneratedLogin autoGeneratedPassword:(NSString *)autoGeneratedPassword authToken:(NSString *)authToken email:(NSString *)email policyID:(NSString *)policyID {
NSLog(@"[ReactNativeHybridApp] `signInToOldDot` should never be called in standalone `New Expensify` app");
}

- (void)signOutFromOldDot {
NSLog(@"[ReactNativeHybridApp] `signOutFromOldDot` should never be called in standalone `New Expensify` app");
}

- (void)clearOldDotAfterSignOut {
NSLog(@"[ReactNativeHybridApp] `clearOldDotAfterSignOut` should never be called in standalone `New Expensify` app");
}

- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:
(const facebook::react::ObjCTurboModule::InitParams &)params
{
Expand Down
3 changes: 3 additions & 0 deletions modules/hybrid-app/src/NativeReactNativeHybridApp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ export interface Spec extends TurboModule {
completeOnboarding: (status: boolean) => void;
switchAccount: (newDotCurrentAccountEmail: string, authToken: string, policyID: string, accountID: string) => void;
sendAuthToken: (authToken: string) => void;
signInToOldDot: (autoGeneratedLogin: string, autoGeneratedPassword: string, authToken: string, email: string, policyID: string) => void;
signOutFromOldDot: () => void;
clearOldDotAfterSignOut: () => void;
}

export default TurboModuleRegistry.getEnforcing<Spec>('ReactNativeHybridApp');
9 changes: 9 additions & 0 deletions modules/hybrid-app/src/index.native.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,15 @@ const HybridAppModule: HybridAppModuleType = {
sendAuthToken({authToken}) {
ReactNativeHybridApp.sendAuthToken(authToken);
},
signInToOldDot({autoGeneratedLogin, autoGeneratedPassword, authToken, email, policyID}) {
ReactNativeHybridApp.signInToOldDot(autoGeneratedLogin, autoGeneratedPassword, authToken, email, policyID);
},
signOutFromOldDot() {
ReactNativeHybridApp.signOutFromOldDot();
},
clearOldDotAfterSignOut() {
ReactNativeHybridApp.clearOldDotAfterSignOut();
},
};

export default HybridAppModule;
12 changes: 12 additions & 0 deletions modules/hybrid-app/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,18 @@ const HybridAppModule: HybridAppModuleType = {
// eslint-disable-next-line no-console
console.warn('HybridAppModule: `sendAuthToken` should never be called on web');
},
signInToOldDot() {
// eslint-disable-next-line no-console
console.warn('HybridAppModule: `signInToOldDot` should never be called on web');
},
signOutFromOldDot() {
// eslint-disable-next-line no-console
console.warn('HybridAppModule: `signOutFromOldDot` should never be called on web');
},
clearOldDotAfterSignOut() {
// eslint-disable-next-line no-console
console.warn('HybridAppModule: `clearOldDotAfterSignOut` should never be called on web');
},
};

export default HybridAppModule;
3 changes: 3 additions & 0 deletions modules/hybrid-app/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ type HybridAppModuleType = {
completeOnboarding: (args: {status: boolean}) => void;
switchAccount: (args: {newDotCurrentAccountEmail: string; authToken: string; policyID: string; accountID: string}) => void;
sendAuthToken: (args: {authToken: string}) => void;
signInToOldDot: (args: {autoGeneratedLogin: string; autoGeneratedPassword: string; authToken: string; email: string; policyID: string}) => void;
signOutFromOldDot: () => void;
clearOldDotAfterSignOut: () => void;
};

export default HybridAppModuleType;
88 changes: 48 additions & 40 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ import {CurrentReportIDContextProvider} from './hooks/useCurrentReportID';
import useDefaultDragAndDrop from './hooks/useDefaultDragAndDrop';
import HybridAppHandler from './HybridAppHandler';
import OnyxUpdateManager from './libs/actions/OnyxUpdateManager';
import './libs/HybridApp';
import {ReportAttachmentsProvider} from './pages/home/report/ReportAttachmentsContext';
import type {Route} from './ROUTES';
import './setup/backgroundTask';
Expand Down Expand Up @@ -81,47 +82,54 @@ function App({url, hybridAppSettings}: AppProps) {
<InitialURLContextProvider url={url}>
<HybridAppHandler hybridAppSettings={hybridAppSettings} />
<GestureHandlerRootView style={fill}>
<ComposeProviders
components={[
OnyxProvider,
ThemeProvider,
ThemeStylesProvider,
ThemeIllustrationsProvider,
SafeAreaProvider,
PortalProvider,
SafeArea,
LocaleContextProvider,
HTMLEngineProvider,
PopoverContextProvider,
CurrentReportIDContextProvider,
ScrollOffsetContextProvider,
ReportAttachmentsProvider,
PickerStateProvider,
EnvironmentProvider,
CustomStatusBarAndBackgroundContextProvider,
ActiveElementRoleProvider,
ActionSheetAwareScrollViewProvider,
PlaybackContextProvider,
FullScreenContextProvider,
VolumeContextProvider,
VideoPopoverMenuContextProvider,
KeyboardProvider,
KeyboardStateProvider,
SearchRouterContextProvider,
ProductTrainingContextProvider,
InputBlurContextProvider,
FullScreenBlockingViewContextProvider,
FullScreenLoaderContextProvider,
]}
<SafeAreaProvider
initialMetrics={{
insets: {top: 0, right: 0, bottom: 0, left: 0},
frame: {x: 0, y: 0, width: 0, height: 0},
}}
>
<CustomStatusBarAndBackground />
<ErrorBoundary errorMessage="NewExpensify crash caught by error boundary">
<ColorSchemeWrapper>
<Expensify />
</ColorSchemeWrapper>
</ErrorBoundary>
<NavigationBar />
</ComposeProviders>
<ComposeProviders
components={[
OnyxProvider,
ThemeProvider,
ThemeStylesProvider,
ThemeIllustrationsProvider,
PortalProvider,
SafeArea,
LocaleContextProvider,
HTMLEngineProvider,
PopoverContextProvider,
CurrentReportIDContextProvider,
ScrollOffsetContextProvider,
ReportAttachmentsProvider,
PickerStateProvider,
EnvironmentProvider,
CustomStatusBarAndBackgroundContextProvider,
ActiveElementRoleProvider,
ActionSheetAwareScrollViewProvider,
PlaybackContextProvider,
FullScreenContextProvider,
VolumeContextProvider,
VideoPopoverMenuContextProvider,
KeyboardProvider,
KeyboardStateProvider,
SearchRouterContextProvider,
ProductTrainingContextProvider,
InputBlurContextProvider,
FullScreenBlockingViewContextProvider,
FullScreenLoaderContextProvider,
]}
>
<CustomStatusBarAndBackground />
<ErrorBoundary errorMessage="NewExpensify crash caught by error boundary">
<HybridAppHandler hybridAppSettings={hybridAppSettings} />
<ColorSchemeWrapper>
<Expensify />
</ColorSchemeWrapper>
</ErrorBoundary>
<NavigationBar />
</ComposeProviders>
</SafeAreaProvider>
</GestureHandlerRootView>
</InitialURLContextProvider>
</SplashScreenStateContextProvider>
Expand Down
5 changes: 5 additions & 0 deletions src/CONFIG.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,12 @@ export default {
GOOGLE_SIGN_IN: {
// cspell:disable-next-line
WEB_CLIENT_ID: '921154746561-gpsoaqgqfuqrfsjdf8l7vohfkfj7b9up.apps.googleusercontent.com',
// cspell:disable-next-line
IOS_CLIENT_ID: '921154746561-s3uqn2oe4m85tufi6mqflbfbuajrm2i3.apps.googleusercontent.com',
// cspell:disable-next-line
HYBRID_APP_WEB_CLIENT_ID: '1008697809946-5e095eqem3o6ugtpc2rjf7v880tcp28p.apps.googleusercontent.com',
// cspell:disable-next-line
HYBRID_APP_IOS_CLIENT_ID: '1008697809946-sh04nqq0hea396s1qdqqbj6ia649odb2.apps.googleusercontent.com',
},
GCP_GEOLOCATION_API_KEY: googleGeolocationAPIKey,
FIREBASE_WEB_CONFIG: {
Expand Down
6 changes: 6 additions & 0 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6952,6 +6952,12 @@ const CONST = {
HIDDEN: `hidden`,
},

HYBRID_APP_SIGN_IN_STATE: {
NOT_STARTED: 'notStarted',
STARTED: 'started',
FINISHED: 'finished',
},

CSV_IMPORT_COLUMNS: {
EMAIL: 'email',
NAME: 'name',
Expand Down
11 changes: 7 additions & 4 deletions src/Expensify.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ function Expensify() {
const [isSidebarLoaded] = useOnyx(ONYXKEYS.IS_SIDEBAR_LOADED, {canBeMissing: true});
const [screenShareRequest] = useOnyx(ONYXKEYS.SCREEN_SHARE_REQUEST, {canBeMissing: true});
const [lastVisitedPath] = useOnyx(ONYXKEYS.LAST_VISITED_PATH, {canBeMissing: true});
const [hybridApp] = useOnyx(ONYXKEYS.HYBRID_APP, {canBeMissing: true});

useDebugShortcut();

Expand All @@ -114,10 +115,12 @@ function Expensify() {
const isAuthenticated = useIsAuthenticated();
const autoAuthState = useMemo(() => session?.autoAuthState ?? '', [session]);

const shouldInit = isNavigationReady && hasAttemptedToOpenPublicRoom && !!preferredLocale;
const isSplashVisible = splashScreenState === CONST.BOOT_SPLASH_STATE.VISIBLE;
const isHybridAppReady = splashScreenState === CONST.BOOT_SPLASH_STATE.READY_TO_BE_HIDDEN && isAuthenticated;
const shouldHideSplash = shouldInit && (CONFIG.IS_HYBRID_APP ? isHybridAppReady : isSplashVisible);
const shouldInit = isNavigationReady && hasAttemptedToOpenPublicRoom && !!preferredLocale && (CONFIG.IS_HYBRID_APP ? !hybridApp?.loggedOutFromOldDot : true);
const shouldHideSplash =
shouldInit &&
(CONFIG.IS_HYBRID_APP
? splashScreenState === CONST.BOOT_SPLASH_STATE.READY_TO_BE_HIDDEN && (isAuthenticated || !!hybridApp?.useNewDotSignInPage)
: splashScreenState === CONST.BOOT_SPLASH_STATE.VISIBLE);

const initializeClient = () => {
if (!Visibility.isVisible()) {
Expand Down
22 changes: 17 additions & 5 deletions src/HybridAppHandler.tsx
Original file line number Diff line number Diff line change
@@ -1,20 +1,32 @@
import {useContext, useState} from 'react';
import {useOnyx} from 'react-native-onyx';
import type {AppProps} from './App';
import CONFIG from './CONFIG';
import CONST from './CONST';
import {signInAfterTransitionFromOldDot} from './libs/actions/Session';
import {parseHybridAppSettings} from './libs/actions/HybridApp';
import {setupNewDotAfterTransitionFromOldDot} from './libs/actions/Session';
import ONYXKEYS from './ONYXKEYS';
import SplashScreenStateContext from './SplashScreenStateContext';
import isLoadingOnyxValue from './types/utils/isLoadingOnyxValue';

function HybridAppHandler({hybridAppSettings}: AppProps) {
const [signInHandled, setSignInHandled] = useState(false);
const {setSplashScreenState} = useContext(SplashScreenStateContext);
const {splashScreenState, setSplashScreenState} = useContext(SplashScreenStateContext);
const [tryNewDot, tryNewDotMetadata] = useOnyx(ONYXKEYS.NVP_TRY_NEW_DOT, {canBeMissing: true});

if (!CONFIG.IS_HYBRID_APP || !hybridAppSettings || signInHandled) {
const isLoading = isLoadingOnyxValue(tryNewDotMetadata);

if (!CONFIG.IS_HYBRID_APP || !hybridAppSettings || signInHandled || isLoading) {
return null;
}

signInAfterTransitionFromOldDot(hybridAppSettings).then(() => {
setSplashScreenState(CONST.BOOT_SPLASH_STATE.READY_TO_BE_HIDDEN);
const parsedHybridAppSettings = parseHybridAppSettings(hybridAppSettings);
setupNewDotAfterTransitionFromOldDot(parsedHybridAppSettings, tryNewDot).then(() => {
if (parsedHybridAppSettings.hybridApp?.loggedOutFromOldDot) {
setSplashScreenState(CONST.BOOT_SPLASH_STATE.HIDDEN);
} else if (splashScreenState === CONST.BOOT_SPLASH_STATE.VISIBLE) {
setSplashScreenState(CONST.BOOT_SPLASH_STATE.READY_TO_BE_HIDDEN);
}
setSignInHandled(true);
});

Expand Down
8 changes: 4 additions & 4 deletions src/ONYXKEYS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -473,9 +473,6 @@ const ONYXKEYS = {
/** Stores recently used currencies */
RECENTLY_USED_CURRENCIES: 'nvp_recentlyUsedCurrencies',

/** States whether we transitioned from OldDot to show only certain group of screens. It should be undefined on pure NewDot. */
IS_SINGLE_NEW_DOT_ENTRY: 'isSingleNewDotEntry',

/** Company cards custom names */
NVP_EXPENSIFY_COMPANY_CARDS_CUSTOM_NAMES: 'nvp_expensify_ccCustomNames',

Expand Down Expand Up @@ -532,6 +529,9 @@ const ONYXKEYS = {
/** Set this gets redirected from global reimbursements flow */
IS_COMING_FROM_GLOBAL_REIMBURSEMENTS_FLOW: 'isComingFromGlobalReimbursementsFlow',

/** Stores HybridApp specific state required to interoperate with OldDot */
HYBRID_APP: 'hybridApp',

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's add an explanation here


/** Stores information for OpenUnreportedExpensesPage API call pagination */
HAS_MORE_UNREPORTED_TRANSACTIONS_RESULTS: 'hasMoreUnreportedTransactionsResults',

Expand Down Expand Up @@ -1165,7 +1165,6 @@ type OnyxValuesMapping = {
[ONYXKEYS.APPROVAL_WORKFLOW]: OnyxTypes.ApprovalWorkflowOnyx;
[ONYXKEYS.IMPORTED_SPREADSHEET]: OnyxTypes.ImportedSpreadsheet;
[ONYXKEYS.LAST_ROUTE]: string;
[ONYXKEYS.IS_SINGLE_NEW_DOT_ENTRY]: boolean | undefined;
[ONYXKEYS.IS_USING_IMPORTED_STATE]: boolean;
[ONYXKEYS.NVP_EXPENSIFY_COMPANY_CARDS_CUSTOM_NAMES]: Record<string, string>;
[ONYXKEYS.CONCIERGE_REPORT_ID]: string;
Expand All @@ -1184,6 +1183,7 @@ type OnyxValuesMapping = {
[ONYXKEYS.SCHEDULE_CALL_DRAFT]: OnyxTypes.ScheduleCallDraft;
[ONYXKEYS.IS_FORCED_TO_CHANGE_CURRENCY]: boolean | undefined;
[ONYXKEYS.IS_COMING_FROM_GLOBAL_REIMBURSEMENTS_FLOW]: boolean | undefined;
[ONYXKEYS.HYBRID_APP]: OnyxTypes.HybridApp;
[ONYXKEYS.HAS_MORE_UNREPORTED_TRANSACTIONS_RESULTS]: boolean | undefined;
[ONYXKEYS.IS_LOADING_UNREPORTED_TRANSACTIONS]: boolean | undefined;
[ONYXKEYS.NVP_LAST_ECASH_IOS_LOGIN]: string;
Expand Down
Loading