From 82b6acba6faa045508f8da26f55730fd7a60ca59 Mon Sep 17 00:00:00 2001 From: Samran Ahmed Date: Fri, 22 Aug 2025 15:36:15 +0500 Subject: [PATCH 1/4] fix: show not found page for invite and members page on archived room --- src/pages/RoomInvitePage.tsx | 6 ++++-- src/pages/RoomMembersPage.tsx | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/pages/RoomInvitePage.tsx b/src/pages/RoomInvitePage.tsx index 6499e08d5810..a5717165a807 100644 --- a/src/pages/RoomInvitePage.tsx +++ b/src/pages/RoomInvitePage.tsx @@ -15,6 +15,7 @@ import type {WithNavigationTransitionEndProps} from '@components/withNavigationT import useDebouncedState from '@hooks/useDebouncedState'; import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; +import useReportIsArchived from '@hooks/useReportIsArchived'; import useThemeStyles from '@hooks/useThemeStyles'; import {inviteToRoom, searchInServer} from '@libs/actions/Report'; import {clearUserSearchPhrase, updateUserSearchPhrase} from '@libs/actions/RoomMembersUserSearchPhrase'; @@ -58,6 +59,7 @@ function RoomInvitePage({ const [searchTerm, debouncedSearchTerm, setSearchTerm] = useDebouncedState(userSearchPhrase ?? ''); const [selectedOptions, setSelectedOptions] = useState([]); const [isSearchingForReports] = useOnyx(ONYXKEYS.IS_SEARCHING_FOR_REPORTS, {initWithStoredValues: false, canBeMissing: true}); + const isReportArchived = useReportIsArchived(report.reportID); const {options, areOptionsInitialized} = useOptionsList(); @@ -184,7 +186,7 @@ function RoomInvitePage({ const reportID = report?.reportID; const isPolicyEmployee = useMemo(() => isPolicyEmployeeUtil(report?.policyID, policy), [report?.policyID, policy]); const backRoute = useMemo(() => { - return reportID && (isPolicyEmployee ? ROUTES.ROOM_MEMBERS.getRoute(reportID, backTo) : ROUTES.REPORT_WITH_ID_DETAILS.getRoute(reportID, backTo)); + return reportID && (!isPolicyEmployee || isReportArchived ? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(reportID, backTo) : ROUTES.ROOM_MEMBERS.getRoute(reportID, backTo)); }, [isPolicyEmployee, reportID, backTo]); const reportName = useMemo(() => getReportName(report), [report]); const inviteUsers = useCallback(() => { @@ -240,7 +242,7 @@ function RoomInvitePage({ includeSafeAreaPaddingBottom > diff --git a/src/pages/RoomMembersPage.tsx b/src/pages/RoomMembersPage.tsx index 1126ea95d03e..ea44d6eb5530 100644 --- a/src/pages/RoomMembersPage.tsx +++ b/src/pages/RoomMembersPage.tsx @@ -21,6 +21,7 @@ import useLocalize from '@hooks/useLocalize'; import useMobileSelectionMode from '@hooks/useMobileSelectionMode'; import useNetwork from '@hooks/useNetwork'; import useOnyx from '@hooks/useOnyx'; +import useReportIsArchived from '@hooks/useReportIsArchived'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useSearchBackPress from '@hooks/useSearchBackPress'; import useThemeStyles from '@hooks/useThemeStyles'; @@ -61,6 +62,7 @@ function RoomMembersPage({report, policy}: RoomMembersPageProps) { const personalDetails = usePersonalDetails(); const isPolicyExpenseChat = useMemo(() => isPolicyExpenseChatUtils(report), [report]); const backTo = route.params.backTo; + const isReportArchived = useReportIsArchived(report.reportID); const {chatParticipants: participants, personalDetailsParticipants} = useMemo( () => getReportPersonalDetailsParticipants(report, personalDetails, reportMetadata, true), @@ -383,7 +385,7 @@ function RoomMembersPage({report, policy}: RoomMembersPageProps) { testID={RoomMembersPage.displayName} > { Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report.reportID, backTo)); From 0cdd2cefb0b8fdba5e6289514e7c16f53ef53c1c Mon Sep 17 00:00:00 2001 From: Samran Ahmed Date: Mon, 1 Sep 2025 19:15:30 +0500 Subject: [PATCH 2/4] add isReportArchived in deps --- src/pages/RoomInvitePage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/RoomInvitePage.tsx b/src/pages/RoomInvitePage.tsx index a5717165a807..b7a51e7eaaa0 100644 --- a/src/pages/RoomInvitePage.tsx +++ b/src/pages/RoomInvitePage.tsx @@ -187,7 +187,7 @@ function RoomInvitePage({ const isPolicyEmployee = useMemo(() => isPolicyEmployeeUtil(report?.policyID, policy), [report?.policyID, policy]); const backRoute = useMemo(() => { return reportID && (!isPolicyEmployee || isReportArchived ? ROUTES.REPORT_WITH_ID_DETAILS.getRoute(reportID, backTo) : ROUTES.ROOM_MEMBERS.getRoute(reportID, backTo)); - }, [isPolicyEmployee, reportID, backTo]); + }, [isPolicyEmployee, reportID, backTo, isReportArchived]); const reportName = useMemo(() => getReportName(report), [report]); const inviteUsers = useCallback(() => { HttpUtils.cancelPendingRequests(READ_COMMANDS.SEARCH_FOR_REPORTS); From 4513b496a835ce5ec45496c7530e4bca9c3b96a9 Mon Sep 17 00:00:00 2001 From: Samran Ahmed Date: Sat, 6 Sep 2025 13:25:18 +0500 Subject: [PATCH 3/4] fix: archived room not here page subtitle --- src/languages/de.ts | 1 + src/languages/en.ts | 1 + src/languages/es.ts | 1 + src/languages/fr.ts | 1 + src/languages/it.ts | 1 + src/languages/ja.ts | 1 + src/languages/nl.ts | 1 + src/languages/pl.ts | 1 + src/languages/pt-BR.ts | 1 + src/languages/zh-hans.ts | 1 + src/pages/RoomInvitePage.tsx | 8 +++++++- src/pages/RoomMembersPage.tsx | 8 +++++++- 12 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index 56ed4f729caa..c3894aac6be5 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -5978,6 +5978,7 @@ const translations = { memberNotFound: 'Mitglied nicht gefunden.', useInviteButton: 'Um ein neues Mitglied zum Chat einzuladen, verwenden Sie bitte die Einladungs-Schaltfläche oben.', notAuthorized: `Sie haben keinen Zugriff auf diese Seite. Wenn Sie versuchen, diesem Raum beizutreten, bitten Sie einfach ein Mitglied des Raums, Sie hinzuzufügen. Etwas anderes? Wenden Sie sich an ${CONST.EMAIL.CONCIERGE}`, + roomArchived: `Es sieht so aus, als wäre dieser Raum archiviert worden. Bei Fragen wenden Sie sich bitte an ${CONST.EMAIL.CONCIERGE}.`, removeMembersPrompt: ({memberName}: {memberName: string}) => ({ one: `Möchten Sie ${memberName} wirklich aus dem Raum entfernen?`, other: 'Möchten Sie die ausgewählten Mitglieder wirklich aus dem Raum entfernen?', diff --git a/src/languages/en.ts b/src/languages/en.ts index cec1db1cabad..a163b5c1f8b0 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -5952,6 +5952,7 @@ const translations = { memberNotFound: 'Member not found.', useInviteButton: 'To invite a new member to the chat, please use the invite button above.', notAuthorized: `You don't have access to this page. If you're trying to join this room, just ask a room member to add you. Something else? Reach out to ${CONST.EMAIL.CONCIERGE}`, + roomArchived: `It looks like this room was archived. For questions, reach out to ${CONST.EMAIL.CONCIERGE}.`, removeMembersPrompt: ({memberName}: {memberName: string}) => ({ one: `Are you sure you want to remove ${memberName} from the room?`, other: 'Are you sure you want to remove the selected members from the room?', diff --git a/src/languages/es.ts b/src/languages/es.ts index 4fb05c9fc147..669ea64cf314 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -5973,6 +5973,7 @@ const translations = { memberNotFound: 'Miembro no encontrado.', useInviteButton: 'Para invitar a un nuevo miembro al chat, por favor, utiliza el botón invitar que está más arriba.', notAuthorized: `No tienes acceso a esta página. Si estás intentando unirte a esta sala, pide a un miembro de la sala que te añada. ¿Necesitas algo más? Comunícate con ${CONST.EMAIL.CONCIERGE}`, + roomArchived: `Parece que esta sala ha sido archivada. Si tienes preguntas, comunícate con ${CONST.EMAIL.CONCIERGE}.`, removeMembersPrompt: ({memberName}: {memberName: string}) => ({ one: `¿Estás seguro de que quieres eliminar ${memberName} de la sala de chat?`, other: '¿Estás seguro de que quieres eliminar a los miembros seleccionados de la sala de chat?', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index aedd8d5e8298..e498b64ee83b 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -5992,6 +5992,7 @@ const translations = { memberNotFound: 'Membre non trouvé.', useInviteButton: "Pour inviter un nouveau membre à la discussion, veuillez utiliser le bouton d'invitation ci-dessus.", notAuthorized: `Vous n'avez pas accès à cette page. Si vous essayez de rejoindre cette salle, demandez simplement à un membre de la salle de vous ajouter. Autre chose ? Contactez ${CONST.EMAIL.CONCIERGE}`, + roomArchived: `Il semblerait que cette salle ait été archivée. Si vous avez des questions, contactez ${CONST.EMAIL.CONCIERGE}.`, removeMembersPrompt: ({memberName}: {memberName: string}) => ({ one: `Êtes-vous sûr de vouloir retirer ${memberName} de la salle ?`, other: 'Êtes-vous sûr de vouloir supprimer les membres sélectionnés de la salle ?', diff --git a/src/languages/it.ts b/src/languages/it.ts index c55c92fb7404..951e2fbb1801 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -5993,6 +5993,7 @@ const translations = { memberNotFound: 'Membro non trovato.', useInviteButton: 'Per invitare un nuovo membro alla chat, utilizza il pulsante di invito sopra.', notAuthorized: `Non hai accesso a questa pagina. Se stai cercando di unirti a questa stanza, chiedi a un membro della stanza di aggiungerti. Qualcos'altro? Contatta ${CONST.EMAIL.CONCIERGE}`, + roomArchived: `Sembra che questa stanza sia stata archiviata. Se hai domande, contatta ${CONST.EMAIL.CONCIERGE}.`, removeMembersPrompt: ({memberName}: {memberName: string}) => ({ one: `Sei sicuro di voler rimuovere ${memberName} dalla stanza?`, other: 'Sei sicuro di voler rimuovere i membri selezionati dalla stanza?', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 8ccffd5cb594..3011c4a8c654 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -5950,6 +5950,7 @@ const translations = { memberNotFound: 'メンバーが見つかりません。', useInviteButton: '新しいメンバーをチャットに招待するには、上の招待ボタンを使用してください。', notAuthorized: `このページにアクセスする権限がありません。このルームに参加しようとしている場合は、ルームメンバーに追加してもらってください。他に何かお困りですか?${CONST.EMAIL.CONCIERGE}にお問い合わせください。`, + roomArchived: `このルームはアーカイブされました。ご不明な点があれば、${CONST.EMAIL.CONCIERGE} までご連絡ください。`, removeMembersPrompt: ({memberName}: {memberName: string}) => ({ one: `このルームから${memberName}を削除してもよろしいですか?`, other: '選択したメンバーをルームから削除してもよろしいですか?', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 1c993f6b8a1b..d2144a7f6d3a 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -5985,6 +5985,7 @@ const translations = { memberNotFound: 'Lid niet gevonden.', useInviteButton: 'Om een nieuw lid uit te nodigen voor de chat, gebruik de uitnodigingsknop hierboven.', notAuthorized: `Je hebt geen toegang tot deze pagina. Als je probeert deze kamer te betreden, vraag dan een kamerlid om je toe te voegen. Iets anders? Neem contact op met ${CONST.EMAIL.CONCIERGE}`, + roomArchived: `Het lijkt erop dat deze kamer is gearchiveerd. Voor vragen kun je contact opnemen met ${CONST.EMAIL.CONCIERGE}.`, removeMembersPrompt: ({memberName}: {memberName: string}) => ({ one: `Weet je zeker dat je ${memberName} uit de kamer wilt verwijderen?`, other: 'Weet je zeker dat je de geselecteerde leden uit de kamer wilt verwijderen?', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index e9596b46616d..c2279ef55c54 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -5971,6 +5971,7 @@ const translations = { memberNotFound: 'Nie znaleziono członka.', useInviteButton: 'Aby zaprosić nowego członka do czatu, użyj przycisku zaproszenia powyżej.', notAuthorized: `Nie masz dostępu do tej strony. Jeśli próbujesz dołączyć do tego pokoju, poproś członka pokoju, aby Cię dodał. Coś innego? Skontaktuj się z ${CONST.EMAIL.CONCIERGE}`, + roomArchived: `Wygląda na to, że ten pokój został zarchiwizowany. W razie pytań skontaktuj się z ${CONST.EMAIL.CONCIERGE}.`, removeMembersPrompt: ({memberName}: {memberName: string}) => ({ one: `Czy na pewno chcesz usunąć ${memberName} z pokoju?`, other: 'Czy na pewno chcesz usunąć wybranych członków z pokoju?', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index da6c10e32482..84a9806fad04 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -5986,6 +5986,7 @@ const translations = { memberNotFound: 'Membro não encontrado.', useInviteButton: 'Para convidar um novo membro para o chat, por favor, use o botão de convite acima.', notAuthorized: `Você não tem acesso a esta página. Se você está tentando entrar nesta sala, peça a um membro da sala para adicioná-lo. Algo mais? Entre em contato com ${CONST.EMAIL.CONCIERGE}`, + roomArchived: `Parece que esta sala foi arquivada. Em caso de dúvidas, entre em contato com ${CONST.EMAIL.CONCIERGE}.`, removeMembersPrompt: ({memberName}: {memberName: string}) => ({ one: `Tem certeza de que deseja remover ${memberName} da sala?`, other: 'Tem certeza de que deseja remover os membros selecionados da sala?', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 91598a0c15a5..ab876808948d 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -5868,6 +5868,7 @@ const translations = { memberNotFound: '未找到成员。', useInviteButton: '要邀请新成员加入聊天,请使用上面的邀请按钮。', notAuthorized: `您无权访问此页面。如果您想加入此房间,请让房间成员添加您。还有其他问题?请联系${CONST.EMAIL.CONCIERGE}`, + roomArchived: `此房间已被存档。如有疑问,请联系 ${CONST.EMAIL.CONCIERGE}。`, removeMembersPrompt: ({memberName}: {memberName: string}) => ({ one: `您确定要将${memberName}从房间中移除吗?`, other: '您确定要从房间中移除选定的成员吗?', diff --git a/src/pages/RoomInvitePage.tsx b/src/pages/RoomInvitePage.tsx index b7a51e7eaaa0..f611008a1858 100644 --- a/src/pages/RoomInvitePage.tsx +++ b/src/pages/RoomInvitePage.tsx @@ -27,6 +27,7 @@ import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {RoomMembersNavigatorParamList} from '@libs/Navigation/types'; import type {MemberForList} from '@libs/OptionsListUtils'; +import type {TranslationPaths} from '@src/languages/types'; import {filterAndOrderOptions, formatMemberForList, getHeaderMessage, getMemberInviteOptions} from '@libs/OptionsListUtils'; import {getLoginsByAccountIDs} from '@libs/PersonalDetailsUtils'; import {addSMSDomainIfPhoneNumber, parsePhoneNumber} from '@libs/PhoneNumber'; @@ -235,6 +236,11 @@ function RoomInvitePage({ searchInServer(debouncedSearchTerm); }, [debouncedSearchTerm]); + let subtitleKey: '' | TranslationPaths | undefined; + if (!isEmptyObject(report)) { + subtitleKey = isReportArchived ? 'roomMembersPage.roomArchived' : 'roomMembersPage.notAuthorized'; + } + return ( {header}; }, [styles, translate, canSelectMultiple]); + let subtitleKey: '' | TranslationPaths | undefined; + if (!isEmptyObject(report)) { + subtitleKey = isReportArchived ? 'roomMembersPage.roomArchived' : 'roomMembersPage.notAuthorized'; + } + return ( { Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report.reportID, backTo)); }} From 6e363fd66b458e7fc4af6175baceeea084d1dc31 Mon Sep 17 00:00:00 2001 From: Samran Ahmed Date: Sat, 6 Sep 2025 13:50:07 +0500 Subject: [PATCH 4/4] fix prettier --- src/pages/RoomInvitePage.tsx | 2 +- src/pages/RoomMembersPage.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/RoomInvitePage.tsx b/src/pages/RoomInvitePage.tsx index f611008a1858..19e600255104 100644 --- a/src/pages/RoomInvitePage.tsx +++ b/src/pages/RoomInvitePage.tsx @@ -27,7 +27,6 @@ import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {RoomMembersNavigatorParamList} from '@libs/Navigation/types'; import type {MemberForList} from '@libs/OptionsListUtils'; -import type {TranslationPaths} from '@src/languages/types'; import {filterAndOrderOptions, formatMemberForList, getHeaderMessage, getMemberInviteOptions} from '@libs/OptionsListUtils'; import {getLoginsByAccountIDs} from '@libs/PersonalDetailsUtils'; import {addSMSDomainIfPhoneNumber, parsePhoneNumber} from '@libs/PhoneNumber'; @@ -36,6 +35,7 @@ import {isPolicyEmployee as isPolicyEmployeeUtil} from '@libs/PolicyUtils'; import type {OptionData} from '@libs/ReportUtils'; import {getReportName, isHiddenForCurrentUser} from '@libs/ReportUtils'; import CONST from '@src/CONST'; +import type {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; diff --git a/src/pages/RoomMembersPage.tsx b/src/pages/RoomMembersPage.tsx index 7493e91493cd..c1d44bbe4d15 100644 --- a/src/pages/RoomMembersPage.tsx +++ b/src/pages/RoomMembersPage.tsx @@ -31,7 +31,6 @@ import {canUseTouchScreen} from '@libs/DeviceCapabilities'; import Navigation from '@libs/Navigation/Navigation'; import type {PlatformStackRouteProp, PlatformStackScreenProps} from '@libs/Navigation/PlatformStackNavigation/types'; import type {RoomMembersNavigatorParamList} from '@libs/Navigation/types'; -import type {TranslationPaths} from '@src/languages/types'; import {isPersonalDetailsReady, isSearchStringMatchUserDetails} from '@libs/OptionsListUtils'; import {getDisplayNameOrDefault, getPersonalDetailsByIDs} from '@libs/PersonalDetailsUtils'; import {isPolicyEmployee as isPolicyEmployeeUtils, isUserPolicyAdmin} from '@libs/PolicyUtils'; @@ -39,6 +38,7 @@ import {getReportName, getReportPersonalDetailsParticipants, isChatThread, isDef import StringUtils from '@libs/StringUtils'; import {clearAddRoomMemberError, openRoomMembersPage, removeFromRoom} from '@userActions/Report'; import CONST from '@src/CONST'; +import type {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type SCREENS from '@src/SCREENS';