diff --git a/src/components/ParentNavigationSubtitle.tsx b/src/components/ParentNavigationSubtitle.tsx index 1896bc4f5f07..f9d84fb423bb 100644 --- a/src/components/ParentNavigationSubtitle.tsx +++ b/src/components/ParentNavigationSubtitle.tsx @@ -2,11 +2,10 @@ import React from 'react'; import type {StyleProp, ViewStyle} from 'react-native'; import {useOnyx} from 'react-native-onyx'; import useLocalize from '@hooks/useLocalize'; -import useNetwork from '@hooks/useNetwork'; import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; -import * as ReportActionsUtils from '@libs/ReportActionsUtils'; -import * as ReportUtils from '@libs/ReportUtils'; +import {getReportAction, shouldReportActionBeVisible} from '@libs/ReportActionsUtils'; +import {canUserPerformWriteAction as canUserPerformWriteActionReportUtils} from '@libs/ReportUtils'; import CONST from '@src/CONST'; import type {ParentNavigationSummaryParams} from '@src/languages/params'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -30,10 +29,9 @@ type ParentNavigationSubtitleProps = { function ParentNavigationSubtitle({parentNavigationSubtitleData, parentReportActionID, parentReportID = '', pressableStyles}: ParentNavigationSubtitleProps) { const styles = useThemeStyles(); const {workspaceName, reportName} = parentNavigationSubtitleData; - const {isOffline} = useNetwork(); const {translate} = useLocalize(); const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${parentReportID}`); - const canUserPerformWriteAction = ReportUtils.canUserPerformWriteAction(report); + const canUserPerformWriteAction = canUserPerformWriteActionReportUtils(report); // We should not display the parent navigation subtitle if the user does not have access to the parent chat (the reportName is empty in this case) if (!reportName) { @@ -43,11 +41,11 @@ function ParentNavigationSubtitle({parentNavigationSubtitleData, parentReportAct return ( { - const parentAction = ReportActionsUtils.getReportAction(parentReportID, parentReportActionID ?? '-1'); - const isVisibleAction = ReportActionsUtils.shouldReportActionBeVisible(parentAction, parentAction?.reportActionID ?? '-1', canUserPerformWriteAction); + const parentAction = getReportAction(parentReportID, parentReportActionID); + const isVisibleAction = shouldReportActionBeVisible(parentAction, parentAction?.reportActionID ?? CONST.DEFAULT_NUMBER_ID, canUserPerformWriteAction); // Pop the thread report screen before navigating to the chat report. Navigation.goBack(ROUTES.REPORT_WITH_ID.getRoute(parentReportID)); - if (isVisibleAction && !isOffline) { + if (isVisibleAction) { // Pop the chat report screen before navigating to the linked report action. Navigation.goBack(ROUTES.REPORT_WITH_ID.getRoute(parentReportID, parentReportActionID), true); } diff --git a/src/libs/PaginationUtils.ts b/src/libs/PaginationUtils.ts index 1cb3e7295c27..59302abd2d43 100644 --- a/src/libs/PaginationUtils.ts +++ b/src/libs/PaginationUtils.ts @@ -173,7 +173,8 @@ function getContinuousChain( id?: string, ): {data: TResource[]; hasNextPage: boolean; hasPreviousPage: boolean} { if (pages.length === 0) { - return {data: id ? [] : sortedItems, hasNextPage: false, hasPreviousPage: false}; + const dataItem = sortedItems.find((item) => getID(item) === id); + return {data: id && !dataItem ? [] : sortedItems, hasNextPage: false, hasPreviousPage: false}; } const pagesWithIndexes = getPagesWithIndexes(sortedItems, pages, getID); diff --git a/src/pages/home/report/ThreadDivider.tsx b/src/pages/home/report/ThreadDivider.tsx index 0cf34d6f40e6..7bb03c42ac82 100644 --- a/src/pages/home/report/ThreadDivider.tsx +++ b/src/pages/home/report/ThreadDivider.tsx @@ -5,13 +5,12 @@ import * as Expensicons from '@components/Icon/Expensicons'; import {PressableWithoutFeedback} from '@components/Pressable'; import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; -import useNetwork from '@hooks/useNetwork'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; -import * as ReportActionsUtils from '@libs/ReportActionsUtils'; +import {shouldReportActionBeVisible} from '@libs/ReportActionsUtils'; +import {canUserPerformWriteAction} from '@libs/ReportUtils'; import type {Ancestor} from '@libs/ReportUtils'; -import * as ReportUtils from '@libs/ReportUtils'; import variables from '@styles/variables'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; @@ -28,7 +27,6 @@ function ThreadDivider({ancestor, isLinkDisabled = false}: ThreadDividerProps) { const styles = useThemeStyles(); const theme = useTheme(); const {translate} = useLocalize(); - const {isOffline} = useNetwork(); return ( { - const isVisibleAction = ReportActionsUtils.shouldReportActionBeVisible( - ancestor.reportAction, - ancestor.reportAction.reportActionID ?? '-1', - ReportUtils.canUserPerformWriteAction(ancestor.report), - ); + const isVisibleAction = shouldReportActionBeVisible(ancestor.reportAction, ancestor.reportAction.reportActionID, canUserPerformWriteAction(ancestor.report)); // Pop the thread report screen before navigating to the chat report. - Navigation.goBack(ROUTES.REPORT_WITH_ID.getRoute(ancestor.report.reportID ?? '-1')); - if (isVisibleAction && !isOffline) { + Navigation.goBack(ROUTES.REPORT_WITH_ID.getRoute(ancestor.report.reportID)); + if (isVisibleAction) { // Pop the chat report screen before navigating to the linked report action. - Navigation.goBack(ROUTES.REPORT_WITH_ID.getRoute(ancestor.report.reportID ?? '-1', ancestor.reportAction.reportActionID)); + Navigation.goBack(ROUTES.REPORT_WITH_ID.getRoute(ancestor.report.reportID, ancestor.reportAction.reportActionID)); } }} accessibilityLabel={translate('threads.thread')} diff --git a/tests/unit/PaginationUtilsTest.ts b/tests/unit/PaginationUtilsTest.ts index e5f4ce7675e8..28e754ce5ff7 100644 --- a/tests/unit/PaginationUtilsTest.ts +++ b/tests/unit/PaginationUtilsTest.ts @@ -163,7 +163,7 @@ describe('PaginationUtils', () => { expect(result.hasNextPage).toBe(false); }); - it('given an input ID and the report only contains pending actions, it will return an empty array', () => { + it('given an input ID and the report only contains pending actions, it will return all actions', () => { const input = createItems([ // Given these sortedItems '7', @@ -178,8 +178,31 @@ describe('PaginationUtils', () => { const pages: Pages = []; // Expect these sortedItems - const expectedResult: Item[] = []; + const expectedResult = [...input]; const result = PaginationUtils.getContinuousChain(input, pages, getID, '4'); + // Expect the result to be the same + expect(result.data).toStrictEqual(expectedResult); + expect(result.hasPreviousPage).toBe(false); + expect(result.hasNextPage).toBe(false); + }); + + it('given an input ID of 8 which does not exist in Onyx and the report only contains pending actions, it will return an empty array', () => { + const input = createItems([ + // Given these sortedItems + '7', + '6', + '5', + '4', + '3', + '2', + '1', + ]); + + const pages: Pages = []; + + // Expect these sortedItems + const expectedResult: Item[] = []; + const result = PaginationUtils.getContinuousChain(input, pages, getID, '8'); expect(result.data).toStrictEqual(expectedResult); expect(result.hasPreviousPage).toBe(false); expect(result.hasNextPage).toBe(false);