diff --git a/src/libs/actions/Workflow.ts b/src/libs/actions/Workflow.ts index bb86449286a4b..6b53b785ae1ef 100644 --- a/src/libs/actions/Workflow.ts +++ b/src/libs/actions/Workflow.ts @@ -80,7 +80,12 @@ function createApprovalWorkflow({approvalWorkflow, policy, addExpenseApprovalsTa onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, value: { - employeeList: Object.fromEntries(Object.keys(updatedEmployees).map((key) => [key, {pendingAction: null, pendingFields: null}])), + employeeList: Object.fromEntries( + Object.keys(updatedEmployees).map((key) => [ + key, + previousEmployeeList[key]?.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE ? {pendingFields: null} : {pendingAction: null, pendingFields: null}, + ]), + ), }, }, ]; @@ -151,7 +156,12 @@ function updateApprovalWorkflow(approvalWorkflow: ApprovalWorkflow, membersToRem onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, value: { - employeeList: Object.fromEntries(Object.keys(updatedEmployees).map((key) => [key, {pendingAction: null, pendingFields: null}])), + employeeList: Object.fromEntries( + Object.keys(updatedEmployees).map((key) => [ + key, + previousEmployeeList[key]?.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE ? {pendingFields: null} : {pendingAction: null, pendingFields: null}, + ]), + ), }, }, ]; @@ -209,7 +219,12 @@ function removeApprovalWorkflow(approvalWorkflow: ApprovalWorkflow, policy: Onyx onyxMethod: Onyx.METHOD.MERGE, key: `${ONYXKEYS.COLLECTION.POLICY}${policy.id}`, value: { - employeeList: Object.fromEntries(Object.keys(updatedEmployees).map((key) => [key, {pendingAction: null}])), + employeeList: Object.fromEntries( + Object.keys(updatedEmployees).map((key) => [ + key, + previousEmployeeList[key]?.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE ? {pendingFields: null} : {pendingAction: null, pendingFields: null}, + ]), + ), }, }, ]; diff --git a/src/pages/workspace/WorkspaceMembersPage.tsx b/src/pages/workspace/WorkspaceMembersPage.tsx index c3468a9f8fde1..6c56b2fd0cff6 100644 --- a/src/pages/workspace/WorkspaceMembersPage.tsx +++ b/src/pages/workspace/WorkspaceMembersPage.tsx @@ -227,12 +227,22 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers * Please see https://github.com/Expensify/App/blob/main/README.md#Security for more details */ const removeUsers = () => { - // Check if any of the members are approvers - const hasApprovers = selectedEmployees.some((email) => isApprover(policy, email)); + const selectedEmployeesToRemove = [...selectedEmployees]; + + // eslint-disable-next-line @typescript-eslint/no-deprecated + InteractionManager.runAfterInteractions(() => { + setSelectedEmployees([]); + removeMembers(policy, selectedEmployeesToRemove, policyMemberEmailsToAccountIDs); + + // Check if any of the members are approvers + const hasApprovers = selectedEmployeesToRemove.some((email) => isApprover(policy, email)); + + if (!hasApprovers) { + return; + } - if (hasApprovers) { const ownerEmail = ownerDetails.login; - for (const login of selectedEmployees) { + for (const login of selectedEmployeesToRemove) { if (!isApprover(policy, login)) { continue; } @@ -256,12 +266,6 @@ function WorkspaceMembersPage({personalDetails, route, policy}: WorkspaceMembers } } } - } - - // eslint-disable-next-line @typescript-eslint/no-deprecated - InteractionManager.runAfterInteractions(() => { - setSelectedEmployees([]); - removeMembers(policy, selectedEmployees, policyMemberEmailsToAccountIDs); }); }; diff --git a/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx b/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx index 3b8d01d98575f..387716e2f7094 100644 --- a/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx +++ b/src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx @@ -1,6 +1,6 @@ import {Str} from 'expensify-common'; import React, {useContext, useEffect} from 'react'; -import {View} from 'react-native'; +import {InteractionManager, View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; import type {ValueOf} from 'type-fest'; import Avatar from '@components/Avatar'; @@ -187,6 +187,9 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM return; } + // Remove the member and close the modal + removeMemberAndCloseModal(); + // Update approval workflows after approver removal const updatedWorkflows = updateWorkflowDataOnApproverRemoval({ approvalWorkflows, @@ -194,18 +197,18 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM ownerDetails, }); - for (const workflow of updatedWorkflows) { - if (workflow?.removeApprovalWorkflow) { - const {removeApprovalWorkflow, ...updatedWorkflow} = workflow; + // eslint-disable-next-line @typescript-eslint/no-deprecated + InteractionManager.runAfterInteractions(() => { + for (const workflow of updatedWorkflows) { + if (workflow?.removeApprovalWorkflow) { + const {removeApprovalWorkflow, ...updatedWorkflow} = workflow; - removeApprovalWorkflowAction(updatedWorkflow, policy); - } else { - updateApprovalWorkflow(workflow, [], [], policy); + removeApprovalWorkflowAction(updatedWorkflow, policy); + } else { + updateApprovalWorkflow(workflow, [], [], policy); + } } - } - - // Remove the member and close the modal - removeMemberAndCloseModal(); + }); }; const showRemoveMemberModal = async () => {