diff --git a/src/languages/en.ts b/src/languages/en.ts index 4b7f87af8cd2..49a62ecf4d63 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -4633,6 +4633,7 @@ const translations = { personalMessagePrompt: 'Message', genericFailureMessage: 'An error occurred while inviting the member to the workspace. Please try again.', inviteNoMembersError: 'Please select at least one member to invite', + joinRequest: ({user, workspaceName}: {user: string; workspaceName: string}) => `${user} requested to join ${workspaceName}`, }, distanceRates: { oopsNotSoFast: 'Oops! Not so fast...', diff --git a/src/languages/es.ts b/src/languages/es.ts index 5ee41dd924b9..390cfe8a289d 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -4679,6 +4679,7 @@ const translations = { personalMessagePrompt: 'Mensaje', inviteNoMembersError: 'Por favor, selecciona al menos un miembro a invitar.', genericFailureMessage: 'Se ha producido un error al invitar al miembro al espacio de trabajo. Por favor, vuelva a intentarlo.', + joinRequest: ({user, workspaceName}: {user: string; workspaceName: string}) => `${user} solicitó unirse al espacio de trabajo ${workspaceName}`, }, distanceRates: { oopsNotSoFast: 'Ups! No tan rápido...', diff --git a/src/libs/OptionsListUtils.ts b/src/libs/OptionsListUtils.ts index 5ab755c73bd6..8228c5443bfa 100644 --- a/src/libs/OptionsListUtils.ts +++ b/src/libs/OptionsListUtils.ts @@ -50,6 +50,7 @@ import { getCombinedReportActions, getExportIntegrationLastMessageText, getIOUReportIDFromReportActionPreview, + getJoinRequestMessage, getLeaveRoomMessage, getMentionedAccountIDsFromAction, getMessageOfOldDotReportAction, @@ -61,6 +62,7 @@ import { getSortedReportActions, getUpdateRoomDescriptionMessage, isActionableAddPaymentCard, + isActionableJoinRequest, isActionOfType, isClosedAction, isCreatedTaskReportAction, @@ -813,11 +815,12 @@ function getLastMessageTextForReport( lastMessageTextFromReport = getExportIntegrationLastMessageText(lastReportAction); } else if (lastReportAction?.actionName && isOldDotReportAction(lastReportAction)) { lastMessageTextFromReport = getMessageOfOldDotReportAction(lastReportAction, false); + } else if (isActionableJoinRequest(lastReportAction)) { + lastMessageTextFromReport = getJoinRequestMessage(lastReportAction); } else if (lastReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.LEAVE_ROOM) { lastMessageTextFromReport = getLeaveRoomMessage(); } else if (lastReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.RESOLVED_DUPLICATES) { lastMessageTextFromReport = translateLocal('violations.resolvedDuplicates'); - } else if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.ROOM_CHANGE_LOG.UPDATE_ROOM_DESCRIPTION)) { lastMessageTextFromReport = getUpdateRoomDescriptionMessage(lastReportAction); } else if (isActionOfType(lastReportAction, CONST.REPORT.ACTIONS.TYPE.REOPENED)) { lastMessageTextFromReport = getReopenedMessage(); diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 38f51df2113f..57d747a838e1 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -30,7 +30,7 @@ import {formatMessageElementList, translateLocal} from './Localize'; import Log from './Log'; import type {MessageElementBase, MessageTextElement} from './MessageElement'; import Parser from './Parser'; -import {getEffectiveDisplayName, getPersonalDetailsByIDs} from './PersonalDetailsUtils'; +import {getEffectiveDisplayName, getPersonalDetailByEmail, getPersonalDetailsByIDs} from './PersonalDetailsUtils'; import {getPolicy, isPolicyAdmin as isPolicyAdminPolicyUtils} from './PolicyUtils'; import type {getReportName, OptimisticIOUReportAction, PartialReportAction} from './ReportUtils'; import StringUtils from './StringUtils'; @@ -2306,6 +2306,13 @@ function shouldShowAddMissingDetails(actionName?: ReportActionName, card?: Card) return actionName === CONST.REPORT.ACTIONS.TYPE.CARD_MISSING_ADDRESS && (card?.state === CONST.EXPENSIFY_CARD.STATE.STATE_NOT_ISSUED || missingDetails); } +function getJoinRequestMessage(reportAction: ReportAction) { + const policy = getPolicy(getOriginalMessage(reportAction)?.policyID); + const userDetail = getPersonalDetailByEmail(getOriginalMessage(reportAction)?.email ?? ''); + const userName = userDetail?.firstName ? `${userDetail.displayName} (${userDetail.login})` : userDetail?.login ?? getOriginalMessage(reportAction)?.email; + return translateLocal('workspace.inviteMessage.joinRequest', {user: userName ?? '', workspaceName: policy?.name ?? ''}); +} + function getCardIssuedMessage({ reportAction, shouldRenderHTML = false, @@ -2523,6 +2530,7 @@ export { getReportActionsLength, wasMessageReceivedWhileOffline, shouldShowAddMissingDetails, + getJoinRequestMessage, getWorkspaceCategoryUpdateMessage, getWorkspaceUpdateFieldMessage, getWorkspaceCurrencyUpdateMessage, diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 2c582e6ba802..ff700ff47621 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -139,6 +139,7 @@ import { getDismissedViolationMessageText, getExportIntegrationLastMessageText, getIOUReportIDFromReportActionPreview, + getJoinRequestMessage, getLastClosedReportAction, getLastVisibleAction, getLastVisibleAction as getLastVisibleActionReportActionsUtils, @@ -164,6 +165,7 @@ import { getWorkspaceReportFieldDeleteMessage, getWorkspaceReportFieldUpdateMessage, getWorkspaceUpdateFieldMessage, + isActionableJoinRequest, isActionableJoinRequestPending, isActionableTrackExpense, isActionOfType, @@ -4772,6 +4774,10 @@ function getReportNameInternal({ return getIOUUnapprovedMessage(parentReportAction); } + if (isActionableJoinRequest(parentReportAction)) { + return getJoinRequestMessage(parentReportAction); + } + if (isTaskReport(report) && isCanceledTaskReport(report, parentReportAction)) { return translateLocal('parentReportAction.deletedTask'); } diff --git a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx index 2ed031fc8f6a..e738c4100edd 100644 --- a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx +++ b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx @@ -26,6 +26,7 @@ import { getCardIssuedMessage, getExportIntegrationMessageHTML, getIOUReportIDFromReportActionPreview, + getJoinRequestMessage, getMemberChangeMessageFragment, getMessageOfOldDotReportAction, getOriginalMessage, @@ -51,6 +52,7 @@ import { getWorkspaceReportFieldUpdateMessage, getWorkspaceTagUpdateMessage, getWorkspaceUpdateFieldMessage, + isActionableJoinRequest, isActionableMentionWhisper, isActionableTrackExpense, isActionOfType, @@ -625,6 +627,9 @@ const ContextMenuActions: ContextMenuAction[] = [ setClipboardMessage(getCardIssuedMessage({reportAction, shouldRenderHTML: true, policyID: report?.policyID, card})); } else if (isActionOfType(reportAction, CONST.REPORT.ACTIONS.TYPE.POLICY_CHANGE_LOG.DELETE_INTEGRATION)) { setClipboardMessage(getRemovedConnectionMessage(reportAction)); + } else if (isActionableJoinRequest(reportAction)) { + const displayMessage = getJoinRequestMessage(reportAction); + Clipboard.setString(displayMessage); } else if (content) { setClipboardMessage( content.replace(/()(.*?)(<\/mention-user>)/gi, (match, openTag: string, innerContent: string, closeTag: string): string => { diff --git a/src/pages/home/report/PureReportActionItem.tsx b/src/pages/home/report/PureReportActionItem.tsx index 093ed7cde35e..d83f36503b49 100644 --- a/src/pages/home/report/PureReportActionItem.tsx +++ b/src/pages/home/report/PureReportActionItem.tsx @@ -61,6 +61,7 @@ import { getDemotedFromWorkspaceMessage, getDismissedViolationMessageText, getIOUReportIDFromReportActionPreview, + getJoinRequestMessage, getOriginalMessage, getPolicyChangeLogAddEmployeeMessage, getPolicyChangeLogDefaultBillableMessage, @@ -1085,6 +1086,19 @@ function PureReportActionItem({ children = ; } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.REMOVED_FROM_APPROVAL_CHAIN)) { children = ; + } else if (isActionableJoinRequest(action)) { + children = ( + + + {actionableItemButtons.length > 0 && ( + + )} + + ); } else if (isActionOfType(action, CONST.REPORT.ACTIONS.TYPE.DEMOTED_FROM_WORKSPACE)) { children = ; } else if ( diff --git a/src/types/onyx/OriginalMessage.ts b/src/types/onyx/OriginalMessage.ts index f5b49d251579..223a5ef47453 100644 --- a/src/types/onyx/OriginalMessage.ts +++ b/src/types/onyx/OriginalMessage.ts @@ -411,6 +411,9 @@ type OriginalMessageJoinPolicy = { /** AccountID for the user requesting to join the policy */ accountID?: number; + + /** Email of the requested user */ + email?: string; }; /** Model of `modified expense` report action */