Skip to content

Commit

Permalink
Merge pull request #41290 from Expensify/francois-system-account-clea…
Browse files Browse the repository at this point in the history
…nups2

Allow system account chat to be listed in LHN, fix chat icons
  • Loading branch information
techievivek authored Jun 3, 2024
2 parents d1eadfc + a794af4 commit d7fd40a
Show file tree
Hide file tree
Showing 8 changed files with 50 additions and 13 deletions.
16 changes: 13 additions & 3 deletions src/components/ReportWelcomeText.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,10 +40,11 @@ function ReportWelcomeText({report, policy, personalDetails}: ReportWelcomeTextP
const isSelfDM = ReportUtils.isSelfDM(report);
const isInvoiceRoom = ReportUtils.isInvoiceRoom(report);
const isOneOnOneChat = ReportUtils.isOneOnOneChat(report);
const isDefault = !(isChatRoom || isPolicyExpenseChat || isSelfDM || isInvoiceRoom);
const isSystemChat = ReportUtils.isSystemChat(report);
const isDefault = !(isChatRoom || isPolicyExpenseChat || isSelfDM || isInvoiceRoom || isSystemChat);
const participantAccountIDs = Object.keys(report?.participants ?? {})
.map(Number)
.filter((accountID) => accountID !== session?.accountID || !isOneOnOneChat);
.filter((accountID) => accountID !== session?.accountID || (!isOneOnOneChat && !isSystemChat));
const isMultipleParticipant = participantAccountIDs.length > 1;
const displayNamesWithTooltips = ReportUtils.getDisplayNamesWithTooltips(OptionsListUtils.getPersonalDetailsForAccountIDs(participantAccountIDs, personalDetails), isMultipleParticipant);
const isUserPolicyAdmin = PolicyUtils.isPolicyAdmin(policy);
Expand Down Expand Up @@ -77,8 +78,12 @@ function ReportWelcomeText({report, policy, personalDetails}: ReportWelcomeTextP
return translate('reportActionsView.yourSpace');
}

if (isSystemChat) {
return reportName;
}

return translate('reportActionsView.sayHello');
}, [isChatRoom, isInvoiceRoom, isSelfDM, translate, reportName]);
}, [isChatRoom, isInvoiceRoom, isSelfDM, isSystemChat, translate, reportName]);

return (
<>
Expand Down Expand Up @@ -144,6 +149,11 @@ function ReportWelcomeText({report, policy, personalDetails}: ReportWelcomeTextP
<Text>{translate('reportActionsView.beginningOfChatHistorySelfDM')}</Text>
</Text>
)}
{isSystemChat && (
<Text>
<Text>{translate('reportActionsView.beginningOfChatHistorySystemDM')}</Text>
</Text>
)}
{isDefault && (
<Text>
<Text>{translate('reportActionsView.beginningOfChatHistory')}</Text>
Expand Down
1 change: 1 addition & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -519,6 +519,7 @@ export default {
beginningOfChatHistoryPolicyExpenseChatPartTwo: ' and ',
beginningOfChatHistoryPolicyExpenseChatPartThree: ' starts here! 🎉 This is the place to chat, submit expenses and settle up.',
beginningOfChatHistorySelfDM: 'This is your personal space. Use it for notes, tasks, drafts, and reminders.',
beginningOfChatHistorySystemDM: "Welcome! Let's get you set up.",
chatWithAccountManager: 'Chat with your account manager here',
sayHello: 'Say hello!',
yourSpace: 'Your space',
Expand Down
1 change: 1 addition & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -512,6 +512,7 @@ export default {
beginningOfChatHistoryPolicyExpenseChatPartTwo: ' y ',
beginningOfChatHistoryPolicyExpenseChatPartThree: ' empieza aquí! 🎉 Este es el lugar donde chatear y presentar o pagar gastos.',
beginningOfChatHistorySelfDM: 'Este es tu espacio personal. Úsalo para notas, tareas, borradores y recordatorios.',
beginningOfChatHistorySystemDM: '¡Bienvenido! Vamos a configurar tu cuenta.',
chatWithAccountManager: 'Chatea con tu gestor de cuenta aquí',
sayHello: '¡Saluda!',
yourSpace: 'Tu espacio',
Expand Down
2 changes: 1 addition & 1 deletion src/libs/OptionsListUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1876,7 +1876,7 @@ function getOptions(
allPersonalDetailsOptions = lodashOrderBy(allPersonalDetailsOptions, [(personalDetail) => personalDetail.text?.toLowerCase()], 'asc');
}

const optionsToExclude: Option[] = [{login: CONST.EMAIL.NOTIFICATIONS}];
const optionsToExclude: Option[] = [];

// If we're including selected options from the search results, we only want to exclude them if the search input is empty
// This is because on certain pages, we show the selected options at the top when the search input is empty
Expand Down
25 changes: 22 additions & 3 deletions src/libs/ReportUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1200,13 +1200,22 @@ function findLastAccessedReport(
}

if (isFirstTimeNewExpensifyUser) {
// Filter out the systemChat report from the reports list, as we don't want to drop the user into that report over Concierge when they first log in
sortedReports = sortedReports.filter((report) => !isSystemChat(report)) ?? [];
if (sortedReports.length === 1) {
return sortedReports[0];
}

return adminReport ?? sortedReports.find((report) => !isConciergeChatReport(report)) ?? null;
}

// If we only have two reports and one of them is the system chat, filter it out so we don't
// overwrite showing the concierge chat
const hasSystemChat = sortedReports.find((report) => isSystemChat(report)) ?? false;
if (sortedReports.length === 2 && hasSystemChat) {
sortedReports = sortedReports.filter((report) => !isSystemChat(report)) ?? [];
}

return adminReport ?? sortedReports.at(-1) ?? null;
}

Expand Down Expand Up @@ -2052,6 +2061,10 @@ function getIcons(
return getIconsForParticipants([currentUserAccountID ?? 0], personalDetails);
}

if (isSystemChat(report)) {
return getIconsForParticipants([CONST.ACCOUNT_ID.NOTIFICATIONS ?? 0], personalDetails);
}

if (isGroupChat(report)) {
const groupChatIcon = {
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
Expand Down Expand Up @@ -3229,6 +3242,10 @@ function getReportName(report: OnyxEntry<Report>, policy: OnyxEntry<Policy> = nu
formattedName = getDisplayNameForParticipant(currentUserAccountID, undefined, undefined, true);
}

if (isInvoiceRoom(report)) {
formattedName = getInvoicesChatName(report);
}

if (formattedName) {
return formattedName;
}
Expand Down Expand Up @@ -5200,11 +5217,13 @@ function shouldReportBeInOptionList({
!isMoneyRequestReport(report) &&
!isTaskReport(report) &&
!isSelfDM(report) &&
!isSystemChat(report) &&
!isGroupChat(report) &&
!isInvoiceRoom(report))
) {
return false;
}

if (!canAccessReport(report, policies, betas)) {
return false;
}
Expand Down Expand Up @@ -5267,7 +5286,7 @@ function shouldReportBeInOptionList({
}

// Hide chats between two users that haven't been commented on from the LNH
if (excludeEmptyChats && isEmptyChat && isChatReport(report) && !isChatRoom(report) && !isPolicyExpenseChat(report) && !isGroupChat(report) && canHideReport) {
if (excludeEmptyChats && isEmptyChat && isChatReport(report) && !isChatRoom(report) && !isPolicyExpenseChat(report) && !isSystemChat(report) && !isGroupChat(report) && canHideReport) {
return false;
}

Expand Down Expand Up @@ -5599,7 +5618,7 @@ function isGroupChatAdmin(report: OnyxEntry<Report>, accountID: number) {
*/
function getMoneyRequestOptions(report: OnyxEntry<Report>, policy: OnyxEntry<Policy>, reportParticipants: number[], filterDeprecatedTypes = false): IOUType[] {
// In any thread or task report, we do not allow any new expenses yet
if (isChatThread(report) || isTaskReport(report) || isInvoiceReport(report)) {
if (isChatThread(report) || isTaskReport(report) || isInvoiceReport(report) || isSystemChat(report)) {
return [];
}

Expand Down Expand Up @@ -6614,7 +6633,7 @@ function canJoinChat(report: OnyxEntry<Report>, parentReportAction: OnyxEntry<Re
}

// Anyone viewing these chat types is already a participant and therefore cannot join
if (isRootGroupChat(report) || isSelfDM(report) || isInvoiceRoom(report)) {
if (isRootGroupChat(report) || isSelfDM(report) || isInvoiceRoom(report) || isSystemChat(report)) {
return false;
}

Expand Down
3 changes: 2 additions & 1 deletion src/libs/SidebarUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,8 @@ function getOrderedReportIDs(
const isFocused = report.reportID === currentReportId;
const allReportErrors = OptionsListUtils.getAllReportErrors(report, reportActions) ?? {};
const hasErrorsOtherThanFailedReceipt = doesReportHaveViolations || Object.values(allReportErrors).some((error) => error?.[0] !== 'report.genericSmartscanFailureMessage');
const shouldOverrideHidden = hasErrorsOtherThanFailedReceipt || isFocused || report.isPinned;
const isSystemChat = ReportUtils.isSystemChat(report);
const shouldOverrideHidden = hasErrorsOtherThanFailedReceipt || isFocused || isSystemChat || report.isPinned;
if (isHidden && !shouldOverrideHidden) {
return false;
}
Expand Down
12 changes: 8 additions & 4 deletions src/pages/ReportDetailsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -88,15 +88,17 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD
// eslint-disable-next-line react-hooks/exhaustive-deps -- policy is a dependency because `getChatRoomSubtitle` calls `getPolicyName` which in turn retrieves the value from the `policy` value stored in Onyx
const chatRoomSubtitle = useMemo(() => ReportUtils.getChatRoomSubtitle(report), [report, policy]);
const parentNavigationSubtitleData = ReportUtils.getParentNavigationSubtitle(report);
const isSystemChat = useMemo(() => ReportUtils.isSystemChat(report), [report]);
const isGroupChat = useMemo(() => ReportUtils.isGroupChat(report), [report]);
const isThread = useMemo(() => ReportUtils.isThread(report), [report]);
const participants = useMemo(() => {
if (isGroupChat) {
return ReportUtils.getParticipantAccountIDs(report.reportID ?? '');
if (isGroupChat || isSystemChat) {
// Filter out the current user from the particpants of the systemChat
return ReportUtils.getParticipantAccountIDs(report.reportID ?? '').filter((accountID) => accountID !== session?.accountID && isSystemChat);
}

return ReportUtils.getVisibleChatMemberAccountIDs(report.reportID ?? '');
}, [report, isGroupChat]);
}, [report, session, isGroupChat, isSystemChat]);

// Get the active chat members by filtering out the pending members with delete action
const activeChatMembers = participants.flatMap((accountID) => {
Expand Down Expand Up @@ -148,7 +150,8 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD
(isDefaultRoom && isChatThread && isPolicyEmployee) ||
(!isUserCreatedPolicyRoom && participants.length) ||
(isUserCreatedPolicyRoom && (isPolicyEmployee || (isChatThread && !ReportUtils.isPublicRoom(report))))) &&
!ReportUtils.isConciergeChatReport(report)
!ReportUtils.isConciergeChatReport(report) &&
!isSystemChat
) {
items.push({
key: CONST.REPORT_DETAILS_MENU_ITEM.MEMBERS,
Expand Down Expand Up @@ -222,6 +225,7 @@ function ReportDetailsPage({policies, report, session, personalDetails}: ReportD
return items;
}, [
isSelfDM,
isSystemChat,
isArchivedRoom,
isGroupChat,
isDefaultRoom,
Expand Down
3 changes: 2 additions & 1 deletion src/pages/home/HeaderView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -91,11 +91,12 @@ function HeaderView({
const isSelfDM = ReportUtils.isSelfDM(report);
const isGroupChat = ReportUtils.isGroupChat(report) || ReportUtils.isDeprecatedGroupDM(report);
const isOneOnOneChat = ReportUtils.isOneOnOneChat(report);
const isSystemChat = ReportUtils.isSystemChat(report);

// For 1:1 chat, we don't want to include currentUser as participants in order to not mark 1:1 chats as having multiple participants
const participants = Object.keys(report?.participants ?? {})
.map(Number)
.filter((accountID) => accountID !== session?.accountID || !isOneOnOneChat)
.filter((accountID) => accountID !== session?.accountID || (!isOneOnOneChat && !isSystemChat))
.slice(0, 5);
const isMultipleParticipant = participants.length > 1;

Expand Down

0 comments on commit d7fd40a

Please sign in to comment.