Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Plural Remove Members on the workspace when we only have one #50488

Merged
merged 3 commits into from
Oct 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3364,10 +3364,16 @@ const translations = {
},
people: {
genericFailureMessage: 'An error occurred removing a user from the workspace, please try again.',
removeMembersPrompt: 'Are you sure you want to remove these members?',
removeMembersPrompt: ({memberName}: {memberName: string}) => ({
one: `Are you sure you want to remove ${memberName}?`,
other: 'Are you sure you want to remove these members?',
}),
removeMembersWarningPrompt: ({memberName, ownerName}: RemoveMembersWarningPrompt) =>
`${memberName} is an approver in this workspace. When you unshare this workspace with them, we’ll replace them in the approval workflow with the workspace owner, ${ownerName}`,
removeMembersTitle: 'Remove members',
removeMembersTitle: () => ({
one: 'Remove member',
other: 'Remove members',
}),
removeWorkspaceMemberButtonTitle: 'Remove from workspace',
removeGroupMemberButtonTitle: 'Remove from group',
removeRoomMemberButtonTitle: 'Remove from chat',
Expand Down Expand Up @@ -4054,7 +4060,10 @@ const translations = {
memberNotFound: 'Member not found.',
useInviteButton: 'To invite a new member to the chat, please use the invite button above.',
notAuthorized: `You don't have access to this page. If you're trying to join this room, just ask a room member to add you. Something else? Reach out to ${CONST.EMAIL.CONCIERGE}`,
removeMembersPrompt: 'Are you sure you want to remove the selected members from the room?',
removeMembersPrompt: ({memberName}: {memberName: string}) => ({
one: `Are you sure you want to remove ${memberName} from the room?`,
other: 'Are you sure you want to remove the selected members from the room?',
}),
error: {
genericAdd: 'There was a problem adding this room member.',
},
Expand Down
15 changes: 12 additions & 3 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3405,10 +3405,16 @@ const translations = {
},
people: {
genericFailureMessage: 'Se ha producido un error al intentar eliminar a un miembro del espacio de trabajo. Por favor, inténtalo más tarde.',
removeMembersPrompt: '¿Estás seguro de que deseas eliminar a estos miembros?',
removeMembersPrompt: ({memberName}: {memberName: string}) => ({
one: `¿Estás seguro de que deseas eliminar ${memberName}`,
other: '¿Estás seguro de que deseas eliminar a estos miembros?',
}),
removeMembersWarningPrompt: ({memberName, ownerName}: RemoveMembersWarningPrompt) =>
`${memberName} es un aprobador en este espacio de trabajo. Cuando lo elimine de este espacio de trabajo, los sustituiremos en el flujo de trabajo de aprobación por el propietario del espacio de trabajo, ${ownerName}`,
removeMembersTitle: 'Eliminar miembros',
removeMembersTitle: () => ({
one: 'Eliminar miembro',
other: 'Eliminar miembros',
}),
removeWorkspaceMemberButtonTitle: 'Eliminar del espacio de trabajo',
removeGroupMemberButtonTitle: 'Eliminar del grupo',
removeRoomMemberButtonTitle: 'Eliminar del chat',
Expand Down Expand Up @@ -4099,7 +4105,10 @@ const translations = {
memberNotFound: 'Miembro no encontrado.',
useInviteButton: 'Para invitar a un nuevo miembro al chat, por favor, utiliza el botón invitar que está más arriba.',
notAuthorized: `No tienes acceso a esta página. Si estás intentando unirte a esta sala, pide a un miembro de la sala que te añada. ¿Necesitas algo más? Comunícate con ${CONST.EMAIL.CONCIERGE}`,
removeMembersPrompt: '¿Estás seguro de que quieres eliminar a los miembros seleccionados de la sala de chat?',
removeMembersPrompt: ({memberName}: {memberName: string}) => ({
one: `¿Estás seguro de que quieres eliminar ${memberName} de la sala de chat?`,
other: '¿Estás seguro de que quieres eliminar a los miembros seleccionados de la sala de chat?',
}),
error: {
genericAdd: 'Hubo un problema al añadir este miembro a la sala de chat.',
},
Expand Down
13 changes: 9 additions & 4 deletions src/pages/ReportParticipantsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -209,9 +209,11 @@ function ReportParticipantsPage({report, route}: ReportParticipantsPageProps) {
const accountIDsToRemove = selectedMembers.filter((id) => id !== currentUserAccountID);
Report.removeFromGroupChat(report.reportID, accountIDsToRemove);
setSearchValue('');
UserSearchPhraseActions.clearUserSearchPhrase();
setSelectedMembers([]);
setRemoveMembersConfirmModalVisible(false);
InteractionManager.runAfterInteractions(() => {
UserSearchPhraseActions.clearUserSearchPhrase();
});
};

const changeUserRole = useCallback(
Expand Down Expand Up @@ -266,7 +268,7 @@ function ReportParticipantsPage({report, route}: ReportParticipantsPageProps) {
const bulkActionsButtonOptions = useMemo(() => {
const options: Array<DropdownOption<WorkspaceMemberBulkActionType>> = [
{
text: translate('workspace.people.removeMembersTitle'),
text: translate('workspace.people.removeMembersTitle', {count: selectedMembers.length}),
value: CONST.POLICY.MEMBERS_BULK_ACTION_TYPES.REMOVE,
icon: Expensicons.RemoveMembers,
onSelected: () => setRemoveMembersConfirmModalVisible(true),
Expand Down Expand Up @@ -390,11 +392,14 @@ function ReportParticipantsPage({report, route}: ReportParticipantsPageProps) {
<View style={[styles.pl5, styles.pr5]}>{headerButtons}</View>
<ConfirmModal
danger
title={translate('workspace.people.removeMembersTitle')}
title={translate('workspace.people.removeMembersTitle', {count: selectedMembers.length})}
isVisible={removeMembersConfirmModalVisible}
onConfirm={removeUsers}
onCancel={() => setRemoveMembersConfirmModalVisible(false)}
prompt={translate('workspace.people.removeMembersPrompt')}
prompt={translate('workspace.people.removeMembersPrompt', {
count: selectedMembers.length,
memberName: PersonalDetailsUtils.getPersonalDetailsByIDs(selectedMembers, currentUserAccountID).at(0)?.displayName ?? '',
})}
confirmText={translate('common.remove')}
cancelText={translate('common.cancel')}
onModalHide={() => {
Expand Down
36 changes: 17 additions & 19 deletions src/pages/RoomMembersPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@ import type {RouteProp} from '@react-navigation/native';
import {useIsFocused, useRoute} from '@react-navigation/native';
import type {StackScreenProps} from '@react-navigation/stack';
import React, {useCallback, useEffect, useMemo, useState} from 'react';
import {View} from 'react-native';
import {useOnyx, withOnyx} from 'react-native-onyx';
import type {OnyxEntry} from 'react-native-onyx';
import {InteractionManager, View} from 'react-native';
import {useOnyx} from 'react-native-onyx';
import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView';
import Button from '@components/Button';
import ButtonWithDropdownMenu from '@components/ButtonWithDropdownMenu';
Expand Down Expand Up @@ -41,23 +40,17 @@ import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import type SCREENS from '@src/SCREENS';
import type {Session} from '@src/types/onyx';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
import type {WithReportOrNotFoundProps} from './home/report/withReportOrNotFound';
import withReportOrNotFound from './home/report/withReportOrNotFound';

type RoomMembersPageOnyxProps = {
session: OnyxEntry<Session>;
};
type RoomMembersPageProps = WithReportOrNotFoundProps & WithCurrentUserPersonalDetailsProps & StackScreenProps<RoomMembersNavigatorParamList, typeof SCREENS.ROOM_MEMBERS.ROOT>;

type RoomMembersPageProps = WithReportOrNotFoundProps &
WithCurrentUserPersonalDetailsProps &
RoomMembersPageOnyxProps &
StackScreenProps<RoomMembersNavigatorParamList, typeof SCREENS.ROOM_MEMBERS.ROOT>;

function RoomMembersPage({report, session, policies}: RoomMembersPageProps) {
function RoomMembersPage({report, policies}: RoomMembersPageProps) {
const route = useRoute<RouteProp<RoomMembersNavigatorParamList, typeof SCREENS.ROOM_MEMBERS.ROOT>>();
const styles = useThemeStyles();
const [session] = useOnyx(ONYXKEYS.SESSION);
const currentUserAccountID = Number(session?.accountID);
const {formatPhoneNumber, translate} = useLocalize();
const [selectedMembers, setSelectedMembers] = useState<number[]>([]);
const [removeMembersConfirmModalVisible, setRemoveMembersConfirmModalVisible] = useState(false);
Expand Down Expand Up @@ -128,9 +121,11 @@ function RoomMembersPage({report, session, policies}: RoomMembersPageProps) {
Report.removeFromRoom(report.reportID, selectedMembers);
}
setSearchValue('');
UserSearchPhraseActions.clearUserSearchPhrase();
setSelectedMembers([]);
setRemoveMembersConfirmModalVisible(false);
InteractionManager.runAfterInteractions(() => {
UserSearchPhraseActions.clearUserSearchPhrase();
});
};

/**
Expand Down Expand Up @@ -273,14 +268,14 @@ function RoomMembersPage({report, session, policies}: RoomMembersPageProps) {
const bulkActionsButtonOptions = useMemo(() => {
const options: Array<DropdownOption<RoomMemberBulkActionType>> = [
{
text: translate('workspace.people.removeMembersTitle'),
text: translate('workspace.people.removeMembersTitle', {count: selectedMembers.length}),
value: CONST.POLICY.MEMBERS_BULK_ACTION_TYPES.REMOVE,
icon: Expensicons.RemoveMembers,
onSelected: () => setRemoveMembersConfirmModalVisible(true),
},
];
return options;
}, [translate, setRemoveMembersConfirmModalVisible]);
}, [translate, selectedMembers.length]);

const headerButtons = useMemo(() => {
return (
Expand Down Expand Up @@ -368,11 +363,14 @@ function RoomMembersPage({report, session, policies}: RoomMembersPageProps) {
<View style={[styles.pl5, styles.pr5]}>{headerButtons}</View>
<ConfirmModal
danger
title={translate('workspace.people.removeMembersTitle')}
title={translate('workspace.people.removeMembersTitle', {count: selectedMembers.length})}
isVisible={removeMembersConfirmModalVisible}
onConfirm={removeUsers}
onCancel={() => setRemoveMembersConfirmModalVisible(false)}
prompt={translate('roomMembersPage.removeMembersPrompt')}
prompt={translate('roomMembersPage.removeMembersPrompt', {
count: selectedMembers.length,
memberName: PersonalDetailsUtils.getPersonalDetailsByIDs(selectedMembers, currentUserAccountID).at(0)?.displayName ?? '',
})}
confirmText={translate('common.remove')}
cancelText={translate('common.cancel')}
/>
Expand Down Expand Up @@ -409,4 +407,4 @@ function RoomMembersPage({report, session, policies}: RoomMembersPageProps) {

RoomMembersPage.displayName = 'RoomMembersPage';

export default withReportOrNotFound()(withCurrentUserPersonalDetails(withOnyx<RoomMembersPageProps, RoomMembersPageOnyxProps>({session: {key: ONYXKEYS.SESSION}})(RoomMembersPage)));
export default withReportOrNotFound()(withCurrentUserPersonalDetails(RoomMembersPage));
17 changes: 11 additions & 6 deletions src/pages/workspace/WorkspaceMembersPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ function WorkspaceMembersPage({personalDetails, route, policy, currentUserPerson
const [invitedEmailsToAccountIDsDraft] = useOnyx(`${ONYXKEYS.COLLECTION.WORKSPACE_INVITE_MEMBERS_DRAFT}${route.params.policyID.toString()}`);
const {selectionMode} = useMobileSelectionMode();
const [session] = useOnyx(ONYXKEYS.SESSION);
const currentUserAccountID = Number(session?.accountID);
const selectionListRef = useRef<SelectionListHandle>(null);
const isFocused = useIsFocused();
const policyID = route.params.policyID;
Expand All @@ -102,13 +103,16 @@ function WorkspaceMembersPage({personalDetails, route, policy, currentUserPerson
const confirmModalPrompt = useMemo(() => {
const approverAccountID = selectedEmployees.find((selectedEmployee) => Member.isApprover(policy, selectedEmployee));
if (!approverAccountID) {
return translate('workspace.people.removeMembersPrompt');
return translate('workspace.people.removeMembersPrompt', {
count: selectedEmployees.length,
memberName: PersonalDetailsUtils.getPersonalDetailsByIDs(selectedEmployees, currentUserAccountID).at(0)?.displayName ?? '',
});
}
return translate('workspace.people.removeMembersWarningPrompt', {
memberName: getDisplayNameForParticipant(approverAccountID),
ownerName: getDisplayNameForParticipant(policy?.ownerAccountID),
});
}, [selectedEmployees, policy, translate]);
}, [selectedEmployees, translate, policy, currentUserAccountID]);
/**
* Get filtered personalDetails list with current employeeList
*/
Expand Down Expand Up @@ -206,10 +210,11 @@ function WorkspaceMembersPage({personalDetails, route, policy, currentUserPerson

// Remove the admin from the list
const accountIDsToRemove = session?.accountID ? selectedEmployees.filter((id) => id !== session.accountID) : selectedEmployees;

Member.removeMembers(accountIDsToRemove, route.params.policyID);
setSelectedEmployees([]);
setRemoveMembersConfirmModalVisible(false);
InteractionManager.runAfterInteractions(() => {
Member.removeMembers(accountIDsToRemove, route.params.policyID);
});
};

/**
Expand Down Expand Up @@ -477,7 +482,7 @@ function WorkspaceMembersPage({personalDetails, route, policy, currentUserPerson
const getBulkActionsButtonOptions = () => {
const options: Array<DropdownOption<WorkspaceMemberBulkActionType>> = [
{
text: translate('workspace.people.removeMembersTitle'),
text: translate('workspace.people.removeMembersTitle', {count: selectedEmployees.length}),
value: CONST.POLICY.MEMBERS_BULK_ACTION_TYPES.REMOVE,
icon: Expensicons.RemoveMembers,
onSelected: askForConfirmationToRemove,
Expand Down Expand Up @@ -637,7 +642,7 @@ function WorkspaceMembersPage({personalDetails, route, policy, currentUserPerson

<ConfirmModal
danger
title={translate('workspace.people.removeMembersTitle')}
title={translate('workspace.people.removeMembersTitle', {count: selectedEmployees.length})}
isVisible={removeMembersConfirmModalVisible}
onConfirm={removeUsers}
onCancel={() => setRemoveMembersConfirmModalVisible(false)}
Expand Down
Loading