From 0b007889e40c01d0f5d8d0cd551a845ab9cf1739 Mon Sep 17 00:00:00 2001 From: Alex Beaman Date: Wed, 28 Jun 2023 13:49:36 +0300 Subject: [PATCH 01/69] Update util function to use new reportAction prop --- src/libs/actions/Task.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/libs/actions/Task.js b/src/libs/actions/Task.js index 5e27d7db764d..fce7a800c32a 100644 --- a/src/libs/actions/Task.js +++ b/src/libs/actions/Task.js @@ -647,8 +647,7 @@ function getTaskAssigneeAccountID(taskReport) { } const reportAction = ReportActionsUtils.getParentReportAction(taskReport); - const childManagerEmail = lodashGet(reportAction, 'childManagerEmail', ''); - return PersonalDetailsUtils.getAccountIDsByLogins([childManagerEmail])[0]; + return lodashGet(reportAction, 'childManagerAccountID'); } /** From 36d25362962182d63046932f9448a95395f9dd83 Mon Sep 17 00:00:00 2001 From: Alex Beaman Date: Wed, 28 Jun 2023 13:50:09 +0300 Subject: [PATCH 02/69] Get assignee login from assignee accountID --- src/components/ReportActionItem/TaskPreview.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/components/ReportActionItem/TaskPreview.js b/src/components/ReportActionItem/TaskPreview.js index 576de1991b9c..c50afaf7c134 100644 --- a/src/components/ReportActionItem/TaskPreview.js +++ b/src/components/ReportActionItem/TaskPreview.js @@ -2,6 +2,7 @@ import React from 'react'; import {View} from 'react-native'; import PropTypes from 'prop-types'; import {withOnyx} from 'react-native-onyx'; +import lodashGet from 'lodash/get'; import compose from '../../libs/compose'; import styles from '../../styles/styles'; import ONYXKEYS from '../../ONYXKEYS'; @@ -18,8 +19,12 @@ import reportActionPropTypes from '../../pages/home/report/reportActionPropTypes import * as TaskUtils from '../../libs/actions/Task'; import RenderHTML from '../RenderHTML'; import PressableWithoutFeedback from '../Pressable/PressableWithoutFeedback'; +import personalDetailsPropType from '../../pages/personalDetailsPropType'; const propTypes = { + /** All personal details asssociated with user */ + allPersonalDetails: personalDetailsPropType, + /** The ID of the associated taskReport */ taskReportID: PropTypes.string.isRequired, @@ -58,7 +63,8 @@ function TaskPreview(props) { ? props.taskReport.stateNum === CONST.REPORT.STATE_NUM.SUBMITTED && props.taskReport.statusNum === CONST.REPORT.STATUS.APPROVED : props.action.childStateNum === CONST.REPORT.STATE_NUM.SUBMITTED && props.action.childStatusNum === CONST.REPORT.STATUS.APPROVED; const taskTitle = props.taskReport.reportName || props.action.childReportName; - const taskAssignee = props.taskReport.managerEmail || props.action.childManagerEmail; + const taskAssigneeAccountID = TaskUtils.getTaskAssigneeAccountID(props.taskReport); + const taskAssignee = lodashGet(allPersonalDetails, [taskAssigneeAccountID, 'login'], ''); const htmlForTaskPreview = taskAssignee ? `@${taskAssignee} ${taskTitle}` : `${taskTitle}`; return ( @@ -102,5 +108,8 @@ export default compose( taskReport: { key: ({taskReportID}) => `${ONYXKEYS.COLLECTION.REPORT}${taskReportID}`, }, + allPersonalDetails: { + key: ONYXKEYS.PERSONAL_DETAILS_LIST, + }, }), )(TaskPreview); From a7381f41d731e569b2501f02874dad6d79ecd48b Mon Sep 17 00:00:00 2001 From: Alex Beaman Date: Wed, 28 Jun 2023 13:50:28 +0300 Subject: [PATCH 03/69] Refactor prop types --- src/pages/workspace/WorkspaceMembersPage.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/pages/workspace/WorkspaceMembersPage.js b/src/pages/workspace/WorkspaceMembersPage.js index 5b56a801db1c..8f05780e896b 100644 --- a/src/pages/workspace/WorkspaceMembersPage.js +++ b/src/pages/workspace/WorkspaceMembersPage.js @@ -32,7 +32,7 @@ import * as UserUtils from '../../libs/UserUtils'; import FormHelpMessage from '../../components/FormHelpMessage'; import TextInput from '../../components/TextInput'; import KeyboardDismissingFlatList from '../../components/KeyboardDismissingFlatList'; -import withCurrentUserPersonalDetails from '../../components/withCurrentUserPersonalDetails'; +import withCurrentUserPersonalDetails, {withCurrentUserPersonalDetailsPropTypes, withCurrentUserPersonalDetailsDefaultProps} from '../../components/withCurrentUserPersonalDetails'; import * as PolicyUtils from '../../libs/PolicyUtils'; import PressableWithFeedback from '../../components/Pressable/PressableWithFeedback'; import usePrevious from '../../hooks/usePrevious'; @@ -40,7 +40,7 @@ import Log from '../../libs/Log'; import * as PersonalDetailsUtils from '../../libs/PersonalDetailsUtils'; const propTypes = { - /** The personal details of the person who is logged in */ + /** All personal details asssociated with user */ personalDetails: personalDetailsPropType, /** URL Route params */ @@ -61,6 +61,7 @@ const propTypes = { ...policyPropTypes, ...withLocalizePropTypes, ...windowDimensionsPropTypes, + ...withCurrentUserPersonalDetailsPropTypes, network: networkPropTypes.isRequired, }; @@ -70,6 +71,7 @@ const defaultProps = { accountID: 0, }, ...policyDefaultProps, + ...withCurrentUserPersonalDetailsDefaultProps, }; function WorkspaceMembersPage(props) { From d9a4620f36856a954eb1f79c876c9d3d11e8aa8f Mon Sep 17 00:00:00 2001 From: Eric Han Date: Thu, 29 Jun 2023 17:11:45 +0800 Subject: [PATCH 04/69] fix icon not set when adding bookmark to iOS home screen --- config/webpack/webpack.common.js | 1 + web/apple-touch-icon.png | Bin 0 -> 3842 bytes web/index.html | 1 + 3 files changed, 2 insertions(+) create mode 100644 web/apple-touch-icon.png diff --git a/config/webpack/webpack.common.js b/config/webpack/webpack.common.js index 28bdc48a9ed4..18d730db26a7 100644 --- a/config/webpack/webpack.common.js +++ b/config/webpack/webpack.common.js @@ -82,6 +82,7 @@ const webpackConfig = ({envFile = '.env', platform = 'web'}) => ({ {from: 'web/favicon.png'}, {from: 'web/favicon-unread.png'}, {from: 'web/og-preview-image.png'}, + {from: 'web/apple-touch-icon.png'}, {from: 'assets/css', to: 'css'}, {from: 'assets/fonts/web', to: 'fonts'}, {from: 'node_modules/react-pdf/dist/esm/Page/AnnotationLayer.css', to: 'css/AnnotationLayer.css'}, diff --git a/web/apple-touch-icon.png b/web/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..625b519e2cfade153c4512a6ad159b4c8cfebe58 GIT binary patch literal 3842 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 literal 0 HcmV?d00001 diff --git a/web/index.html b/web/index.html index 90011c87e7a9..d207fa54b97a 100644 --- a/web/index.html +++ b/web/index.html @@ -120,6 +120,7 @@ } + <% if (htmlWebpackPlugin.options.usePolyfillIO) { %> From 778891a8bbd118ca472e90d777f7df9a3ceaa4b1 Mon Sep 17 00:00:00 2001 From: Alex Beaman Date: Thu, 29 Jun 2023 13:14:46 +0300 Subject: [PATCH 05/69] A bit of lint cleanup --- src/components/ReportActionItem/TaskPreview.js | 2 +- src/libs/actions/Task.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/ReportActionItem/TaskPreview.js b/src/components/ReportActionItem/TaskPreview.js index c50afaf7c134..f91f6d5f1536 100644 --- a/src/components/ReportActionItem/TaskPreview.js +++ b/src/components/ReportActionItem/TaskPreview.js @@ -64,7 +64,7 @@ function TaskPreview(props) { : props.action.childStateNum === CONST.REPORT.STATE_NUM.SUBMITTED && props.action.childStatusNum === CONST.REPORT.STATUS.APPROVED; const taskTitle = props.taskReport.reportName || props.action.childReportName; const taskAssigneeAccountID = TaskUtils.getTaskAssigneeAccountID(props.taskReport); - const taskAssignee = lodashGet(allPersonalDetails, [taskAssigneeAccountID, 'login'], ''); + const taskAssignee = lodashGet(props.allPersonalDetails, [taskAssigneeAccountID, 'login'], ''); const htmlForTaskPreview = taskAssignee ? `@${taskAssignee} ${taskTitle}` : `${taskTitle}`; return ( diff --git a/src/libs/actions/Task.js b/src/libs/actions/Task.js index fce7a800c32a..4754cde1a2c1 100644 --- a/src/libs/actions/Task.js +++ b/src/libs/actions/Task.js @@ -10,7 +10,6 @@ import ROUTES from '../../ROUTES'; import CONST from '../../CONST'; import DateUtils from '../DateUtils'; import * as UserUtils from '../UserUtils'; -import * as PersonalDetailsUtils from '../PersonalDetailsUtils'; import * as ReportActionsUtils from '../ReportActionsUtils'; /** From c8f63aa1bfd3a4f42ec713972857fd8b405bacb6 Mon Sep 17 00:00:00 2001 From: Alex Beaman Date: Thu, 29 Jun 2023 13:53:34 +0300 Subject: [PATCH 06/69] Rename prop & add default --- src/components/ReportActionItem/TaskPreview.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/ReportActionItem/TaskPreview.js b/src/components/ReportActionItem/TaskPreview.js index f91f6d5f1536..99ef4c276468 100644 --- a/src/components/ReportActionItem/TaskPreview.js +++ b/src/components/ReportActionItem/TaskPreview.js @@ -23,7 +23,7 @@ import personalDetailsPropType from '../../pages/personalDetailsPropType'; const propTypes = { /** All personal details asssociated with user */ - allPersonalDetails: personalDetailsPropType, + personalDetailsList: personalDetailsPropType, /** The ID of the associated taskReport */ taskReportID: PropTypes.string.isRequired, @@ -51,6 +51,7 @@ const propTypes = { }; const defaultProps = { + personalDetailsList: {}, taskReport: {}, isHovered: false, }; @@ -64,7 +65,7 @@ function TaskPreview(props) { : props.action.childStateNum === CONST.REPORT.STATE_NUM.SUBMITTED && props.action.childStatusNum === CONST.REPORT.STATUS.APPROVED; const taskTitle = props.taskReport.reportName || props.action.childReportName; const taskAssigneeAccountID = TaskUtils.getTaskAssigneeAccountID(props.taskReport); - const taskAssignee = lodashGet(props.allPersonalDetails, [taskAssigneeAccountID, 'login'], ''); + const taskAssignee = lodashGet(props.personalDetailsList, [taskAssigneeAccountID, 'login'], ''); const htmlForTaskPreview = taskAssignee ? `@${taskAssignee} ${taskTitle}` : `${taskTitle}`; return ( @@ -108,7 +109,7 @@ export default compose( taskReport: { key: ({taskReportID}) => `${ONYXKEYS.COLLECTION.REPORT}${taskReportID}`, }, - allPersonalDetails: { + personalDetailsList: { key: ONYXKEYS.PERSONAL_DETAILS_LIST, }, }), From c273a110b94f264761fa4cf8ffe0e7698e580b2f Mon Sep 17 00:00:00 2001 From: Bernhard Owen Josephus Date: Fri, 30 Jun 2023 18:43:57 +0800 Subject: [PATCH 07/69] move chat message style to outer view --- .../ReportActionItem/TaskPreview.js | 56 ++++++++++--------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/src/components/ReportActionItem/TaskPreview.js b/src/components/ReportActionItem/TaskPreview.js index 4f29f6d39984..f3c358b7958a 100644 --- a/src/components/ReportActionItem/TaskPreview.js +++ b/src/components/ReportActionItem/TaskPreview.js @@ -62,34 +62,36 @@ function TaskPreview(props) { const htmlForTaskPreview = taskAssignee ? `@${taskAssignee} ${taskTitle}` : `${taskTitle}`; return ( - Navigation.navigate(ROUTES.getReportRoute(props.taskReportID))} - style={[styles.flexRow, styles.justifyContentBetween, styles.chatItemMessage]} - accessibilityRole="button" - accessibilityLabel={props.translate('newTaskPage.task')} - > - - { - if (isTaskCompleted) { - TaskUtils.reopenTask(props.taskReportID, taskTitle); - } else { - TaskUtils.completeTask(props.taskReportID, taskTitle); - } - }} - accessibilityLabel={props.translate('newTaskPage.task')} + + Navigation.navigate(ROUTES.getReportRoute(props.taskReportID))} + style={[styles.flexRow, styles.justifyContentBetween]} + accessibilityRole="button" + accessibilityLabel={props.translate('newTaskPage.task')} + > + + { + if (isTaskCompleted) { + TaskUtils.reopenTask(props.taskReportID, taskTitle); + } else { + TaskUtils.completeTask(props.taskReportID, taskTitle); + } + }} + accessibilityLabel={props.translate('newTaskPage.task')} + /> + + + - - - - + + ); } From 2adcdcb2c5c8751dc55cd3e34a8246a93b377fb6 Mon Sep 17 00:00:00 2001 From: VH Date: Mon, 3 Jul 2023 18:26:43 +0700 Subject: [PATCH 08/69] Get first error object to show in validate code form --- src/libs/ErrorUtils.js | 23 ++++++++++++++++++- .../ValidateCodeForm/BaseValidateCodeForm.js | 2 +- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/libs/ErrorUtils.js b/src/libs/ErrorUtils.js index fdeae7809f58..d358105477a2 100644 --- a/src/libs/ErrorUtils.js +++ b/src/libs/ErrorUtils.js @@ -88,6 +88,27 @@ function getLatestErrorField(onyxData, fieldName) { .value(); } +/** + * Get the first error in the errorFields ordering by its key + * + * @param {Object} onyxData + * @param {String} fieldName + * @returns {Object} + */ +function getFirstErrorField(onyxData, fieldName) { + const errorsForField = lodashGet(onyxData, ['errorFields', fieldName], {}); + + if (_.isEmpty(errorsForField)) { + return {}; + } + return _.chain(errorsForField) + .keys() + .sortBy() + .map((key) => ({[key]: errorsForField[key]})) + .first() + .value(); +} + /** * Method used to generate error message for given inputID * @param {Object} errors - An object containing current errors in the form @@ -112,4 +133,4 @@ function addErrorMessage(errors, inputID, message) { } } -export {getAuthenticateErrorMessage, getMicroSecondOnyxError, getLatestErrorMessage, getLatestErrorField, addErrorMessage}; +export {getAuthenticateErrorMessage, getMicroSecondOnyxError, getLatestErrorMessage, getLatestErrorField, getFirstErrorField, addErrorMessage}; diff --git a/src/pages/settings/Profile/Contacts/ValidateCodeForm/BaseValidateCodeForm.js b/src/pages/settings/Profile/Contacts/ValidateCodeForm/BaseValidateCodeForm.js index 5b1aa87cea80..57a195b53db8 100644 --- a/src/pages/settings/Profile/Contacts/ValidateCodeForm/BaseValidateCodeForm.js +++ b/src/pages/settings/Profile/Contacts/ValidateCodeForm/BaseValidateCodeForm.js @@ -165,7 +165,7 @@ function BaseValidateCodeForm(props) { User.clearContactMethodErrors(props.contactMethod, 'validateLogin')} > From 1a376a129efd3288270128193c0848560c66bd3a Mon Sep 17 00:00:00 2001 From: ginsuma <13113013+ginsuma@users.noreply.github.com> Date: Mon, 3 Jul 2023 20:49:46 +0700 Subject: [PATCH 09/69] Update Who Paid section when can modify participants --- src/components/MoneyRequestConfirmationList.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/MoneyRequestConfirmationList.js b/src/components/MoneyRequestConfirmationList.js index 7b4f31e57d25..30b39f357dbf 100755 --- a/src/components/MoneyRequestConfirmationList.js +++ b/src/components/MoneyRequestConfirmationList.js @@ -132,6 +132,7 @@ function MoneyRequestConfirmationList(props) { const selectedParticipants = useMemo(() => _.filter(props.participants, (participant) => participant.selected), [props.participants]); const payeePersonalDetails = useMemo(() => props.payeePersonalDetails || props.currentUserPersonalDetails, [props.payeePersonalDetails, props.currentUserPersonalDetails]); + const canModifyParticipants = !props.isReadOnly && props.canModifyParticipants && props.hasMultipleParticipants; const optionSelectorSections = useMemo(() => { const sections = []; @@ -152,6 +153,7 @@ function MoneyRequestConfirmationList(props) { data: [formattedPayeeOption], shouldShow: true, indexOffset: 0, + isDisabled: canModifyParticipants, }, { title: translate('moneyRequestConfirmationList.whoWasThere'), @@ -228,7 +230,6 @@ function MoneyRequestConfirmationList(props) { [selectedParticipants, onSendMoney, onConfirm, props.iouType], ); - const canModifyParticipants = !props.isReadOnly && props.canModifyParticipants && props.hasMultipleParticipants; const formattedAmount = CurrencyUtils.convertToDisplayString(props.iouAmount, props.iouCurrencyCode); const footerContent = useMemo(() => { From b159a1d957c5a3cdb6a43551e622632f378b4f54 Mon Sep 17 00:00:00 2001 From: ginsuma <13113013+ginsuma@users.noreply.github.com> Date: Tue, 4 Jul 2023 03:04:19 +0700 Subject: [PATCH 10/69] Fix lint --- src/components/MoneyRequestConfirmationList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/MoneyRequestConfirmationList.js b/src/components/MoneyRequestConfirmationList.js index 30b39f357dbf..150a9ed9429b 100755 --- a/src/components/MoneyRequestConfirmationList.js +++ b/src/components/MoneyRequestConfirmationList.js @@ -171,7 +171,7 @@ function MoneyRequestConfirmationList(props) { }); } return sections; - }, [selectedParticipants, getParticipantsWithAmount, props.hasMultipleParticipants, props.iouAmount, props.iouCurrencyCode, props.participants, translate, payeePersonalDetails]); + }, [props.participants, props.hasMultipleParticipants, props.iouAmount, props.iouCurrencyCode, getParticipantsWithAmount, selectedParticipants, payeePersonalDetails, translate, canModifyParticipants]); const selectedOptions = useMemo(() => { if (!props.hasMultipleParticipants) { From 62253ce3ce273d73fb3dbf9e997fa2c60e4bf576 Mon Sep 17 00:00:00 2001 From: ginsuma <13113013+ginsuma@users.noreply.github.com> Date: Tue, 4 Jul 2023 04:02:24 +0700 Subject: [PATCH 11/69] Add shouldDisableWhoPaidSection --- src/components/MoneyRequestConfirmationList.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/components/MoneyRequestConfirmationList.js b/src/components/MoneyRequestConfirmationList.js index 150a9ed9429b..c671a91404f6 100755 --- a/src/components/MoneyRequestConfirmationList.js +++ b/src/components/MoneyRequestConfirmationList.js @@ -133,7 +133,8 @@ function MoneyRequestConfirmationList(props) { const selectedParticipants = useMemo(() => _.filter(props.participants, (participant) => participant.selected), [props.participants]); const payeePersonalDetails = useMemo(() => props.payeePersonalDetails || props.currentUserPersonalDetails, [props.payeePersonalDetails, props.currentUserPersonalDetails]); const canModifyParticipants = !props.isReadOnly && props.canModifyParticipants && props.hasMultipleParticipants; - + const shouldDisableWhoPaidSection = canModifyParticipants; + const optionSelectorSections = useMemo(() => { const sections = []; const unselectedParticipants = _.filter(props.participants, (participant) => !participant.selected); @@ -153,7 +154,7 @@ function MoneyRequestConfirmationList(props) { data: [formattedPayeeOption], shouldShow: true, indexOffset: 0, - isDisabled: canModifyParticipants, + isDisabled: shouldDisableWhoPaidSection, }, { title: translate('moneyRequestConfirmationList.whoWasThere'), @@ -171,7 +172,7 @@ function MoneyRequestConfirmationList(props) { }); } return sections; - }, [props.participants, props.hasMultipleParticipants, props.iouAmount, props.iouCurrencyCode, getParticipantsWithAmount, selectedParticipants, payeePersonalDetails, translate, canModifyParticipants]); + }, [props.participants, props.hasMultipleParticipants, props.iouAmount, props.iouCurrencyCode, getParticipantsWithAmount, selectedParticipants, payeePersonalDetails, translate, shouldDisableWhoPaidSection]); const selectedOptions = useMemo(() => { if (!props.hasMultipleParticipants) { From 78f418f408bff5bb3a6a54dd62325bd522291709 Mon Sep 17 00:00:00 2001 From: Daniel Gale-Rosen Date: Mon, 3 Jul 2023 17:06:29 -0400 Subject: [PATCH 12/69] clean up conditionals --- src/pages/home/report/ReportActionItem.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index 2afd28f934fe..d34862a93adf 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -151,12 +151,11 @@ function ReportActionItem(props) { const decisions = lodashGet(props, ['action', 'message', 0, 'moderationDecisions'], []); const latestDecision = lodashGet(_.last(decisions), 'decision', ''); useEffect(() => { - if (!props.action.actionName === CONST.REPORT.ACTIONS.TYPE.ADDCOMMENT || _.isEmpty(latestDecision)) { + if (props.action.actionName !== CONST.REPORT.ACTIONS.TYPE.ADDCOMMENT || _.isEmpty(latestDecision)) { return; } - if (latestDecision === CONST.MODERATION.MODERATOR_DECISION_PENDING_HIDE || latestDecision === CONST.MODERATION.MODERATOR_DECISION_HIDDEN) { - setIsHidden(true); + if (_.contains([CONST.MODERATION.MODERATOR_DECISION_PENDING_HIDE, CONST.MODERATION.MODERATOR_DECISION_HIDDEN], latestDecision)) { setIsHidden(true); } setModerationDecision(latestDecision); }, [latestDecision, props.action.actionName]); From eb4e3220189ea12aa6dcbd13a536884bff126784 Mon Sep 17 00:00:00 2001 From: Daniel Gale-Rosen Date: Mon, 3 Jul 2023 17:27:03 -0400 Subject: [PATCH 13/69] prettier --- src/pages/home/report/ReportActionItem.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/pages/home/report/ReportActionItem.js b/src/pages/home/report/ReportActionItem.js index d34862a93adf..72d411fb9d2b 100644 --- a/src/pages/home/report/ReportActionItem.js +++ b/src/pages/home/report/ReportActionItem.js @@ -155,7 +155,8 @@ function ReportActionItem(props) { return; } - if (_.contains([CONST.MODERATION.MODERATOR_DECISION_PENDING_HIDE, CONST.MODERATION.MODERATOR_DECISION_HIDDEN], latestDecision)) { setIsHidden(true); + if (_.contains([CONST.MODERATION.MODERATOR_DECISION_PENDING_HIDE, CONST.MODERATION.MODERATOR_DECISION_HIDDEN], latestDecision)) { + setIsHidden(true); } setModerationDecision(latestDecision); }, [latestDecision, props.action.actionName]); From cc4ce9b4456249d74ba746ce4f26d8b6c63cce23 Mon Sep 17 00:00:00 2001 From: tienifr Date: Tue, 4 Jul 2023 10:30:26 +0700 Subject: [PATCH 14/69] fix: 20848 enable 2fa button in verify page --- .../BaseTwoFactorAuthForm.js | 21 +++++++++++++++-- .../TwoFactorAuthForm/index.android.js | 23 +++++++++++++++++-- .../TwoFactorAuth/TwoFactorAuthForm/index.js | 23 +++++++++++++++++-- .../Security/TwoFactorAuth/VerifyPage.js | 8 +++++-- 4 files changed, 67 insertions(+), 8 deletions(-) diff --git a/src/pages/settings/Security/TwoFactorAuth/TwoFactorAuthForm/BaseTwoFactorAuthForm.js b/src/pages/settings/Security/TwoFactorAuth/TwoFactorAuthForm/BaseTwoFactorAuthForm.js index ca78219178ef..3b9395661c6d 100644 --- a/src/pages/settings/Security/TwoFactorAuth/TwoFactorAuthForm/BaseTwoFactorAuthForm.js +++ b/src/pages/settings/Security/TwoFactorAuth/TwoFactorAuthForm/BaseTwoFactorAuthForm.js @@ -1,4 +1,4 @@ -import React, {useCallback, useState} from 'react'; +import React, {useCallback, useState, forwardRef, useImperativeHandle} from 'react'; import PropTypes from 'prop-types'; import {withOnyx} from 'react-native-onyx'; import MagicCodeInput from '../../../../../components/MagicCodeInput'; @@ -31,6 +31,7 @@ const defaultProps = { function BaseTwoFactorAuthForm(props) { const [formError, setFormError] = useState({}); const [twoFactorAuthCode, setTwoFactorAuthCode] = useState(''); + const inputRef = React.useRef(null); /** * Handle text input and clear formError upon text change @@ -53,6 +54,7 @@ function BaseTwoFactorAuthForm(props) { * Check that all the form fields are valid, then trigger the submit callback */ const validateAndSubmitForm = useCallback(() => { + inputRef.current.blur(); if (!twoFactorAuthCode.trim()) { setFormError({twoFactorAuthCode: 'twoFactorAuthForm.error.pleaseFillTwoFactorAuth'}); return; @@ -67,6 +69,12 @@ function BaseTwoFactorAuthForm(props) { Session.validateTwoFactorAuth(twoFactorAuthCode); }, [twoFactorAuthCode]); + useImperativeHandle(props.innerRef, () => ({ + validateAndSubmitForm() { + validateAndSubmitForm(); + }, + })); + return ( ); } @@ -90,4 +99,12 @@ export default compose( withOnyx({ account: {key: ONYXKEYS.ACCOUNT}, }), -)(BaseTwoFactorAuthForm); +)( + forwardRef((props, ref) => ( + + )), +); diff --git a/src/pages/settings/Security/TwoFactorAuth/TwoFactorAuthForm/index.android.js b/src/pages/settings/Security/TwoFactorAuth/TwoFactorAuthForm/index.android.js index ea0d5e257e2f..ba7bb2186aa6 100644 --- a/src/pages/settings/Security/TwoFactorAuth/TwoFactorAuthForm/index.android.js +++ b/src/pages/settings/Security/TwoFactorAuth/TwoFactorAuthForm/index.android.js @@ -1,10 +1,29 @@ import React from 'react'; +import PropTypes from 'prop-types'; import BaseTwoFactorAuthForm from './BaseTwoFactorAuthForm'; -function TwoFactorAuthForm() { - return ; +const propTypes = { + /** + * A ref to forward to the Pressable + */ + innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]), +}; + +const defaultProps = { + innerRef: () => {}, +}; + +function TwoFactorAuthForm(props) { + return ( + + ); } +TwoFactorAuthForm.propTypes = propTypes; +TwoFactorAuthForm.defaultProps = defaultProps; TwoFactorAuthForm.displayName = 'TwoFactorAuthForm'; export default TwoFactorAuthForm; diff --git a/src/pages/settings/Security/TwoFactorAuth/TwoFactorAuthForm/index.js b/src/pages/settings/Security/TwoFactorAuth/TwoFactorAuthForm/index.js index c52e65facd6d..171322ecb32d 100644 --- a/src/pages/settings/Security/TwoFactorAuth/TwoFactorAuthForm/index.js +++ b/src/pages/settings/Security/TwoFactorAuth/TwoFactorAuthForm/index.js @@ -1,10 +1,29 @@ import React from 'react'; +import PropTypes from 'prop-types'; import BaseTwoFactorAuthForm from './BaseTwoFactorAuthForm'; -function TwoFactorAuthForm() { - return ; +const propTypes = { + /** + * A ref to forward to the Pressable + */ + innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.object]), +}; + +const defaultProps = { + innerRef: () => {}, +}; + +function TwoFactorAuthForm(props) { + return ( + + ); } +TwoFactorAuthForm.propTypes = propTypes; +TwoFactorAuthForm.defaultProps = defaultProps; TwoFactorAuthForm.displayName = 'TwoFactorAuthForm'; export default TwoFactorAuthForm; diff --git a/src/pages/settings/Security/TwoFactorAuth/VerifyPage.js b/src/pages/settings/Security/TwoFactorAuth/VerifyPage.js index 90765b45caa2..d487d7cc027f 100644 --- a/src/pages/settings/Security/TwoFactorAuth/VerifyPage.js +++ b/src/pages/settings/Security/TwoFactorAuth/VerifyPage.js @@ -55,6 +55,8 @@ const defaultProps = { }; function VerifyPage(props) { + const formRef = React.useRef(null); + useEffect(() => { Session.clearAccountMessages(); }, []); @@ -139,15 +141,17 @@ function VerifyPage(props) { {props.translate('twoFactorAuth.enterCode')} - +