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

fix:blank page appears in validate code form page #55588

Open
wants to merge 21 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
6373c37
fix:blank page appears in validate code form page
jacobkim9881 Jan 22, 2025
172c7b0
lint: fixed ! assertion error
jacobkim9881 Jan 22, 2025
c4e944f
pulled original/main
jacobkim9881 Jan 22, 2025
6232476
lint assertion err fixed
jacobkim9881 Jan 23, 2025
d216e60
lint disabled prop spreading
jacobkim9881 Jan 23, 2025
217ac60
Revert "pulled original/main"
jacobkim9881 Jan 23, 2025
622df4f
comment type for ref
jacobkim9881 Jan 23, 2025
9f1f207
should resolve() if container is undefined
jacobkim9881 Jan 23, 2025
5493c6b
comment about focus trap for animation
jacobkim9881 Jan 23, 2025
dd436e9
fix: clicking header back err occurs
jacobkim9881 Jan 23, 2025
a404826
clear error only after closing the modal
jacobkim9881 Jan 24, 2025
6640264
Merge branch 'main' of https://github.com/Expensify/App into m53884
jacobkim9881 Jan 24, 2025
6a12518
lint fixed
jacobkim9881 Jan 24, 2025
3f12bb5
Revert "lint fixed"
jacobkim9881 Jan 24, 2025
433778f
lint fixed
jacobkim9881 Jan 24, 2025
c001758
Merge branch 'main' of https://github.com/Expensify/App into m53884
jacobkim9881 Jan 28, 2025
72e88b7
Merge branch 'main' of https://github.com/Expensify/App into m53884
jacobkim9881 Jan 29, 2025
0afd14a
moved isVisible in the validate code form
jacobkim9881 Jan 30, 2025
9b7b20d
Merge branch 'main' of https://github.com/Expensify/App into m53884
jacobkim9881 Jan 30, 2025
c19c2af
hide menu items while sliding out of validate page
jacobkim9881 Jan 31, 2025
0c12b86
Revert "hide menu items while sliding out of validate page"
jacobkim9881 Jan 31, 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
2 changes: 1 addition & 1 deletion src/components/ValidateCodeActionModal/type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ type ValidateCodeActionModalProps = {
isVisible: boolean;

/** Title of the modal */
title: string;
title?: string;

/** Primary description of the modal */
descriptionPrimary: string;
Expand Down
84 changes: 84 additions & 0 deletions src/components/ValidateCodeActionWithoutModal.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
import React, {forwardRef, useEffect, useRef} from 'react';
import type {ForwardedRef} from 'react';
import {View} from 'react-native';
import {useOnyx} from 'react-native-onyx';
import useThemeStyles from '@hooks/useThemeStyles';
import ONYXKEYS from '@src/ONYXKEYS';
import Text from './Text';
import type {ValidateCodeActionModalProps} from './ValidateCodeActionModal/type';
import ValidateCodeForm from './ValidateCodeActionModal/ValidateCodeForm';
import type {ValidateCodeFormHandle} from './ValidateCodeActionModal/ValidateCodeForm/BaseValidateCodeForm';

type ValidateCodeActionWithoutModalProps = {
/** Ref for validate code form */
forwardedRef: ForwardedRef<ValidateCodeFormHandle>;
};

type ValidateCodeActionProps = ValidateCodeActionModalProps & ValidateCodeActionWithoutModalProps;

function ValidateCodeActionWithoutModal({
Copy link
Contributor

Choose a reason for hiding this comment

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

Do you have any other names for this component? It seems is not a good name.

isVisible,
descriptionPrimary,
descriptionSecondary,
validatePendingAction,
validateError,
handleSubmitForm,
clearError,
sendValidateCode,
hasMagicCodeBeenSent,
isLoading,
forwardedRef,
}: ValidateCodeActionProps) {
const themeStyles = useThemeStyles();
const firstRenderRef = useRef(true);

const [validateCodeAction] = useOnyx(ONYXKEYS.VALIDATE_ACTION_CODE);

useEffect(
() => () => {
firstRenderRef.current = true;
},
[],
);

useEffect(() => {
if (!firstRenderRef.current || !isVisible || hasMagicCodeBeenSent) {
return () => {
clearError();
};
}
firstRenderRef.current = false;
sendValidateCode();
}, [isVisible, sendValidateCode, hasMagicCodeBeenSent, clearError]);
Comment on lines +37 to +52
Copy link
Contributor

Choose a reason for hiding this comment

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

If it's not a modal. Do we need firstRenderRef or isVisible anymore?


if (isVisible) {
return (
<View style={[themeStyles.ph5, themeStyles.mt3, themeStyles.mb5, themeStyles.flex1]}>
<Text style={[themeStyles.mb3]}>{descriptionPrimary}</Text>
{!!descriptionSecondary && <Text style={[themeStyles.mb3]}>{descriptionSecondary}</Text>}
<ValidateCodeForm
isLoading={isLoading}
validateCodeAction={validateCodeAction}
validatePendingAction={validatePendingAction}
validateError={validateError}
handleSubmitForm={handleSubmitForm}
sendValidateCode={sendValidateCode}
clearError={clearError}
buttonStyles={[themeStyles.justifyContentEnd, themeStyles.flex1]}
ref={forwardedRef}
hasMagicCodeBeenSent={hasMagicCodeBeenSent}
/>
</View>
);
}
}

ValidateCodeActionWithoutModal.displayName = 'ValidateCodeActionWithoutModal';

export default forwardRef<ValidateCodeFormHandle, ValidateCodeActionProps>((props, ref) => (
<ValidateCodeActionWithoutModal
// eslint-disable-next-line react/jsx-props-no-spreading
{...props}
forwardedRef={ref}
/>
));
54 changes: 36 additions & 18 deletions src/pages/settings/Profile/Contacts/ContactMethodDetailsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,13 @@ import OfflineWithFeedback from '@components/OfflineWithFeedback';
import ScreenWrapper from '@components/ScreenWrapper';
import ScrollView from '@components/ScrollView';
import Text from '@components/Text';
import ValidateCodeActionModal from '@components/ValidateCodeActionModal';
import ValidateCodeActionWithoutModal from '@components/ValidateCodeActionWithoutModal';
import useBeforeRemove from '@hooks/useBeforeRemove';
import useLocalize from '@hooks/useLocalize';
import usePrevious from '@hooks/usePrevious';
import useTheme from '@hooks/useTheme';
import useThemeStyles from '@hooks/useThemeStyles';
import useWindowDimensions from '@hooks/useWindowDimensions';
import blurActiveElement from '@libs/Accessibility/blurActiveElement';
import {
clearContactMethod,
Expand Down Expand Up @@ -61,6 +62,7 @@ function ContactMethodDetailsPage({route}: ContactMethodDetailsPageProps) {
const {formatPhoneNumber, translate} = useLocalize();
const theme = useTheme();
const themeStyles = useThemeStyles();
const {windowWidth} = useWindowDimensions();

const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false);
const validateCodeFormRef = useRef<ValidateCodeFormHandle>(null);
Expand Down Expand Up @@ -270,12 +272,41 @@ function ContactMethodDetailsPage({route}: ContactMethodDetailsPageProps) {
<ScreenWrapper
onEntryTransitionEnd={() => validateCodeFormRef.current?.focus?.()}
testID={ContactMethodDetailsPage.displayName}
focusTrapSettings={{
focusTrapOptions: {
// It is added because input form's focusing bothers transition animation:
// https://github.com/Expensify/App/issues/53884#issuecomment-2594568960
checkCanFocusTrap: (trapContainers: Array<HTMLElement | SVGElement>) => {
return new Promise((resolve) => {
const interval = setInterval(() => {
const trapContainer = trapContainers.at(0);
if (!trapContainer || (trapContainer && getComputedStyle(trapContainer).visibility !== 'hidden')) {
resolve();
clearInterval(interval);
}
}, 5);
});
},
},
}}
>
<HeaderWithBackButton
title={formattedContactMethod}
onBackButtonPress={() => Navigation.goBack(ROUTES.SETTINGS_CONTACT_METHODS.getRoute(backTo))}
threeDotsMenuItems={getThreeDotsMenuItems()}
shouldShowThreeDotsButton={getThreeDotsMenuItems().length > 0}
shouldOverlayDots
threeDotsAnchorPosition={themeStyles.threeDotsPopoverOffset(windowWidth)}
onThreeDotsButtonPress={() => {
// Hide the keyboard when the user clicks the three-dot menu.
// Use blurActiveElement() for mWeb and KeyboardUtils.dismiss() for native apps.
blurActiveElement();
KeyboardUtils.dismiss();
}}
/>
<ScrollView keyboardShouldPersistTaps="handled">
<ScrollView
keyboardShouldPersistTaps="handled"
contentContainerStyle={themeStyles.flex1}
Copy link
Contributor

Choose a reason for hiding this comment

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

can you elaborate why do we need this style?

>
{isFailedAddContactMethod && (
<ErrorMessageRow
errors={getLatestErrorField(loginData, 'addedLogin')}
Expand All @@ -289,29 +320,16 @@ function ContactMethodDetailsPage({route}: ContactMethodDetailsPageProps) {
/>
)}

<ValidateCodeActionModal
title={formattedContactMethod}
onModalHide={() => {}}
<ValidateCodeActionWithoutModal
hasMagicCodeBeenSent={hasMagicCodeBeenSent}
isVisible={isValidateCodeActionModalVisible && !loginData.validatedDate && !!loginData}
validatePendingAction={loginData.pendingFields?.validateCodeSent}
handleSubmitForm={(validateCode) => validateSecondaryLogin(loginList, contactMethod, validateCode)}
validateError={!isEmptyObject(validateLoginError) ? validateLoginError : getLatestErrorField(loginData, 'validateCodeSent')}
clearError={() => clearContactMethodErrors(contactMethod, !isEmptyObject(validateLoginError) ? 'validateLogin' : 'validateCodeSent')}
onClose={() => {
Navigation.goBack(ROUTES.SETTINGS_CONTACT_METHODS.getRoute(backTo));
setIsValidateCodeActionModalVisible(false);
}}
sendValidateCode={() => requestContactMethodValidateCode(contactMethod)}
descriptionPrimary={translate('contacts.enterMagicCode', {contactMethod: formattedContactMethod})}
onThreeDotsButtonPress={() => {
// Hide the keyboard when the user clicks the three-dot menu.
// Use blurActiveElement() for mWeb and KeyboardUtils.dismiss() for native apps.
blurActiveElement();
KeyboardUtils.dismiss();
}}
threeDotsMenuItems={getThreeDotsMenuItems()}
footer={getDeleteConfirmationModal}
forwardedRef={validateCodeFormRef}
/>

{!isValidateCodeActionModalVisible && getMenuItems()}
Expand Down
Loading