diff --git a/src/pages/workspace/WorkspaceMembersPage.tsx b/src/pages/workspace/WorkspaceMembersPage.tsx index fcea3732c47f9..313430a14b469 100644 --- a/src/pages/workspace/WorkspaceMembersPage.tsx +++ b/src/pages/workspace/WorkspaceMembersPage.tsx @@ -1,17 +1,16 @@ import {useIsFocused} from '@react-navigation/native'; -import {deepEqual} from 'fast-equals'; import React, {useCallback, useContext, useEffect, useMemo, useRef, useState} from 'react'; import {InteractionManager, View} from 'react-native'; import type {ValueOf} from 'type-fest'; import Button from '@components/Button'; import ButtonWithDropdownMenu from '@components/ButtonWithDropdownMenu'; import type {DropdownOption, WorkspaceMemberBulkActionType} from '@components/ButtonWithDropdownMenu/types'; -import ConfirmModal from '@components/ConfirmModal'; import DecisionModal from '@components/DecisionModal'; // eslint-disable-next-line no-restricted-imports import {Plus} from '@components/Icon/Expensicons'; import {LockedAccountContext} from '@components/LockedAccountModalProvider'; import MessagesRow from '@components/MessagesRow'; +import {ModalActions} from '@components/Modal/Global/ModalContext'; import SearchBar from '@components/SearchBar'; import TableListItem from '@components/SelectionList/ListItem/TableListItem'; import type {ListItem, SelectionListHandle} from '@components/SelectionList/types'; @@ -19,6 +18,7 @@ import SelectionListWithModal from '@components/SelectionListWithModal'; import CustomListHeader from '@components/SelectionListWithModal/CustomListHeader'; import Text from '@components/Text'; import type {BaseTextInputRef} from '@components/TextInput/BaseTextInput/types'; +import useConfirmModal from '@hooks/useConfirmModal'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useFilteredSelection from '@hooks/useFilteredSelection'; import {useMemoizedLazyExpensifyIcons, useMemoizedLazyIllustrations} from '@hooks/useLazyAsset'; @@ -103,14 +103,13 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers const employeeListDetails = useMemo(() => policy?.employeeList ?? ({} as PolicyEmployeeList), [policy?.employeeList]); const currentUserPersonalDetails = useCurrentUserPersonalDetails(); const styles = useThemeStyles(); + const {showConfirmModal} = useConfirmModal(); const StyleUtils = useStyleUtils(); - const [removeMembersConfirmModalVisible, setRemoveMembersConfirmModalVisible] = useState(false); const {isOffline} = useNetwork(); const prevIsOffline = usePrevious(isOffline); const accountIDs = useMemo(() => Object.values(policyMemberEmailsToAccountIDs ?? {}).map((accountID) => Number(accountID)), [policyMemberEmailsToAccountIDs]); const prevAccountIDs = usePrevious(accountIDs); const textInputRef = useRef(null); - const [isOfflineModalVisible, setIsOfflineModalVisible] = useState(false); const [isDownloadFailureModalVisible, setIsDownloadFailureModalVisible] = useState(false); const isOfflineAndNoMemberDataAvailable = isEmptyObject(policy?.employeeList) && isOffline; const {translate, formatPhoneNumber, localeCompare} = useLocalize(); @@ -202,14 +201,6 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers getWorkspaceMembers(); }, [getWorkspaceMembers]); - useEffect(() => { - if (!removeMembersConfirmModalVisible || deepEqual(accountIDs, prevAccountIDs)) { - return; - } - setRemoveMembersConfirmModalVisible(false); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [accountIDs]); - useEffect(() => { const isReconnecting = prevIsOffline && !isOffline; if (!isReconnecting) { @@ -266,8 +257,6 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers } } - setRemoveMembersConfirmModalVisible(false); - // eslint-disable-next-line @typescript-eslint/no-deprecated InteractionManager.runAfterInteractions(() => { setSelectedEmployees([]); @@ -278,9 +267,26 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers /** * Show the modal to confirm removal of the selected members */ - const askForConfirmationToRemove = () => { - setRemoveMembersConfirmModalVisible(true); - }; + const askForConfirmationToRemove = useCallback(async () => { + const result = await showConfirmModal({ + danger: true, + title: translate('workspace.people.removeMembersTitle', {count: selectedEmployees.length}), + prompt: confirmModalPrompt, + confirmText: translate('common.remove'), + cancelText: translate('common.cancel'), + onModalHide: () => { + if (!textInputRef.current) { + return; + } + textInputRef.current.focus(); + }, + }); + if (result.action !== ModalActions.CONFIRM) { + return; + } + + removeUsers(); + }, [confirmModalPrompt, removeUsers, selectedEmployees.length, showConfirmModal, translate]); /** * Add or remove all users passed from the selectedEmployees list @@ -486,6 +492,7 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers styles.cursorDefault, styles.flex1, styles.pr3, + translate, styles.alignSelfStart, styles.alignSelfEnd, isControlPolicyWithWideLayout, @@ -667,6 +674,16 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers return options; }; + const showRequiresInternetModal = useCallback(() => { + showConfirmModal({ + title: translate('common.youAppearToBeOffline'), + prompt: translate('common.thisFeatureRequiresInternet'), + confirmText: translate('common.buttonConfirm'), + shouldShowCancelButton: false, + shouldHandleNavigationBack: true, + }); + }, [showConfirmModal, translate]); + const secondaryActions = useMemo(() => { if (!isPolicyAdmin) { return []; @@ -682,7 +699,7 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers return; } if (isOffline) { - close(() => setIsOfflineModalVisible(true)); + close(showRequiresInternetModal); return; } Navigation.navigate(ROUTES.WORKSPACE_MEMBERS_IMPORT.getRoute(policyID)); @@ -694,7 +711,7 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers text: translate('spreadsheet.downloadCSV'), onSelected: () => { if (isOffline) { - close(() => setIsOfflineModalVisible(true)); + close(showRequiresInternetModal); return; } @@ -713,7 +730,7 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers ]; return menuItems; - }, [icons.Download, icons.Table, policyID, translate, isOffline, isPolicyAdmin, isAccountLocked, showLockedAccountModal]); + }, [isPolicyAdmin, icons.Table, icons.Download, translate, isAccountLocked, isOffline, policyID, showLockedAccountModal, showRequiresInternetModal]); const getHeaderButtons = () => { if (!isPolicyAdmin) { @@ -811,36 +828,6 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers {() => ( <> {shouldUseNarrowLayout && {getHeaderButtons()}} - setIsOfflineModalVisible(false)} - title={translate('common.youAppearToBeOffline')} - prompt={translate('common.thisFeatureRequiresInternet')} - confirmText={translate('common.buttonConfirm')} - shouldShowCancelButton={false} - onCancel={() => setIsOfflineModalVisible(false)} - shouldHandleNavigationBack - /> - - setRemoveMembersConfirmModalVisible(false)} - prompt={confirmModalPrompt} - confirmText={translate('common.remove')} - cancelText={translate('common.cancel')} - onModalHide={() => { - // eslint-disable-next-line @typescript-eslint/no-deprecated - InteractionManager.runAfterInteractions(() => { - if (!textInputRef.current) { - return; - } - textInputRef.current.focus(); - }); - }} - /> 0 ? () => toggleAllUsers(filteredData) : undefined} style={{listHeaderWrapperStyle: [styles.ph9, styles.pv3, styles.pb5], listItemTitleContainerStyles: shouldUseNarrowLayout ? undefined : [styles.pr3]}} onTurnOnSelectionMode={(item) => item && toggleUser(item.login)} - disableKeyboardShortcuts={removeMembersConfirmModalVisible} shouldPreventDefaultFocusOnSelectRow={!canUseTouchScreen()} onCheckboxPress={(item) => toggleUser(item.login)} shouldUseDefaultRightHandSideCheckmark={false} diff --git a/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx b/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx index 2ae06486029b0..e21bf06dc6508 100644 --- a/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx +++ b/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx @@ -1,22 +1,23 @@ import {Str} from 'expensify-common'; -import React, {useContext, useEffect, useState} from 'react'; +import React, {useContext, useEffect} from 'react'; import {View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; import type {ValueOf} from 'type-fest'; import Avatar from '@components/Avatar'; import Button from '@components/Button'; import ButtonDisabledWhenOffline from '@components/Button/ButtonDisabledWhenOffline'; -import ConfirmModal from '@components/ConfirmModal'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import {LockedAccountContext} from '@components/LockedAccountModalProvider'; import MenuItem from '@components/MenuItem'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; +import {ModalActions} from '@components/Modal/Global/ModalContext'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; import ScreenWrapper from '@components/ScreenWrapper'; import ScrollView from '@components/ScrollView'; import Text from '@components/Text'; import useCardFeeds from '@hooks/useCardFeeds'; import {useCompanyCardFeedIcons} from '@hooks/useCompanyCardIcons'; +import useConfirmModal from '@hooks/useConfirmModal'; import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails'; import useExpensifyCardFeeds from '@hooks/useExpensifyCardFeeds'; import {useMemoizedLazyExpensifyIcons} from '@hooks/useLazyAsset'; @@ -88,8 +89,7 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM const [customCardNames] = useOnyx(ONYXKEYS.NVP_EXPENSIFY_COMPANY_CARDS_CUSTOM_NAMES, {canBeMissing: true}); const [fundList] = useOnyx(ONYXKEYS.FUND_LIST, {canBeMissing: true}); const expensifyCardSettings = useExpensifyCardFeeds(policyID); - - const [isRemoveMemberConfirmModalVisible, setIsRemoveMemberConfirmModalVisible] = useState(false); + const {showConfirmModal} = useConfirmModal(); const accountID = Number(route.params.accountID); const memberLogin = personalDetails?.[accountID]?.login ?? ''; @@ -109,7 +109,6 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM const isSMSLogin = Str.isSMSLogin(memberLogin); const phoneNumber = getPhoneNumber(details); const isReimburser = policy?.achAccount?.reimburser === memberLogin; - const [isCannotRemoveUser, setIsCannotRemoveUser] = useState(false); const {isAccountLocked, showLockedAccountModal} = useContext(LockedAccountContext); const {approvalWorkflows} = convertPolicyEmployeesToApprovalWorkflows({ @@ -170,14 +169,6 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM navigateAfterInteraction(() => Navigation.goBack()); }, [member?.pendingAction, prevMember]); - const askForConfirmationToRemove = () => { - if (isReimburser) { - setIsCannotRemoveUser(true); - return; - } - setIsRemoveMemberConfirmModalVisible(true); - }; - // Function to remove a member and close the modal const removeMemberAndCloseModal = () => { removeMembers(policy, [memberLogin], {[memberLogin]: accountID}); @@ -187,7 +178,6 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM // We can't let the "Prevent Self Approvals" enabled if there's only one workspace user setPolicyPreventSelfApproval(policyID, false); } - setIsRemoveMemberConfirmModalVisible(false); }; const removeUser = () => { @@ -221,6 +211,36 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM removeMemberAndCloseModal(); }; + const showRemoveMemberModal = async () => { + const result = await showConfirmModal({ + danger: true, + title: translate('workspace.people.removeMemberTitle'), + prompt: confirmModalPrompt, + confirmText: translate('common.remove'), + cancelText: translate('common.cancel'), + }); + + if (result.action !== ModalActions.CONFIRM) { + return; + } + removeUser(); + }; + + const askForConfirmationToRemove = () => { + if (isReimburser) { + showConfirmModal({ + shouldShowCancelButton: false, + success: true, + title: translate('workspace.people.removeMemberTitle'), + prompt: confirmModalPrompt, + confirmText: translate('common.buttonConfirm'), + cancelText: translate('common.cancel'), + }); + return; + } + showRemoveMemberModal(); + }; + const navigateToProfile = () => { Navigation.navigate(ROUTES.PROFILE.getRoute(accountID, Navigation.getActiveRoute())); }; @@ -311,27 +331,6 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM style={styles.mb5} /> )} - setIsRemoveMemberConfirmModalVisible(false)} - prompt={confirmModalPrompt} - confirmText={translate('common.remove')} - cancelText={translate('common.cancel')} - /> - { - setIsCannotRemoveUser(false); - }} - prompt={confirmModalPrompt} - confirmText={translate('common.buttonConfirm')} - success - shouldShowCancelButton={false} - /> convertPolicyEmployeesToApprovalWorkflows({ @@ -130,7 +130,6 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { return; } - setIsUpdateWorkspaceCurrencyModalOpen(false); Navigation.navigate(ROUTES.WORKSPACE_OVERVIEW_CURRENCY.getRoute(policy.id, true)); }, [policy]); @@ -148,7 +147,6 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { }, []); const confirmDisableApprovals = useCallback(() => { - setIsDisableApprovalsConfirmModalOpen(false); setWorkspaceApprovalMode(route.params.policyID, policy?.owner ?? '', CONST.POLICY.APPROVAL_MODE.OPTIONAL, { reportNextSteps: allReportNextSteps, transactionViolations, @@ -205,6 +203,12 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { const hasApprovalError = !!policy?.errorFields?.approvalMode; const hasDelayedSubmissionError = !!(policy?.errorFields?.autoReporting ?? policy?.errorFields?.autoReportingFrequency); + const updateWorkspaceCurrencyPrompt = ( + + + + ); + return [ { title: translate('workflowsPage.submissionFrequency'), @@ -235,7 +239,18 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { switchAccessibilityLabel: isSmartLimitEnabled ? translate('workspace.moreFeatures.workflows.disableApprovalPrompt') : translate('workflowsPage.addApprovalsDescription'), onToggle: (isEnabled: boolean) => { if (!isEnabled) { - setIsDisableApprovalsConfirmModalOpen(true); + showConfirmModal({ + title: translate('workspace.bankAccount.areYouSure'), + prompt: translate('workflowsPage.disableApprovalPromptDescription'), + confirmText: translate('common.disable'), + cancelText: translate('common.cancel'), + danger: true, + }).then((result) => { + if (result.action !== ModalActions.CONFIRM) { + return; + } + confirmDisableApprovals(); + }); return; } setWorkspaceApprovalMode(route.params.policyID, policy?.owner ?? '', isEnabled ? updateApprovalMode : CONST.POLICY.APPROVAL_MODE.OPTIONAL, { @@ -365,7 +380,18 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { return; } if (!isCurrencySupportedForGlobalReimbursement((policy?.outputCurrency ?? '') as CurrencyType)) { - setIsUpdateWorkspaceCurrencyModalOpen(true); + showConfirmModal({ + title: translate('workspace.bankAccount.workspaceCurrencyNotSupported'), + prompt: updateWorkspaceCurrencyPrompt, + confirmText: translate('workspace.bankAccount.updateWorkspaceCurrency'), + cancelText: translate('common.cancel'), + }).then((result) => { + if (result.action !== ModalActions.CONFIRM) { + return; + } + confirmCurrencyChangeAndHideModal(); + }); + return; } if (!shouldShowBankAccount && hasValidExistingAccounts && !shouldShowContinueModal) { @@ -416,10 +442,16 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { policy, bankAccountList, styles, - theme, translate, onPressAutoReportingFrequency, isSmartLimitEnabled, + isDEWEnabled, + shouldUseNarrowLayout, + expensifyIcons.Info, + expensifyIcons.Plus, + expensifyIcons.DotIndicator, + theme.textSupporting, + accountManagerReportID, filteredApprovalWorkflows, addApprovalAction, isOffline, @@ -427,17 +459,16 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { displayNameForAuthorizedPayer, route.params.policyID, updateApprovalMode, + showConfirmModal, + confirmDisableApprovals, allReportNextSteps, transactionViolations, betas, isAccountLocked, + showLockedAccountModal, hasValidExistingAccounts, shouldShowContinueModal, - showLockedAccountModal, - isDEWEnabled, - shouldUseNarrowLayout, - accountManagerReportID, - expensifyIcons, + confirmCurrencyChangeAndHideModal, ]); const renderOptionItem = (item: ToggleSettingOptionRowProps, index: number) => ( @@ -463,12 +494,6 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { ); - const updateWorkspaceCurrencyPrompt = ( - - - - ); - const isPaidGroupPolicy = isPaidGroupPolicyUtil(policy); const isLoading = !!(policy?.isLoading && policy?.reimbursementChoice === undefined); @@ -491,26 +516,7 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { {optionItems.map(renderOptionItem)} - setIsUpdateWorkspaceCurrencyModalOpen(false)} - prompt={updateWorkspaceCurrencyPrompt} - confirmText={translate('workspace.bankAccount.updateWorkspaceCurrency')} - cancelText={translate('common.cancel')} - /> - setIsDisableApprovalsConfirmModalOpen(false)} - prompt={translate('workflowsPage.disableApprovalPromptDescription')} - confirmText={translate('common.disable')} - cancelText={translate('common.cancel')} - danger - /> ); diff --git a/src/pages/workspace/workflows/approvals/ApprovalWorkflowEditor.tsx b/src/pages/workspace/workflows/approvals/ApprovalWorkflowEditor.tsx index 26727d192cf03..4fe39191506d0 100644 --- a/src/pages/workspace/workflows/approvals/ApprovalWorkflowEditor.tsx +++ b/src/pages/workspace/workflows/approvals/ApprovalWorkflowEditor.tsx @@ -31,7 +31,7 @@ type ApprovalWorkflowEditorProps = { approvalWorkflow: ApprovalWorkflowOnyx; /** Function to remove the approval workflow */ - removeApprovalWorkflow?: () => void; + removeApprovalWorkflow?: () => void | Promise; /** The policy for the current route */ policy: OnyxEntry; diff --git a/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsEditPage.tsx b/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsEditPage.tsx index 2e429a0c4a11f..a65eec4a33c83 100644 --- a/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsEditPage.tsx +++ b/src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsEditPage.tsx @@ -3,12 +3,13 @@ import React, {useEffect, useRef, useState} from 'react'; import type {ScrollView} from 'react-native'; import {InteractionManager} from 'react-native'; import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; -import ConfirmModal from '@components/ConfirmModal'; import FormAlertWithSubmitButton from '@components/FormAlertWithSubmitButton'; import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; +import {ModalActions} from '@components/Modal/Global/ModalContext'; import ScreenWrapper from '@components/ScreenWrapper'; import useBottomSafeSafeAreaPaddingStyle from '@hooks/useBottomSafeSafeAreaPaddingStyle'; +import useConfirmModal from '@hooks/useConfirmModal'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useThemeStyles from '@hooks/useThemeStyles'; @@ -37,8 +38,8 @@ function WorkspaceWorkflowsApprovalsEditPage({policy, isLoadingReportData = true const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false}); const [approvalWorkflow] = useOnyx(ONYXKEYS.APPROVAL_WORKFLOW, {canBeMissing: true}); const [initialApprovalWorkflow, setInitialApprovalWorkflow] = useState(); - const [isDeleteModalVisible, setIsDeleteModalVisible] = useState(false); const formRef = useRef(null); + const {showConfirmModal} = useConfirmModal(); const isDeleting = useRef(false); const updateApprovalWorkflowCallback = () => { @@ -67,7 +68,6 @@ function WorkspaceWorkflowsApprovalsEditPage({policy, isLoadingReportData = true // Mark as deleting to prevent the useEffect from clearing the workflow and causing a blink isDeleting.current = true; - setIsDeleteModalVisible(false); Navigation.dismissModal(); // eslint-disable-next-line @typescript-eslint/no-deprecated InteractionManager.runAfterInteractions(() => { @@ -152,7 +152,19 @@ function WorkspaceWorkflowsApprovalsEditPage({policy, isLoadingReportData = true <> setIsDeleteModalVisible(true)} + removeApprovalWorkflow={async () => { + const result = await showConfirmModal({ + title: translate('workflowsEditApprovalsPage.deleteTitle'), + prompt: translate('workflowsEditApprovalsPage.deletePrompt'), + confirmText: translate('common.delete'), + cancelText: translate('common.cancel'), + danger: true, + }); + if (result.action !== ModalActions.CONFIRM) { + return; + } + removeApprovalWorkflowCallback(); + }} policy={policy} policyID={route.params.policyID} ref={formRef} @@ -171,16 +183,6 @@ function WorkspaceWorkflowsApprovalsEditPage({policy, isLoadingReportData = true )} {!initialApprovalWorkflow && } - setIsDeleteModalVisible(false)} - prompt={translate('workflowsEditApprovalsPage.deletePrompt')} - confirmText={translate('common.delete')} - cancelText={translate('common.cancel')} - danger - /> ); diff --git a/tests/ui/WorkspaceMembersTest.tsx b/tests/ui/WorkspaceMembersTest.tsx index 8e87d9589bb37..17eedd670dc05 100644 --- a/tests/ui/WorkspaceMembersTest.tsx +++ b/tests/ui/WorkspaceMembersTest.tsx @@ -5,13 +5,12 @@ import React from 'react'; import Onyx from 'react-native-onyx'; import ComposeProviders from '@components/ComposeProviders'; import {LocaleContextProvider} from '@components/LocaleContextProvider'; +import {ModalProvider} from '@components/Modal/Global/ModalContext'; import OnyxListItemProvider from '@components/OnyxListItemProvider'; import {CurrentReportIDContextProvider} from '@hooks/useCurrentReportID'; import * as useResponsiveLayoutModule from '@hooks/useResponsiveLayout'; import type ResponsiveLayoutResult from '@hooks/useResponsiveLayout/types'; -import {removeApprovalWorkflow} from '@libs/actions/Workflow'; import createPlatformStackNavigator from '@libs/Navigation/PlatformStackNavigation/createPlatformStackNavigator'; -import {updateWorkflowDataOnApproverRemoval} from '@libs/WorkflowUtils'; import type {WorkspaceSplitNavigatorParamList} from '@navigation/types'; import WorkspaceMembersPage from '@pages/workspace/WorkspaceMembersPage'; import CONST from '@src/CONST'; @@ -26,33 +25,13 @@ jest.unmock('react-native-worklets'); jest.mock('@src/components/ConfirmedRoute.tsx'); -jest.mock('@libs/WorkflowUtils', () => { - // eslint-disable-next-line - const actual = jest.requireActual('@libs/WorkflowUtils'); - // eslint-disable-next-line - return { - ...actual, - updateWorkflowDataOnApproverRemoval: jest.fn(() => [{members: [], approvers: [], isDefault: false, removeApprovalWorkflow: true}]), - }; -}); - -jest.mock('@libs/actions/Workflow', () => { - // eslint-disable-next-line - const actual = jest.requireActual('@libs/actions/Workflow'); - // eslint-disable-next-line - return { - ...actual, - removeApprovalWorkflow: jest.fn(), - }; -}); - TestHelper.setupGlobalFetchMock(); const Stack = createPlatformStackNavigator(); const renderPage = (initialRouteName: typeof SCREENS.WORKSPACE.MEMBERS, initialParams: WorkspaceSplitNavigatorParamList[typeof SCREENS.WORKSPACE.MEMBERS]) => { return render( - + @@ -365,17 +344,7 @@ describe('WorkspaceMembers', () => { expect(screen.getByLabelText(confirmText)).toBeOnTheScreen(); }); - // Press confirm button - fireEvent.press(screen.getByLabelText(confirmText)); - - await waitForBatchedUpdatesWithAct(); - - // Verify workflow actions are only called once when an approver is removed - expect(updateWorkflowDataOnApproverRemoval).toHaveBeenCalledTimes(1); - expect(removeApprovalWorkflow).toHaveBeenCalledTimes(1); - unmount(); - await waitForBatchedUpdatesWithAct(); }); }); });