diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 90a0757b5e85..72bf0a2e8818 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -6941,6 +6941,14 @@ function canJoinChat(report: OnyxInputOrEntry, parentReportAction: OnyxI * Whether the user can leave a report */ function canLeaveChat(report: OnyxEntry, policy: OnyxEntry): boolean { + if (isRootGroupChat(report)) { + return true; + } + + if (isPolicyExpenseChat(report) && !report?.isOwnPolicyExpenseChat && !PolicyUtils.isPolicyAdmin(policy)) { + return true; + } + if (isPublicRoom(report) && SessionUtils.isAnonymousUser()) { return false; } @@ -6950,7 +6958,7 @@ function canLeaveChat(report: OnyxEntry, policy: OnyxEntry): boo } // Anyone viewing these chat types is already a participant and therefore cannot leave - if (isSelfDM(report) || isRootGroupChat(report)) { + if (isSelfDM(report)) { return false; } diff --git a/src/pages/ReportDetailsPage.tsx b/src/pages/ReportDetailsPage.tsx index 284004bc29ca..f66d44ee9a3b 100644 --- a/src/pages/ReportDetailsPage.tsx +++ b/src/pages/ReportDetailsPage.tsx @@ -133,6 +133,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD const chatRoomSubtitle = useMemo(() => ReportUtils.getChatRoomSubtitle(report), [report, policy]); const isSystemChat = useMemo(() => ReportUtils.isSystemChat(report), [report]); const isGroupChat = useMemo(() => ReportUtils.isGroupChat(report), [report]); + const isRootGroupChat = useMemo(() => ReportUtils.isRootGroupChat(report), [report]); const isThread = useMemo(() => ReportUtils.isThread(report), [report]); const participants = useMemo(() => { const shouldExcludeHiddenParticipants = !isGroupChat && !isSystemChat; @@ -217,13 +218,13 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD const leaveChat = useCallback(() => { Navigation.dismissModal(); - if (isChatRoom) { - const isWorkspaceMemberLeavingWorkspaceRoom = (report.visibility === CONST.REPORT.VISIBILITY.RESTRICTED || isPolicyExpenseChat) && isPolicyEmployee; - Report.leaveRoom(report.reportID, isWorkspaceMemberLeavingWorkspaceRoom); + if (isRootGroupChat) { + Report.leaveGroupChat(report.reportID); return; } - Report.leaveGroupChat(report.reportID); - }, [isChatRoom, isPolicyEmployee, isPolicyExpenseChat, report.reportID, report.visibility]); + const isWorkspaceMemberLeavingWorkspaceRoom = (report.visibility === CONST.REPORT.VISIBILITY.RESTRICTED || isPolicyExpenseChat) && isPolicyEmployee; + Report.leaveRoom(report.reportID, isWorkspaceMemberLeavingWorkspaceRoom); + }, [isPolicyEmployee, isPolicyExpenseChat, isRootGroupChat, report.reportID, report.visibility]); const unapproveExpenseReportOrShowModal = useCallback(() => { if (PolicyUtils.hasAccountingConnections(policy)) { @@ -234,8 +235,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD IOU.unapproveExpenseReport(moneyRequestReport); }, [moneyRequestReport, policy]); - const shouldShowLeaveButton = - !isThread && (isGroupChat || (isChatRoom && ReportUtils.canLeaveChat(report, policy)) || (isPolicyExpenseChat && !report.isOwnPolicyExpenseChat && !isPolicyAdmin)); + const shouldShowLeaveButton = ReportUtils.canLeaveChat(report, policy); const reportName = ReportUtils.isDeprecatedGroupDM(report) || isGroupChat ? ReportUtils.getGroupChatName(undefined, false, report) : ReportUtils.getReportName(report); @@ -382,7 +382,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD icon: Expensicons.Exit, isAnonymousAction: true, action: () => { - if (ReportUtils.getParticipantsAccountIDsForDisplay(report, false, true).length === 1 && isGroupChat) { + if (ReportUtils.getParticipantsAccountIDsForDisplay(report, false, true).length === 1 && isRootGroupChat) { setIsLastMemberLeavingGroupModalVisible(true); return; } @@ -418,6 +418,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD isSelfDM, isArchivedRoom, isGroupChat, + isRootGroupChat, isDefaultRoom, isChatThread, isPolicyEmployee,