From da7ce2271f50dbb35e914f797e695c116f81e2c9 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Fri, 21 Mar 2025 17:42:09 +0700 Subject: [PATCH 1/7] fix: the system message when someone requests to join a workspace --- src/languages/en.ts | 1 + src/languages/es.ts | 1 + src/libs/ReportActionsUtils.ts | 10 +++++++++- .../home/report/ContextMenu/ContextMenuActions.tsx | 5 +++++ src/pages/home/report/PureReportActionItem.tsx | 13 +++++++++++++ src/types/onyx/OriginalMessage.ts | 3 +++ 6 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/languages/en.ts b/src/languages/en.ts index f3fbc3d79462..45e8c8c23cb3 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -4466,6 +4466,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 0ca9d49648f9..84e2a17dd27f 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -4511,6 +4511,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}: {user: string}) => `${user} solicitó unirse al espacio de trabajo`, }, distanceRates: { oopsNotSoFast: 'Ups! No tan rápido...', diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index d884b38b8fbd..e955f9f0ccb6 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -29,7 +29,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'; @@ -2200,6 +2200,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, @@ -2399,6 +2406,7 @@ export { getReportActionsLength, wasActionCreatedWhileOffline, shouldShowAddMissingDetails, + getJoinRequestMessage, getWorkspaceCategoryUpdateMessage, getWorkspaceUpdateFieldMessage, getWorkspaceNameUpdatedMessage, diff --git a/src/pages/home/report/ContextMenu/ContextMenuActions.tsx b/src/pages/home/report/ContextMenu/ContextMenuActions.tsx index 4735921d1425..b9caa102da86 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, @@ -50,6 +51,7 @@ import { getWorkspaceReportFieldUpdateMessage, getWorkspaceTagUpdateMessage, getWorkspaceUpdateFieldMessage, + isActionableJoinRequest, isActionableMentionWhisper, isActionableTrackExpense, isActionOfType, @@ -601,6 +603,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 8af36856e452..df48407b982b 100644 --- a/src/pages/home/report/PureReportActionItem.tsx +++ b/src/pages/home/report/PureReportActionItem.tsx @@ -53,6 +53,7 @@ import { getDemotedFromWorkspaceMessage, getDismissedViolationMessageText, getIOUReportIDFromReportActionPreview, + getJoinRequestMessage, getOriginalMessage, getPolicyChangeLogAddEmployeeMessage, getPolicyChangeLogChangeRoleMessage, @@ -932,6 +933,18 @@ 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 29f49f9e7a0b..6e43ba276d0d 100644 --- a/src/types/onyx/OriginalMessage.ts +++ b/src/types/onyx/OriginalMessage.ts @@ -416,6 +416,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 */ From 866180ab3601e59559f53ad56adade694e958da1 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Tue, 25 Mar 2025 23:41:08 +0700 Subject: [PATCH 2/7] add missing case --- src/libs/OptionsListUtils.ts | 4 ++++ src/libs/ReportUtils.ts | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/src/libs/OptionsListUtils.ts b/src/libs/OptionsListUtils.ts index 9f5b061cba41..ee8cc25d28f6 100644 --- a/src/libs/OptionsListUtils.ts +++ b/src/libs/OptionsListUtils.ts @@ -47,12 +47,14 @@ import { getCombinedReportActions, getExportIntegrationLastMessageText, getIOUReportIDFromReportActionPreview, + getJoinRequestMessage, getMessageOfOldDotReportAction, getOneTransactionThreadReportID, getOriginalMessage, getReportActionMessageText, getSortedReportActions, isActionableAddPaymentCard, + isActionableJoinRequest, isActionOfType, isClosedAction, isCreatedTaskReportAction, @@ -755,6 +757,8 @@ function getLastMessageTextForReport(report: OnyxEntry, lastActorDetails lastMessageTextFromReport = getExportIntegrationLastMessageText(lastReportAction); } else if (lastReportAction?.actionName && isOldDotReportAction(lastReportAction)) { lastMessageTextFromReport = getMessageOfOldDotReportAction(lastReportAction, false); + } else if (isActionableJoinRequest(lastReportAction)) { + lastMessageTextFromReport = getJoinRequestMessage(lastReportAction); } // we do not want to show report closed in LHN for non archived report so use getReportLastMessage as fallback instead of lastMessageText from report diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 9a4c8d6cb581..8c154cc73338 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -120,6 +120,7 @@ import { getDismissedViolationMessageText, getExportIntegrationLastMessageText, getIOUReportIDFromReportActionPreview, + getJoinRequestMessage, getLastClosedReportAction, getLastVisibleAction as getLastVisibleActionReportActionsUtils, getLastVisibleMessage as getLastVisibleMessageReportActionsUtils, @@ -132,6 +133,7 @@ import { getReportActionMessage as getReportActionMessageReportUtils, getReportActionMessageText, getReportActionText, + isActionableJoinRequest, isActionableJoinRequestPending, isActionableTrackExpense, isActionOfType, @@ -4562,6 +4564,10 @@ function getReportNameInternal({ return getIOUUnapprovedMessage(parentReportAction); } + if (isActionableJoinRequest(parentReportAction)) { + return getJoinRequestMessage(parentReportAction); + } + if (isTaskReport(report) && isCanceledTaskReport(report, parentReportAction)) { return translateLocal('parentReportAction.deletedTask'); } From 60458998694609924e4f15d516008b2a8ae482df Mon Sep 17 00:00:00 2001 From: nkdengineer <161821005+nkdengineer@users.noreply.github.com> Date: Fri, 28 Mar 2025 15:09:18 +0700 Subject: [PATCH 3/7] Update src/libs/ReportActionsUtils.ts Co-authored-by: Vinh Hoang --- src/libs/ReportActionsUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 9313f7dfdbe6..dfeaf1532cba 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -2203,7 +2203,7 @@ function shouldShowAddMissingDetails(actionName?: ReportActionName, card?: Card) 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; + const userName = userDetail?.displayName ? `${userDetail.displayName} (${userDetail.login})` : userDetail?.login ?? getOriginalMessage(reportAction)?.email; return translateLocal('workspace.inviteMessage.joinRequest', {user: userName ?? '', workspaceName: policy?.name ?? ''}); } From b4bc3d922176849f8797da91c03576b5bcf9f61d Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Tue, 1 Apr 2025 22:47:38 +0700 Subject: [PATCH 4/7] use firstName to check --- src/libs/ReportActionsUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/ReportActionsUtils.ts b/src/libs/ReportActionsUtils.ts index 089ab92f7c08..e3f07cb0a86b 100644 --- a/src/libs/ReportActionsUtils.ts +++ b/src/libs/ReportActionsUtils.ts @@ -2209,7 +2209,7 @@ function shouldShowAddMissingDetails(actionName?: ReportActionName, card?: Card) function getJoinRequestMessage(reportAction: ReportAction) { const policy = getPolicy(getOriginalMessage(reportAction)?.policyID); const userDetail = getPersonalDetailByEmail(getOriginalMessage(reportAction)?.email ?? ''); - const userName = userDetail?.displayName ? `${userDetail.displayName} (${userDetail.login})` : userDetail?.login ?? 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 ?? ''}); } From a6666345e5622618f490c18abcac237eff880a21 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Tue, 6 May 2025 11:08:17 +0700 Subject: [PATCH 5/7] add shouldUseLocalization --- src/pages/home/report/PureReportActionItem.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/home/report/PureReportActionItem.tsx b/src/pages/home/report/PureReportActionItem.tsx index 60c6d9edc5eb..8d47295649c8 100644 --- a/src/pages/home/report/PureReportActionItem.tsx +++ b/src/pages/home/report/PureReportActionItem.tsx @@ -1086,6 +1086,7 @@ function PureReportActionItem({ {actionableItemButtons.length > 0 && ( )} From 8ae2e399c51e220e0ba4cecac09b9ac94a2445af Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Tue, 13 May 2025 10:24:00 +0700 Subject: [PATCH 6/7] fix es translation --- src/languages/es.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/es.ts b/src/languages/es.ts index cd0d6bdbe04a..04e778b5860f 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -4679,7 +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}: {user: string}) => `${user} solicitó unirse al espacio de trabajo`, + joinRequest: ({user, workspaceName}: {user: string, workspaceName: string}) => `${user} solicitó unirse al espacio de trabajo ${workspaceName}`, }, distanceRates: { oopsNotSoFast: 'Ups! No tan rápido...', From ad44db85433a1fbbf7548e93b8c8b044bb494717 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Tue, 13 May 2025 21:53:40 +0700 Subject: [PATCH 7/7] fix prettier --- src/languages/es.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/languages/es.ts b/src/languages/es.ts index 04e778b5860f..390cfe8a289d 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -4679,7 +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}`, + joinRequest: ({user, workspaceName}: {user: string; workspaceName: string}) => `${user} solicitó unirse al espacio de trabajo ${workspaceName}`, }, distanceRates: { oopsNotSoFast: 'Ups! No tan rápido...',