Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed getting two magic codes upon signing in once #30849

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
283cf90
Fixed getting two magic codes upon signing in once
samilabud Oct 26, 2023
172c9af
Fixed prettier after fixed conficts / after merge
samilabud Nov 22, 2023
f0012ab
Added recovery mode feature to code form, fixed bugs: both loading st…
samilabud Nov 23, 2023
b50afa8
Fixed two factor auth bug
samilabud Nov 24, 2023
12421b3
Fixed form text when changing from magic code to recovery code or two…
samilabud Nov 28, 2023
2b5248b
Fixed merge issues
samilabud Dec 26, 2023
2db7bc5
Merge branch 'main' into getting_two_magic_codes_upon_signing_once_30181
samilabud Mar 4, 2024
628467e
Fixed merge conflics and issues
samilabud Mar 4, 2024
e0413db
Fixed lint issue
samilabud Mar 4, 2024
7941b59
Merge branch 'main' into getting_two_magic_codes_upon_signing_once_30181
samilabud Mar 17, 2024
c423527
Removed keyboard validation that dismiss the device keyboard if shown…
samilabud Mar 18, 2024
8859a8d
Merge branch 'main' into getting_two_magic_codes_upon_signing_once_30181
samilabud Mar 18, 2024
7841b30
Merge branch 'main' into getting_two_magic_codes_upon_signing_once_30181
samilabud Apr 1, 2024
05a0e88
Fixed animation image increasing the content height when SAML is enabled
samilabud Apr 2, 2024
9c8b20b
Merge branch 'main' into getting_two_magic_codes_upon_signing_once_30181
samilabud Apr 10, 2024
280d5ef
Merge branch 'main' into getting_two_magic_codes_upon_signing_once_30181
samilabud Apr 11, 2024
f8bbc25
Undo the change to fix animation image increasing the content height …
samilabud Apr 11, 2024
5445370
Fixed lint error
samilabud Apr 12, 2024
892e016
Merge branch 'main' into getting_two_magic_codes_upon_signing_once_30181
samilabud Apr 15, 2024
93cda52
Fixed styles to work withoud fixed height
samilabud Apr 15, 2024
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
101 changes: 34 additions & 67 deletions src/pages/signin/ChooseSSOOrMagicCode.tsx
Original file line number Diff line number Diff line change
@@ -1,100 +1,67 @@
import React, {useEffect} from 'react';
import {Keyboard, View} from 'react-native';
import React from 'react';
import {View} from 'react-native';
import {withOnyx} from 'react-native-onyx';
import type {OnyxEntry} from 'react-native-onyx';
import Button from '@components/Button';
import FormHelpMessage from '@components/FormHelpMessage';
import Text from '@components/Text';
import useKeyboardState from '@hooks/useKeyboardState';
import useLocalize from '@hooks/useLocalize';
import useNetwork from '@hooks/useNetwork';
import useThemeStyles from '@hooks/useThemeStyles';
import useWindowDimensions from '@hooks/useWindowDimensions';
import * as ErrorUtils from '@libs/ErrorUtils';
import Navigation from '@libs/Navigation/Navigation';
import * as Session from '@userActions/Session';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import type {Account, Credentials} from '@src/types/onyx';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
import ChangeExpensifyLoginLink from './ChangeExpensifyLoginLink';
import Terms from './Terms';
import type {Account} from '@src/types/onyx';
import ValidateCodeForm from './ValidateCodeForm';

type ChooseSSOOrMagicCodeOnyxProps = {
/** The credentials of the logged in person */
credentials: OnyxEntry<Credentials>;

/** The details about the account that the user is signing in with */
account: OnyxEntry<Account>;
};

type ChooseSSOOrMagicCodeProps = ChooseSSOOrMagicCodeOnyxProps & {
/** Function that returns whether the user is using SAML or magic codes to log in */
setIsUsingMagicCode: (value: boolean) => void;
/** Determines if user is switched to using recovery code instead of 2fa code */
isUsingRecoveryCode: boolean;

/** Function to change `isUsingRecoveryCode` state when user toggles between 2fa code and recovery code */
setIsUsingRecoveryCode: (value: boolean) => void;
};

function ChooseSSOOrMagicCode({credentials, account, setIsUsingMagicCode}: ChooseSSOOrMagicCodeProps) {
function ChooseSSOOrMagicCode({account, isUsingRecoveryCode, setIsUsingRecoveryCode}: ChooseSSOOrMagicCodeProps) {
const styles = useThemeStyles();
const {isKeyboardShown} = useKeyboardState();
const {translate} = useLocalize();
const {isOffline} = useNetwork();
const {isSmallScreenWidth} = useWindowDimensions();

// This view doesn't have a field for user input, so dismiss the device keyboard if shown
useEffect(() => {
if (!isKeyboardShown) {
return;
}
Keyboard.dismiss();
}, [isKeyboardShown]);
const loginTextAfterMagicCode = isUsingRecoveryCode ? translate('validateCodeForm.enterRecoveryCode') : translate('validateCodeForm.enterAuthenticatorCode');
const loginText = account?.requiresTwoFactorAuth ? loginTextAfterMagicCode : translate('samlSignIn.orContinueWithMagicCode');

return (
<>
<View>
<Text style={[styles.loginHeroBody, styles.mb5, styles.textNormal, !isSmallScreenWidth ? styles.textAlignLeft : {}]}>{translate('samlSignIn.welcomeSAMLEnabled')}</Text>
<Button
isDisabled={isOffline}
success
large
style={[styles.mv3]}
text={translate('samlSignIn.useSingleSignOn')}
isLoading={account?.isLoading}
onPress={() => {
Navigation.navigate(ROUTES.SAML_SIGN_IN);
}}
/>
<View>
<Text style={[styles.loginHeroBody, styles.mb5, styles.textNormal, !isSmallScreenWidth ? styles.textAlignLeft : {}]}>{translate('samlSignIn.welcomeSAMLEnabled')}</Text>
<Button
isDisabled={isOffline}
success
large
style={[styles.mv3]}
text={translate('samlSignIn.useSingleSignOn')}
onPress={() => {
Navigation.navigate(ROUTES.SAML_SIGN_IN);
}}
/>

<View style={[styles.mt5]}>
<Text style={[styles.loginHeroBody, styles.mb5, styles.textNormal, !isSmallScreenWidth ? styles.textAlignLeft : {}]}>
{translate('samlSignIn.orContinueWithMagicCode')}
</Text>
</View>

<Button
isDisabled={isOffline}
style={[styles.mv3]}
large
text={translate('samlSignIn.useMagicCode')}
isLoading={account?.isLoading && account?.loadingForm === (account?.requiresTwoFactorAuth ? CONST.FORMS.VALIDATE_TFA_CODE_FORM : CONST.FORMS.VALIDATE_CODE_FORM)}
onPress={() => {
Session.resendValidateCode(credentials?.login);
setIsUsingMagicCode(true);
}}
/>
{!!account && !isEmptyObject(account.errors) && <FormHelpMessage message={ErrorUtils.getLatestErrorMessage(account)} />}
<ChangeExpensifyLoginLink onPress={() => Session.clearSignInData()} />
</View>
<View style={[styles.mt5, styles.signInPageWelcomeTextContainer]}>
<Terms />
<View style={[styles.mt5]}>
<Text style={[styles.loginHeroBody, styles.mb5, styles.textNormal, !isSmallScreenWidth ? styles.textAlignLeft : {}]}>{loginText}</Text>
</View>
</>

<ValidateCodeForm
isVisible
isUsingRecoveryCode={isUsingRecoveryCode}
setIsUsingRecoveryCode={setIsUsingRecoveryCode}
/>
</View>
);
}

ChooseSSOOrMagicCode.displayName = 'ChooseSSOOrMagicCode';

export default withOnyx<ChooseSSOOrMagicCodeProps, ChooseSSOOrMagicCodeOnyxProps>({
credentials: {key: ONYXKEYS.CREDENTIALS},
account: {key: ONYXKEYS.ACCOUNT},
})(ChooseSSOOrMagicCode);
export default withOnyx<ChooseSSOOrMagicCodeProps, ChooseSSOOrMagicCodeOnyxProps>({account: {key: ONYXKEYS.ACCOUNT}})(ChooseSSOOrMagicCode);
7 changes: 6 additions & 1 deletion src/pages/signin/SignInPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,12 @@ function SignInPageInner({credentials, account, activeClients = [], preferredLoc
{!shouldShowAnotherLoginPageOpenedMessage && (
<>
{shouldShowUnlinkLoginForm && <UnlinkLoginForm />}
{shouldShowChooseSSOOrMagicCode && <ChooseSSOOrMagicCode setIsUsingMagicCode={setIsUsingMagicCode} />}
{shouldShowChooseSSOOrMagicCode && (
<ChooseSSOOrMagicCode
isUsingRecoveryCode={isUsingRecoveryCode}
setIsUsingRecoveryCode={setIsUsingRecoveryCode}
/>
)}
{shouldShowEmailDeliveryFailurePage && <EmailDeliveryFailurePage />}
</>
)}
Expand Down
4 changes: 2 additions & 2 deletions src/pages/signin/SignInPageLayout/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,8 @@ function SignInPageLayout(
keyboardShouldPersistTaps="handled"
ref={scrollViewRef}
>
<View style={[styles.flex1, styles.flexColumn, styles.overflowHidden, StyleUtils.getMinimumHeight(backgroundImageHeight), StyleUtils.getSignInBgStyles(theme)]}>
<View style={[styles.pAbsolute, styles.w100, StyleUtils.getHeight(backgroundImageHeight), StyleUtils.getBackgroundColorStyle(theme.highlightBG)]}>
<View style={[styles.dBlock, styles.flexColumn, styles.overflowHidden, StyleUtils.getSignInBgStyles(theme)]}>
<View style={[styles.dBlock, styles.pAbsolute, styles.w100, StyleUtils.getHeight(backgroundImageHeight), StyleUtils.getBackgroundColorStyle(theme.highlightBG)]}>
<BackgroundImage
isSmallScreen
pointerEvents="none"
Expand Down
Loading