From eafffb7e431494fea48fbf606e853aec00fc634c Mon Sep 17 00:00:00 2001 From: Francois Laithier Date: Tue, 13 Sep 2022 16:23:59 -0700 Subject: [PATCH] Merge pull request #10979 from Expensify/revert-10873-arosiclair-update-with-policy Revert "Refactor withFullPolicy" (cherry picked from commit 55827a739e7c8b48ee2521846a6c85d7e62f8ba0) --- src/components/AvatarWithIndicator.js | 4 +- src/components/RoomNameInput.js | 4 ++ src/pages/ReportSettingsPage.js | 15 +++++ .../workspace/WorkspaceBankAccountPage.js | 4 +- src/pages/workspace/WorkspaceInitialPage.js | 8 +-- src/pages/workspace/WorkspaceInvitePage.js | 8 +-- src/pages/workspace/WorkspaceMembersPage.js | 8 +-- src/pages/workspace/WorkspaceNewRoomPage.js | 8 ++- .../workspace/WorkspacePageWithSections.js | 4 +- src/pages/workspace/WorkspaceSettingsPage.js | 8 +-- .../reimburse/WorkspaceReimburseView.js | 4 +- .../{withPolicy.js => withFullPolicy.js} | 56 +++++++++++++------ 12 files changed, 88 insertions(+), 43 deletions(-) rename src/pages/workspace/{withPolicy.js => withFullPolicy.js} (64%) diff --git a/src/components/AvatarWithIndicator.js b/src/components/AvatarWithIndicator.js index 1bd517cfd642..afa59dfbdd9e 100644 --- a/src/components/AvatarWithIndicator.js +++ b/src/components/AvatarWithIndicator.js @@ -11,7 +11,7 @@ import policyMemberPropType from '../pages/policyMemberPropType'; import bankAccountPropTypes from './bankAccountPropTypes'; import cardPropTypes from './cardPropTypes'; import userWalletPropTypes from '../pages/EnablePayments/userWalletPropTypes'; -import {policyPropTypes} from '../pages/workspace/withPolicy'; +import {fullPolicyPropTypes} from '../pages/workspace/withFullPolicy'; import walletTermsPropTypes from '../pages/EnablePayments/walletTermsPropTypes'; import * as PolicyUtils from '../libs/PolicyUtils'; import * as PaymentMethods from '../libs/actions/PaymentMethods'; @@ -30,7 +30,7 @@ const propTypes = { policiesMemberList: PropTypes.objectOf(policyMemberPropType), /** All the user's policies (from Onyx via withFullPolicy) */ - policies: PropTypes.objectOf(policyPropTypes.policy), + policies: PropTypes.objectOf(fullPolicyPropTypes.policy), /** List of bank accounts */ bankAccountList: PropTypes.objectOf(bankAccountPropTypes), diff --git a/src/components/RoomNameInput.js b/src/components/RoomNameInput.js index 55e1a2296a7a..8bd14fe9408c 100644 --- a/src/components/RoomNameInput.js +++ b/src/components/RoomNameInput.js @@ -5,6 +5,7 @@ import CONST from '../CONST'; import ONYXKEYS from '../ONYXKEYS'; import compose from '../libs/compose'; import withLocalize, {withLocalizePropTypes} from './withLocalize'; +import withFullPolicy, {fullPolicyDefaultProps, fullPolicyPropTypes} from '../pages/workspace/withFullPolicy'; import TextInput from './TextInput'; const propTypes = { @@ -21,6 +22,7 @@ const propTypes = { errorText: PropTypes.string, ...withLocalizePropTypes, + ...fullPolicyPropTypes, /* Onyx Props */ @@ -51,6 +53,7 @@ const defaultProps = { initialValue: '', disabled: false, errorText: '', + ...fullPolicyDefaultProps, forwardedRef: () => {}, }; @@ -111,6 +114,7 @@ RoomNameInput.defaultProps = defaultProps; export default compose( withLocalize, + withFullPolicy, withOnyx({ reports: { key: ONYXKEYS.COLLECTION.REPORT, diff --git a/src/pages/ReportSettingsPage.js b/src/pages/ReportSettingsPage.js index 0fe5d285fb92..9efc59dc940e 100644 --- a/src/pages/ReportSettingsPage.js +++ b/src/pages/ReportSettingsPage.js @@ -18,6 +18,7 @@ import Text from '../components/Text'; import Button from '../components/Button'; import RoomNameInput from '../components/RoomNameInput'; import Picker from '../components/Picker'; +import withFullPolicy, {fullPolicyDefaultProps, fullPolicyPropTypes} from './workspace/withFullPolicy'; import * as ValidationUtils from '../libs/ValidationUtils'; import OfflineWithFeedback from '../components/OfflineWithFeedback'; @@ -30,6 +31,7 @@ const propTypes = { }), }).isRequired, + ...fullPolicyPropTypes, ...withLocalizePropTypes, /* Onyx Props */ @@ -77,6 +79,17 @@ const propTypes = { }).isRequired, }; +const defaultProps = { + ...fullPolicyDefaultProps, + report: { + reportID: 0, + reportName: '', + policyID: '', + notificationPreference: '', + visibility: '', + }, +}; + class ReportSettingsPage extends Component { constructor(props) { super(props); @@ -274,9 +287,11 @@ class ReportSettingsPage extends Component { } ReportSettingsPage.propTypes = propTypes; +ReportSettingsPage.defaultProps = defaultProps; export default compose( withLocalize, + withFullPolicy, withOnyx({ report: { key: ({route}) => `${ONYXKEYS.COLLECTION.REPORT}${route.params.reportID}`, diff --git a/src/pages/workspace/WorkspaceBankAccountPage.js b/src/pages/workspace/WorkspaceBankAccountPage.js index 64bd69cb9bd3..6b95d4685ddd 100644 --- a/src/pages/workspace/WorkspaceBankAccountPage.js +++ b/src/pages/workspace/WorkspaceBankAccountPage.js @@ -21,7 +21,7 @@ import Section from '../../components/Section'; import WorkspaceResetBankAccountModal from './WorkspaceResetBankAccountModal'; import styles from '../../styles/styles'; import CONST from '../../CONST'; -import withPolicy from './withPolicy'; +import withFullPolicy from './withFullPolicy'; import Button from '../../components/Button'; import MenuItem from '../../components/MenuItem'; import FullPageNotFoundView from '../../components/BlockingViews/FullPageNotFoundView'; @@ -131,5 +131,5 @@ export default compose( key: ONYXKEYS.REIMBURSEMENT_ACCOUNT, }, }), - withPolicy, + withFullPolicy, )(WorkspaceBankAccountPage); diff --git a/src/pages/workspace/WorkspaceInitialPage.js b/src/pages/workspace/WorkspaceInitialPage.js index cbcccda54c62..6445933dec42 100644 --- a/src/pages/workspace/WorkspaceInitialPage.js +++ b/src/pages/workspace/WorkspaceInitialPage.js @@ -20,7 +20,7 @@ import HeaderWithCloseButton from '../../components/HeaderWithCloseButton'; import compose from '../../libs/compose'; import Avatar from '../../components/Avatar'; import FullPageNotFoundView from '../../components/BlockingViews/FullPageNotFoundView'; -import withPolicy, {policyPropTypes, policyDefaultProps} from './withPolicy'; +import withFullPolicy, {fullPolicyPropTypes, fullPolicyDefaultProps} from './withFullPolicy'; import * as Policy from '../../libs/actions/Policy'; import * as PolicyUtils from '../../libs/PolicyUtils'; import CONST from '../../CONST'; @@ -30,7 +30,7 @@ import policyMemberPropType from '../policyMemberPropType'; import OfflineWithFeedback from '../../components/OfflineWithFeedback'; const propTypes = { - ...policyPropTypes, + ...fullPolicyPropTypes, ...withLocalizePropTypes, /** The employee list of this policy (coming from Onyx) */ @@ -38,7 +38,7 @@ const propTypes = { }; const defaultProps = { - ...policyDefaultProps, + ...fullPolicyDefaultProps, policyMemberList: {}, }; @@ -248,7 +248,7 @@ WorkspaceInitialPage.defaultProps = defaultProps; export default compose( withLocalize, - withPolicy, + withFullPolicy, withOnyx({ policyMemberList: { key: ({policy}) => `${ONYXKEYS.COLLECTION.POLICY_MEMBER_LIST}${policy.id}`, diff --git a/src/pages/workspace/WorkspaceInvitePage.js b/src/pages/workspace/WorkspaceInvitePage.js index 86fcc48b9757..dbefba433b49 100644 --- a/src/pages/workspace/WorkspaceInvitePage.js +++ b/src/pages/workspace/WorkspaceInvitePage.js @@ -20,7 +20,7 @@ import CONST from '../../CONST'; import FullScreenLoadingIndicator from '../../components/FullscreenLoadingIndicator'; import * as Link from '../../libs/actions/Link'; import Text from '../../components/Text'; -import withPolicy, {policyPropTypes, policyDefaultProps} from './withPolicy'; +import withFullPolicy, {fullPolicyPropTypes, fullPolicyDefaultProps} from './withFullPolicy'; import {withNetwork} from '../../components/OnyxProvider'; import FullPageNotFoundView from '../../components/BlockingViews/FullPageNotFoundView'; import networkPropTypes from '../../components/networkPropTypes'; @@ -53,12 +53,12 @@ const propTypes = { }), }).isRequired, - ...policyPropTypes, + ...fullPolicyPropTypes, ...withLocalizePropTypes, ...networkPropTypes, }; -const defaultProps = policyDefaultProps; +const defaultProps = fullPolicyDefaultProps; class WorkspaceInvitePage extends React.Component { constructor(props) { @@ -352,7 +352,7 @@ WorkspaceInvitePage.defaultProps = defaultProps; export default compose( withLocalize, - withPolicy, + withFullPolicy, withNetwork(), withOnyx({ personalDetails: { diff --git a/src/pages/workspace/WorkspaceMembersPage.js b/src/pages/workspace/WorkspaceMembersPage.js index 1de2d1759565..db12309ce7b7 100644 --- a/src/pages/workspace/WorkspaceMembersPage.js +++ b/src/pages/workspace/WorkspaceMembersPage.js @@ -25,7 +25,7 @@ import withWindowDimensions, {windowDimensionsPropTypes} from '../../components/ import OptionRow from '../../components/OptionRow'; import CheckboxWithTooltip from '../../components/CheckboxWithTooltip'; import Hoverable from '../../components/Hoverable'; -import withPolicy, {policyPropTypes, policyDefaultProps} from './withPolicy'; +import withFullPolicy, {fullPolicyPropTypes, fullPolicyDefaultProps} from './withFullPolicy'; import CONST from '../../CONST'; import OfflineWithFeedback from '../../components/OfflineWithFeedback'; import {withNetwork} from '../../components/OnyxProvider'; @@ -45,13 +45,13 @@ const propTypes = { }), }).isRequired, - ...policyPropTypes, + ...fullPolicyPropTypes, ...withLocalizePropTypes, ...windowDimensionsPropTypes, ...networkPropTypes, }; -const defaultProps = policyDefaultProps; +const defaultProps = fullPolicyDefaultProps; class WorkspaceMembersPage extends React.Component { constructor(props) { @@ -367,7 +367,7 @@ WorkspaceMembersPage.defaultProps = defaultProps; export default compose( withLocalize, withWindowDimensions, - withPolicy, + withFullPolicy, withNetwork(), withOnyx({ personalDetails: { diff --git a/src/pages/workspace/WorkspaceNewRoomPage.js b/src/pages/workspace/WorkspaceNewRoomPage.js index 440362bb91eb..1dae4d8d5b67 100644 --- a/src/pages/workspace/WorkspaceNewRoomPage.js +++ b/src/pages/workspace/WorkspaceNewRoomPage.js @@ -3,6 +3,7 @@ import {ScrollView, View} from 'react-native'; import _ from 'underscore'; import {withOnyx} from 'react-native-onyx'; import PropTypes from 'prop-types'; +import withFullPolicy, {fullPolicyDefaultProps, fullPolicyPropTypes} from './withFullPolicy'; import * as Report from '../../libs/actions/Report'; import withLocalize, {withLocalizePropTypes} from '../../components/withLocalize'; import compose from '../../libs/compose'; @@ -34,17 +35,17 @@ const propTypes = { policyID: PropTypes.string, }).isRequired, - /** List of betas available to current user */ - betas: PropTypes.arrayOf(PropTypes.string), - /** Are we loading the createPolicyRoom command */ isLoadingCreatePolicyRoom: PropTypes.bool, + ...fullPolicyPropTypes, + ...withLocalizePropTypes, }; const defaultProps = { betas: [], isLoadingCreatePolicyRoom: false, + ...fullPolicyDefaultProps, }; class WorkspaceNewRoomPage extends React.Component { @@ -202,6 +203,7 @@ WorkspaceNewRoomPage.propTypes = propTypes; WorkspaceNewRoomPage.defaultProps = defaultProps; export default compose( + withFullPolicy, withOnyx({ betas: { key: ONYXKEYS.BETAS, diff --git a/src/pages/workspace/WorkspacePageWithSections.js b/src/pages/workspace/WorkspacePageWithSections.js index 7c0ecacc0d8a..d6fc3b3a09e6 100644 --- a/src/pages/workspace/WorkspacePageWithSections.js +++ b/src/pages/workspace/WorkspacePageWithSections.js @@ -15,7 +15,7 @@ import * as BankAccounts from '../../libs/actions/BankAccounts'; import BankAccount from '../../libs/models/BankAccount'; import reimbursementAccountPropTypes from '../ReimbursementAccount/reimbursementAccountPropTypes'; import userPropTypes from '../settings/userPropTypes'; -import withPolicy from './withPolicy'; +import withFullPolicy from './withFullPolicy'; import {withNetwork} from '../../components/OnyxProvider'; import networkPropTypes from '../../components/networkPropTypes'; @@ -131,6 +131,6 @@ export default compose( key: ONYXKEYS.REIMBURSEMENT_ACCOUNT, }, }), - withPolicy, + withFullPolicy, withNetwork(), )(WorkspacePageWithSections); diff --git a/src/pages/workspace/WorkspaceSettingsPage.js b/src/pages/workspace/WorkspaceSettingsPage.js index 40c370abb92b..a35c1fc690a2 100644 --- a/src/pages/workspace/WorkspaceSettingsPage.js +++ b/src/pages/workspace/WorkspaceSettingsPage.js @@ -19,18 +19,18 @@ import Picker from '../../components/Picker'; import TextInput from '../../components/TextInput'; import FixedFooter from '../../components/FixedFooter'; import WorkspacePageWithSections from './WorkspacePageWithSections'; -import withPolicy, {policyPropTypes, policyDefaultProps} from './withPolicy'; +import withFullPolicy, {fullPolicyPropTypes, fullPolicyDefaultProps} from './withFullPolicy'; import {withNetwork} from '../../components/OnyxProvider'; import OfflineWithFeedback from '../../components/OfflineWithFeedback'; import FullPageNotFoundView from '../../components/BlockingViews/FullPageNotFoundView'; const propTypes = { - ...policyPropTypes, + ...fullPolicyPropTypes, ...withLocalizePropTypes, }; const defaultProps = { - ...policyDefaultProps, + ...fullPolicyDefaultProps, }; class WorkspaceSettingsPage extends React.Component { @@ -162,7 +162,7 @@ WorkspaceSettingsPage.propTypes = propTypes; WorkspaceSettingsPage.defaultProps = defaultProps; export default compose( - withPolicy, + withFullPolicy, withOnyx({ currencyList: {key: ONYXKEYS.CURRENCY_LIST}, }), diff --git a/src/pages/workspace/reimburse/WorkspaceReimburseView.js b/src/pages/workspace/reimburse/WorkspaceReimburseView.js index cead7dbc828a..053e49348872 100644 --- a/src/pages/workspace/reimburse/WorkspaceReimburseView.js +++ b/src/pages/workspace/reimburse/WorkspaceReimburseView.js @@ -17,7 +17,7 @@ import * as Link from '../../../libs/actions/Link'; import compose from '../../../libs/compose'; import ONYXKEYS from '../../../ONYXKEYS'; import * as Policy from '../../../libs/actions/Policy'; -import withPolicy from '../withPolicy'; +import withFullPolicy from '../withFullPolicy'; import CONST from '../../../CONST'; import Button from '../../../components/Button'; import {withNetwork} from '../../../components/OnyxProvider'; @@ -302,7 +302,7 @@ class WorkspaceReimburseView extends React.Component { WorkspaceReimburseView.propTypes = propTypes; export default compose( - withPolicy, + withFullPolicy, withLocalize, withNetwork(), withOnyx({ diff --git a/src/pages/workspace/withPolicy.js b/src/pages/workspace/withFullPolicy.js similarity index 64% rename from src/pages/workspace/withPolicy.js rename to src/pages/workspace/withFullPolicy.js index 34182871eb4f..45f608d685b2 100644 --- a/src/pages/workspace/withPolicy.js +++ b/src/pages/workspace/withFullPolicy.js @@ -2,6 +2,7 @@ import _ from 'underscore'; import lodashGet from 'lodash/get'; import React from 'react'; import PropTypes from 'prop-types'; +import Str from 'expensify-common/lib/str'; import {withOnyx} from 'react-native-onyx'; import {useNavigationState} from '@react-navigation/native'; import CONST from '../../CONST'; @@ -10,6 +11,9 @@ import * as Policy from '../../libs/actions/Policy'; import ONYXKEYS from '../../ONYXKEYS'; import policyMemberPropType from '../policyMemberPropType'; +let previousRouteName = ''; +let previousRoutePolicyID = ''; + /** * @param {Object} route * @returns {String} @@ -18,7 +22,20 @@ function getPolicyIDFromRoute(route) { return lodashGet(route, 'params.policyID', ''); } -const policyPropTypes = { +/** + * @param {String} routeName + * @param {String} policyID + * @returns {Boolean} + */ +function isPreviousRouteInSameWorkspace(routeName, policyID) { + return ( + Str.startsWith(routeName, 'Workspace') + && Str.startsWith(previousRouteName, 'Workspace') + && policyID === previousRoutePolicyID + ); +} + +const fullPolicyPropTypes = { /** The policy object for the current route */ policy: PropTypes.shape({ /** The ID of the policy */ @@ -61,12 +78,12 @@ const policyPropTypes = { policyMemberList: PropTypes.objectOf(policyMemberPropType), }; -const policyDefaultProps = { +const fullPolicyDefaultProps = { policy: {}, }; /* - * HOC for connecting a policy in Onyx corresponding to the policyID in route params + * HOC for loading a full policy. It checks the route params and if current route has a policyID that the previous route did not, it full-loads that policy. */ export default function (WrappedComponent) { const propTypes = { @@ -74,39 +91,46 @@ export default function (WrappedComponent) { * That way, if a ref is passed to a component wrapped in the HOC, the ref is a reference to the wrapped component, not the HOC. */ forwardedRef: PropTypes.func, - ...policyPropTypes, + ...fullPolicyPropTypes, }; const defaultProps = { forwardedRef: () => {}, - ...policyDefaultProps, + ...fullPolicyDefaultProps, }; - const WithPolicy = (props) => { + const WithFullPolicy = (props) => { const currentRoute = _.last(useNavigationState(state => state.routes || [])); const policyID = getPolicyIDFromRoute(currentRoute); + const isFromFullPolicy = lodashGet(props, 'policy.isFromFullPolicy', false) || lodashGet(props, `policy.policy_${policyID}.isFromFullPolicy`, false); - if (_.isString(policyID) && !_.isEmpty(policyID)) { + if (_.isString(policyID) && !_.isEmpty(policyID) && (!isFromFullPolicy || !isPreviousRouteInSameWorkspace(currentRoute.name, policyID))) { + Policy.loadFullPolicy(policyID); Policy.updateLastAccessedWorkspace(policyID); } - const rest = _.omit(props, ['forwardedRef']); + previousRouteName = currentRoute.name; + previousRoutePolicyID = policyID; + + const rest = _.omit(props, ['forwardedRef', 'policy', 'policyMemberList']); return ( ); }; - WithPolicy.propTypes = propTypes; - WithPolicy.defaultProps = defaultProps; - WithPolicy.displayName = `withFullPolicy(${getComponentDisplayName(WrappedComponent)})`; - const withPolicy = React.forwardRef((props, ref) => ( + WithFullPolicy.propTypes = propTypes; + WithFullPolicy.defaultProps = defaultProps; + WithFullPolicy.displayName = `withFullPolicy(${getComponentDisplayName(WrappedComponent)})`; + const withFullPolicy = React.forwardRef((props, ref) => ( // eslint-disable-next-line react/jsx-props-no-spreading - + )); return withOnyx({ @@ -116,10 +140,10 @@ export default function (WrappedComponent) { policyMemberList: { key: props => `${ONYXKEYS.COLLECTION.POLICY_MEMBER_LIST}${getPolicyIDFromRoute(props.route)}`, }, - })(withPolicy); + })(withFullPolicy); } export { - policyPropTypes, - policyDefaultProps, + fullPolicyPropTypes, + fullPolicyDefaultProps, };