Skip to content

Commit 4c7c3d4

Browse files
authored
Merge pull request Expensify#71280 from parasharrajat/revert-70755-revert-69844-parasharrajat/member
Trigger whisper when user invites a member to the chat
2 parents 94bc056 + 3747ae5 commit 4c7c3d4

4 files changed

Lines changed: 37 additions & 8 deletions

File tree

src/libs/ReportActionsUtils.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3331,6 +3331,12 @@ function getSubmittedTo(action: OnyxEntry<ReportAction>): string | undefined {
33313331
return getOriginalMessage(action)?.to;
33323332
}
33333333

3334+
function isSystemUserMentioned(action: OnyxInputOrEntry<ReportAction<typeof CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_MENTION_WHISPER>>): boolean {
3335+
const mentionedUsers = getOriginalMessage(action)?.inviteeAccountIDs;
3336+
const systemAccountIDs = new Set(Object.values(CONST.ACCOUNT_ID));
3337+
return mentionedUsers?.some((accountID) => systemAccountIDs.has(accountID)) ?? false;
3338+
}
3339+
33343340
export {
33353341
doesReportHaveVisibleActions,
33363342
extractLinksFromMessageHtml,
@@ -3511,6 +3517,7 @@ export {
35113517
isPendingHide,
35123518
filterOutDeprecatedReportActions,
35133519
getActionableCardFraudAlertMessage,
3520+
isSystemUserMentioned,
35143521
};
35153522

35163523
export type {LastVisibleMessage};

src/libs/actions/Report.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3853,6 +3853,13 @@ function inviteToRoom(reportID: string, inviteeEmailsToAccountIDs: InvitedEmails
38533853
API.write(WRITE_COMMANDS.INVITE_TO_ROOM, parameters, {optimisticData, successData, failureData});
38543854
}
38553855

3856+
/** Invites people to a room via concierge whisper */
3857+
function inviteToRoomAction(reportID: string, ancestors: Ancestor[], inviteeEmailsToAccountIDs: InvitedEmailsToAccountIDs, timezoneParam: Timezone) {
3858+
const inviteeEmails = Object.keys(inviteeEmailsToAccountIDs);
3859+
3860+
addComment(reportID, reportID, ancestors, inviteeEmails.map((login) => `@${login}`).join(' '), timezoneParam, false);
3861+
}
3862+
38563863
function clearAddRoomMemberError(reportID: string, invitedAccountID: string) {
38573864
const reportMetadata = getReportMetadata(reportID);
38583865
Onyx.merge(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, {
@@ -6082,6 +6089,7 @@ export {
60826089
inviteToGroupChat,
60836090
buildInviteToRoomOnyxData,
60846091
inviteToRoom,
6092+
inviteToRoomAction,
60856093
joinRoom,
60866094
leaveGroupChat,
60876095
leaveRoom,

src/pages/RoomInvitePage.tsx

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ import InviteMemberListItem from '@components/SelectionListWithSections/InviteMe
1212
import type {Section} from '@components/SelectionListWithSections/types';
1313
import withNavigationTransitionEnd from '@components/withNavigationTransitionEnd';
1414
import type {WithNavigationTransitionEndProps} from '@components/withNavigationTransitionEnd';
15+
import useAncestors from '@hooks/useAncestors';
16+
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
1517
import useDebouncedState from '@hooks/useDebouncedState';
1618
import useLocalize from '@hooks/useLocalize';
1719
import useOnyx from '@hooks/useOnyx';
1820
import useReportIsArchived from '@hooks/useReportIsArchived';
1921
import useThemeStyles from '@hooks/useThemeStyles';
20-
import {inviteToRoom, searchInServer} from '@libs/actions/Report';
22+
import {inviteToRoomAction, searchInServer} from '@libs/actions/Report';
2123
import {clearUserSearchPhrase, updateUserSearchPhrase} from '@libs/actions/RoomMembersUserSearchPhrase';
2224
import {READ_COMMANDS} from '@libs/API/types';
2325
import {canUseTouchScreen} from '@libs/DeviceCapabilities';
@@ -55,13 +57,14 @@ function RoomInvitePage({
5557
},
5658
}: RoomInvitePageProps) {
5759
const styles = useThemeStyles();
58-
const {translate, formatPhoneNumber} = useLocalize();
60+
const {translate} = useLocalize();
5961
const [userSearchPhrase] = useOnyx(ONYXKEYS.ROOM_MEMBERS_USER_SEARCH_PHRASE, {canBeMissing: true});
6062
const [countryCode = CONST.DEFAULT_COUNTRY_CODE] = useOnyx(ONYXKEYS.COUNTRY_CODE, {canBeMissing: false});
6163
const [searchTerm, debouncedSearchTerm, setSearchTerm] = useDebouncedState(userSearchPhrase ?? '');
6264
const [selectedOptions, setSelectedOptions] = useState<OptionData[]>([]);
6365
const [isSearchingForReports] = useOnyx(ONYXKEYS.IS_SEARCHING_FOR_REPORTS, {initWithStoredValues: false, canBeMissing: true});
6466
const isReportArchived = useReportIsArchived(report.reportID);
67+
const currentUserPersonalDetails = useCurrentUserPersonalDetails();
6568
const [nvpDismissedProductTraining] = useOnyx(ONYXKEYS.NVP_DISMISSED_PRODUCT_TRAINING, {canBeMissing: true});
6669

6770
const {options, areOptionsInitialized} = useOptionsList();
@@ -192,6 +195,9 @@ function RoomInvitePage({
192195
return reportID && (!isPolicyEmployee || isReportArchived ? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(reportID, backTo) : ROUTES.ROOM_MEMBERS.getRoute(reportID, backTo));
193196
}, [isPolicyEmployee, reportID, backTo, isReportArchived]);
194197
const reportName = useMemo(() => getReportName(report), [report]);
198+
199+
const ancestors = useAncestors(report);
200+
195201
const inviteUsers = useCallback(() => {
196202
HttpUtils.cancelPendingRequests(READ_COMMANDS.SEARCH_FOR_REPORTS);
197203

@@ -208,11 +214,15 @@ function RoomInvitePage({
208214
invitedEmailsToAccountIDs[login] = Number(accountID);
209215
}
210216
if (reportID) {
211-
inviteToRoom(reportID, invitedEmailsToAccountIDs, formatPhoneNumber);
217+
inviteToRoomAction(reportID, ancestors, invitedEmailsToAccountIDs, currentUserPersonalDetails.timezone ?? CONST.DEFAULT_TIME_ZONE);
218+
clearUserSearchPhrase();
219+
if (backTo) {
220+
Navigation.goBack(backTo);
221+
} else {
222+
Navigation.goBack(ROUTES.REPORT_WITH_ID.getRoute(reportID));
223+
}
212224
}
213-
clearUserSearchPhrase();
214-
Navigation.goBack(backRoute);
215-
}, [selectedOptions, backRoute, reportID, validate, formatPhoneNumber]);
225+
}, [validate, selectedOptions, ancestors, reportID, currentUserPersonalDetails.timezone, backTo]);
216226

217227
const goBack = useCallback(() => {
218228
Navigation.goBack(backRoute);

src/pages/home/report/PureReportActionItem.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ import {isReportMessageAttachment} from '@libs/isReportMessageAttachment';
5858
import Navigation from '@libs/Navigation/Navigation';
5959
import Permissions from '@libs/Permissions';
6060
import {getDisplayNameOrDefault} from '@libs/PersonalDetailsUtils';
61-
import {getCleanedTagName, getPersonalPolicy, isPolicyAdmin, isPolicyOwner} from '@libs/PolicyUtils';
61+
import {getCleanedTagName, getPersonalPolicy, isPolicyAdmin, isPolicyOwner, isPolicyUser} from '@libs/PolicyUtils';
6262
import {
6363
extractLinksFromMessageHtml,
6464
getActionableCardFraudAlertMessage,
@@ -131,6 +131,7 @@ import {
131131
isRenamedAction,
132132
isResolvedConciergeCategoryOptions,
133133
isSplitBillAction as isSplitBillActionReportActionsUtils,
134+
isSystemUserMentioned,
134135
isTagModificationAction,
135136
isTaskAction,
136137
isTrackExpenseAction as isTrackExpenseActionReportActionsUtils,
@@ -905,7 +906,10 @@ function PureReportActionItem({
905906
const actionableMentionWhisperOptions = [];
906907
const isReportInPolicy = !!report?.policyID && report.policyID !== CONST.POLICY.ID_FAKE && getPersonalPolicy()?.id !== report.policyID;
907908

908-
if (isReportInPolicy && (isPolicyAdmin(policy) || isPolicyOwner(policy, currentUserAccountID))) {
909+
// Show the invite to submit expense button even if one of the mentioned users is a not a policy member
910+
const hasMentionedPolicyMembers = getOriginalMessage(action)?.inviteeEmails?.every((login) => isPolicyUser(policy, login)) ?? false;
911+
912+
if ((isPolicyAdmin(policy) || isPolicyOwner(policy, currentUserAccountID)) && isReportInPolicy && !isSystemUserMentioned(action) && !hasMentionedPolicyMembers) {
909913
actionableMentionWhisperOptions.push({
910914
text: 'actionableMentionWhisperOptions.inviteToSubmitExpense',
911915
key: `${action.reportActionID}-actionableMentionWhisper-${CONST.REPORT.ACTIONABLE_MENTION_WHISPER_RESOLUTION.INVITE_TO_SUBMIT_EXPENSE}`,

0 commit comments

Comments
 (0)