Skip to content

Commit

Permalink
Merge pull request #43066 from Expensify/dangrous-membersutils
Browse files Browse the repository at this point in the history
Create Member.ts utils file
  • Loading branch information
luacmartins authored Jun 6, 2024
2 parents d7e1ecf + 06487a3 commit 54210a8
Show file tree
Hide file tree
Showing 13 changed files with 849 additions and 776 deletions.
809 changes: 809 additions & 0 deletions src/libs/actions/Policy/Member.ts

Large diffs are not rendered by default.

748 changes: 4 additions & 744 deletions src/libs/actions/Policy/Policy.ts

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions src/pages/home/report/ReportActionItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ import * as TransactionUtils from '@libs/TransactionUtils';
import {ReactionListContext} from '@pages/home/ReportScreenContext';
import * as BankAccounts from '@userActions/BankAccounts';
import * as EmojiPickerAction from '@userActions/EmojiPickerAction';
import * as Policy from '@userActions/Policy/Policy';
import * as Member from '@userActions/Policy/Member';
import * as Report from '@userActions/Report';
import * as ReportActions from '@userActions/ReportActions';
import * as Session from '@userActions/Session';
Expand Down Expand Up @@ -445,13 +445,13 @@ function ReportActionItem({
{
text: 'actionableMentionJoinWorkspaceOptions.accept',
key: `${action.reportActionID}-actionableMentionJoinWorkspace-${CONST.REPORT.ACTIONABLE_MENTION_JOIN_WORKSPACE_RESOLUTION.ACCEPT}`,
onPress: () => Policy.acceptJoinRequest(report.reportID, action),
onPress: () => Member.acceptJoinRequest(report.reportID, action),
isPrimary: true,
},
{
text: 'actionableMentionJoinWorkspaceOptions.decline',
key: `${action.reportActionID}-actionableMentionJoinWorkspace-${CONST.REPORT.ACTIONABLE_MENTION_JOIN_WORKSPACE_RESOLUTION.DECLINE}`,
onPress: () => Policy.declineJoinRequest(report.reportID, action),
onPress: () => Member.declineJoinRequest(report.reportID, action),
},
];
}
Expand Down
3 changes: 2 additions & 1 deletion src/pages/workspace/WorkspaceInviteMessagePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import updateMultilineInputRange from '@libs/updateMultilineInputRange';
import type {SettingsNavigatorParamList} from '@navigation/types';
import variables from '@styles/variables';
import * as Link from '@userActions/Link';
import * as Member from '@userActions/Policy/Member';
import * as Policy from '@userActions/Policy/Policy';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
Expand Down Expand Up @@ -108,7 +109,7 @@ function WorkspaceInviteMessagePage({
const sendInvitation = () => {
Keyboard.dismiss();
// Please see https://github.com/Expensify/App/blob/main/README.md#Security for more details
Policy.addMembersToWorkspace(invitedEmailsToAccountIDsDraft ?? {}, `${welcomeNoteSubject}\n\n${welcomeNote}`, route.params.policyID);
Member.addMembersToWorkspace(invitedEmailsToAccountIDsDraft ?? {}, `${welcomeNoteSubject}\n\n${welcomeNote}`, route.params.policyID);
debouncedSaveDraft(null);
SearchInputManager.searchInput = '';
// Pop the invite message page before navigating to the members page.
Expand Down
5 changes: 3 additions & 2 deletions src/pages/workspace/WorkspaceInvitePage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import * as PhoneNumber from '@libs/PhoneNumber';
import * as PolicyUtils from '@libs/PolicyUtils';
import type {OptionData} from '@libs/ReportUtils';
import type {SettingsNavigatorParamList} from '@navigation/types';
import * as Member from '@userActions/Policy/Member';
import * as Policy from '@userActions/Policy/Policy';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
Expand Down Expand Up @@ -78,7 +79,7 @@ function WorkspaceInvitePage({route, betas, invitedEmailsToAccountIDsDraft, poli
useEffect(() => {
setSearchTerm(SearchInputManager.searchInput);
return () => {
Policy.setWorkspaceInviteMembersDraft(route.params.policyID, {});
Member.setWorkspaceInviteMembersDraft(route.params.policyID, {});
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [route.params.policyID]);
Expand Down Expand Up @@ -246,7 +247,7 @@ function WorkspaceInvitePage({route, betas, invitedEmailsToAccountIDsDraft, poli
}
invitedEmailsToAccountIDs[login] = Number(accountID);
});
Policy.setWorkspaceInviteMembersDraft(route.params.policyID, invitedEmailsToAccountIDs);
Member.setWorkspaceInviteMembersDraft(route.params.policyID, invitedEmailsToAccountIDs);
Navigation.navigate(ROUTES.WORKSPACE_INVITE_MESSAGE.getRoute(route.params.policyID));
}, [route.params.policyID, selectedOptions]);

Expand Down
4 changes: 2 additions & 2 deletions src/pages/workspace/WorkspaceJoinUserPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import useThemeStyles from '@hooks/useThemeStyles';
import navigateAfterJoinRequest from '@libs/navigateAfterJoinRequest';
import Navigation from '@navigation/Navigation';
import type {AuthScreensParamList} from '@navigation/types';
import * as PolicyAction from '@userActions/Policy/Policy';
import * as MemberAction from '@userActions/Policy/Member';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import type SCREENS from '@src/SCREENS';
Expand Down Expand Up @@ -49,7 +49,7 @@ function WorkspaceJoinUserPage({route, policy}: WorkspaceJoinUserPageProps) {
});
return;
}
PolicyAction.inviteMemberToWorkspace(policyID, inviterEmail);
MemberAction.inviteMemberToWorkspace(policyID, inviterEmail);
isJoinLinkUsed = true;
Navigation.isNavigationReady().then(() => {
if (isUnmounted.current) {
Expand Down
15 changes: 8 additions & 7 deletions src/pages/workspace/WorkspaceMembersPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import type {FullScreenNavigatorParamList} from '@libs/Navigation/types';
import * as OptionsListUtils from '@libs/OptionsListUtils';
import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils';
import * as PolicyUtils from '@libs/PolicyUtils';
import * as Member from '@userActions/Policy/Member';
import * as Policy from '@userActions/Policy/Policy';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
Expand Down Expand Up @@ -109,7 +110,7 @@ function WorkspaceMembersPage({personalDetails, invitedEmailsToAccountIDsDraft,
* Get members for the current workspace
*/
const getWorkspaceMembers = useCallback(() => {
Policy.openWorkspaceMembersPage(route.params.policyID, Object.keys(PolicyUtils.getMemberAccountIDsForWorkspace(policy?.employeeList)));
Member.openWorkspaceMembersPage(route.params.policyID, Object.keys(PolicyUtils.getMemberAccountIDsForWorkspace(policy?.employeeList)));
}, [route.params.policyID, policy?.employeeList]);

/**
Expand Down Expand Up @@ -192,7 +193,7 @@ function WorkspaceMembersPage({personalDetails, invitedEmailsToAccountIDsDraft,
// Remove the admin from the list
const accountIDsToRemove = session?.accountID ? selectedEmployees.filter((id) => id !== session.accountID) : selectedEmployees;

Policy.removeMembers(accountIDsToRemove, route.params.policyID);
Member.removeMembers(accountIDsToRemove, route.params.policyID);
setSelectedEmployees([]);
setRemoveMembersConfirmModalVisible(false);
};
Expand Down Expand Up @@ -272,7 +273,7 @@ function WorkspaceMembersPage({personalDetails, invitedEmailsToAccountIDsDraft,
Navigation.navigate(ROUTES.PROFILE.getRoute(item.accountID));
return;
}
Policy.clearWorkspaceOwnerChangeFlow(policyID);
Member.clearWorkspaceOwnerChangeFlow(policyID);
Navigation.navigate(ROUTES.WORKSPACE_MEMBER_DETAILS.getRoute(route.params.policyID, item.accountID));
},
[isPolicyAdmin, policy, policyID, route.params.policyID],
Expand All @@ -284,9 +285,9 @@ function WorkspaceMembersPage({personalDetails, invitedEmailsToAccountIDsDraft,
const dismissError = useCallback(
(item: MemberOption) => {
if (item.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE) {
Policy.clearDeleteMemberError(route.params.policyID, item.accountID);
Member.clearDeleteMemberError(route.params.policyID, item.accountID);
} else {
Policy.clearAddMemberError(route.params.policyID, item.accountID);
Member.clearAddMemberError(route.params.policyID, item.accountID);
}
},
[route.params.policyID],
Expand Down Expand Up @@ -390,7 +391,7 @@ function WorkspaceMembersPage({personalDetails, invitedEmailsToAccountIDsDraft,
}
const invitedEmails = Object.values(invitedEmailsToAccountIDsDraft).map(String);
selectionListRef.current?.scrollAndHighlightItem?.(invitedEmails, 1500);
Policy.setWorkspaceInviteMembersDraft(route.params.policyID, {});
Member.setWorkspaceInviteMembersDraft(route.params.policyID, {});
}, [invitedEmailsToAccountIDsDraft, route.params.policyID, isFocused, accountIDs, prevAccountIDs]);

const getHeaderMessage = () => {
Expand Down Expand Up @@ -443,7 +444,7 @@ function WorkspaceMembersPage({personalDetails, invitedEmailsToAccountIDsDraft,
return policy?.employeeList?.[email]?.role !== role;
});

Policy.updateWorkspaceMembersRole(route.params.policyID, accountIDsToUpdate, role);
Member.updateWorkspaceMembersRole(route.params.policyID, accountIDsToUpdate, role);
setSelectedEmployees([]);
};

Expand Down
10 changes: 5 additions & 5 deletions src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import NotFoundPage from '@pages/ErrorPage/NotFoundPage';
import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
import type {WithPolicyAndFullscreenLoadingProps} from '@pages/workspace/withPolicyAndFullscreenLoading';
import withPolicyAndFullscreenLoading from '@pages/workspace/withPolicyAndFullscreenLoading';
import * as Policy from '@userActions/Policy/Policy';
import * as Member from '@userActions/Policy/Member';
import CONST from '@src/CONST';
import ROUTES from '@src/ROUTES';
import type SCREENS from '@src/SCREENS';
Expand Down Expand Up @@ -108,7 +108,7 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM
};

const removeUser = useCallback(() => {
Policy.removeMembers([accountID], policyID);
Member.removeMembers([accountID], policyID);
setIsRemoveMemberConfirmModalVisible(false);
}, [accountID, policyID]);

Expand All @@ -123,14 +123,14 @@ function WorkspaceMemberDetailsPage({personalDetails, policy, route}: WorkspaceM
const changeRole = useCallback(
({value}: ListItemType) => {
setIsRoleSelectionModalVisible(false);
Policy.updateWorkspaceMembersRole(policyID, [accountID], value);
Member.updateWorkspaceMembersRole(policyID, [accountID], value);
},
[accountID, policyID],
);

const startChangeOwnershipFlow = useCallback(() => {
Policy.clearWorkspaceOwnerChangeFlow(policyID);
Policy.requestWorkspaceOwnerChange(policyID);
Member.clearWorkspaceOwnerChangeFlow(policyID);
Member.requestWorkspaceOwnerChange(policyID);
Navigation.navigate(ROUTES.WORKSPACE_OWNER_CHANGE_CHECK.getRoute(policyID, accountID, 'amountOwed' as ValueOf<typeof CONST.POLICY.OWNERSHIP_ERRORS>));
}, [accountID, policyID]);

Expand Down
6 changes: 3 additions & 3 deletions src/pages/workspace/members/WorkspaceOwnerChangeCheck.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import useLocalize from '@hooks/useLocalize';
import useThemeStyles from '@hooks/useThemeStyles';
import * as WorkspaceSettingsUtils from '@libs/WorkspacesSettingsUtils';
import Navigation from '@navigation/Navigation';
import * as PolicyActions from '@userActions/Policy/Policy';
import * as MemberActions from '@userActions/Policy/Member';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
Expand Down Expand Up @@ -63,13 +63,13 @@ function WorkspaceOwnerChangeCheck({personalDetails, policy, accountID, error}:
const confirm = useCallback(() => {
if (error === CONST.POLICY.OWNERSHIP_ERRORS.HAS_FAILED_SETTLEMENTS || error === CONST.POLICY.OWNERSHIP_ERRORS.FAILED_TO_CLEAR_BALANCE) {
// cannot transfer ownership if there are failed settlements, or we cannot clear the balance
PolicyActions.clearWorkspaceOwnerChangeFlow(policyID);
MemberActions.clearWorkspaceOwnerChangeFlow(policyID);
Navigation.goBack();
Navigation.navigate(ROUTES.WORKSPACE_MEMBER_DETAILS.getRoute(policyID, accountID));
return;
}

PolicyActions.requestWorkspaceOwnerChange(policyID);
MemberActions.requestWorkspaceOwnerChange(policyID);
}, [accountID, error, policyID]);

return (
Expand Down
4 changes: 2 additions & 2 deletions src/pages/workspace/members/WorkspaceOwnerChangeErrorPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import useThemeStyles from '@hooks/useThemeStyles';
import Navigation from '@navigation/Navigation';
import type {SettingsNavigatorParamList} from '@navigation/types';
import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
import * as PolicyActions from '@userActions/Policy/Policy';
import * as MemberActions from '@userActions/Policy/Member';
import CONST from '@src/CONST';
import ROUTES from '@src/ROUTES';
import type SCREENS from '@src/SCREENS';
Expand All @@ -29,7 +29,7 @@ function WorkspaceOwnerChangeErrorPage({route}: WorkspaceOwnerChangeSuccessPageP
const policyID = route.params.policyID;

const closePage = useCallback(() => {
PolicyActions.clearWorkspaceOwnerChangeFlow(policyID);
MemberActions.clearWorkspaceOwnerChangeFlow(policyID);
Navigation.goBack();
Navigation.navigate(ROUTES.WORKSPACE_MEMBER_DETAILS.getRoute(policyID, accountID));
}, [accountID, policyID]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import useThemeStyles from '@hooks/useThemeStyles';
import Navigation from '@navigation/Navigation';
import type {SettingsNavigatorParamList} from '@navigation/types';
import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
import * as PolicyActions from '@userActions/Policy/Policy';
import * as MemberActions from '@userActions/Policy/Member';
import CONST from '@src/CONST';
import ROUTES from '@src/ROUTES';
import type SCREENS from '@src/SCREENS';
Expand All @@ -24,7 +24,7 @@ function WorkspaceOwnerChangeSuccessPage({route}: WorkspaceOwnerChangeSuccessPag
const policyID = route.params.policyID;

const closePage = useCallback(() => {
PolicyActions.clearWorkspaceOwnerChangeFlow(policyID);
MemberActions.clearWorkspaceOwnerChangeFlow(policyID);
Navigation.goBack();
Navigation.navigate(ROUTES.WORKSPACE_MEMBER_DETAILS.getRoute(policyID, accountID));
}, [accountID, policyID]);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import type {SettingsNavigatorParamList} from '@navigation/types';
import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper';
import withPolicy from '@pages/workspace/withPolicy';
import type {WithPolicyOnyxProps} from '@pages/workspace/withPolicy';
import * as PolicyActions from '@userActions/Policy/Policy';
import * as MemberActions from '@userActions/Policy/Member';
import CONST from '@src/CONST';
import ROUTES from '@src/ROUTES';
import type SCREENS from '@src/SCREENS';
Expand Down Expand Up @@ -62,7 +62,7 @@ function WorkspaceOwnerChangeWrapperPage({route, policy}: WorkspaceOwnerChangeWr
<HeaderWithBackButton
title={translate('workspace.changeOwner.changeOwnerPageTitle')}
onBackButtonPress={() => {
PolicyActions.clearWorkspaceOwnerChangeFlow(policyID);
MemberActions.clearWorkspaceOwnerChangeFlow(policyID);
Navigation.goBack();
Navigation.navigate(ROUTES.WORKSPACE_MEMBER_DETAILS.getRoute(policyID, accountID));
}}
Expand Down
7 changes: 4 additions & 3 deletions tests/actions/PolicyMemberTest.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import Onyx from 'react-native-onyx';
import CONST from '@src/CONST';
import OnyxUpdateManager from '@src/libs/actions/OnyxUpdateManager';
import * as Member from '@src/libs/actions/Policy/Member';
import * as Policy from '@src/libs/actions/Policy/Policy';
import ONYXKEYS from '@src/ONYXKEYS';
import type {Policy as PolicyType, Report, ReportAction} from '@src/types/onyx';
Expand Down Expand Up @@ -47,7 +48,7 @@ describe('actions/PolicyMember', () => {
Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${fakeReport.reportID}`, {
[fakeReportAction.reportActionID]: fakeReportAction,
});
Policy.acceptJoinRequest(fakeReport.reportID, fakeReportAction);
Member.acceptJoinRequest(fakeReport.reportID, fakeReportAction);
await waitForBatchedUpdates();
await new Promise<void>((resolve) => {
const connectionID = Onyx.connect({
Expand Down Expand Up @@ -105,7 +106,7 @@ describe('actions/PolicyMember', () => {
Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${fakePolicy.id}`, fakePolicy);
Onyx.set(`${ONYXKEYS.PERSONAL_DETAILS_LIST}`, {[fakeUser2.accountID]: fakeUser2});
await waitForBatchedUpdates();
Policy.updateWorkspaceMembersRole(fakePolicy.id, [fakeUser2.accountID], CONST.POLICY.ROLE.ADMIN);
Member.updateWorkspaceMembersRole(fakePolicy.id, [fakeUser2.accountID], CONST.POLICY.ROLE.ADMIN);
await waitForBatchedUpdates();
await new Promise<void>((resolve) => {
const connectionID = Onyx.connect({
Expand Down Expand Up @@ -145,7 +146,7 @@ describe('actions/PolicyMember', () => {
mockFetch?.pause?.();
Onyx.set(`${ONYXKEYS.COLLECTION.POLICY}${fakePolicy.id}`, fakePolicy);
Onyx.merge(ONYXKEYS.SESSION, {email: fakeEmail, accountID: fakeAccountID});
Policy.requestWorkspaceOwnerChange(fakePolicy.id);
Member.requestWorkspaceOwnerChange(fakePolicy.id);
await waitForBatchedUpdates();
await new Promise<void>((resolve) => {
const connectionID = Onyx.connect({
Expand Down

0 comments on commit 54210a8

Please sign in to comment.