Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
df20a0f
Revert "Merge pull request #80318 from Expensify/revert-78634-feat/vi…
BartekObudzinski Jan 23, 2026
d5b570a
Refactor visibility checks for report actions to use isReportActionVi…
BartekObudzinski Jan 23, 2026
7964513
Enhance report actions visibility logic by introducing a derived valu…
BartekObudzinski Jan 23, 2026
2d27c5d
Refactor report actions processing to streamline visibility updates, …
BartekObudzinski Jan 23, 2026
46cb409
fix: prettier
BartekObudzinski Jan 23, 2026
f98e246
Enhance report action visibility logic to account for pending actions…
BartekObudzinski Jan 23, 2026
db53f8e
Refactor report action visibility check to simplify logic by removing…
BartekObudzinski Jan 23, 2026
5c094e9
Merge remote-tracking branch 'upstream/main' into feat/fix-reverted-v…
BartekObudzinski Jan 26, 2026
88f8d98
Update report name retrieval in ReportUtils to use Parser.htmlToText …
BartekObudzinski Jan 26, 2026
2655929
Enhance report action visibility checks and improve last message text…
BartekObudzinski Jan 26, 2026
60fdf98
Refactor visibility check for IOU report actions to streamline last m…
BartekObudzinski Jan 26, 2026
8dc59b6
Enhance report action visibility checks by adding reportID as a fallb…
BartekObudzinski Jan 26, 2026
f2531ca
Merge remote-tracking branch 'upstream/main' into feat/fix-reverted-v…
BartekObudzinski Jan 27, 2026
316032d
Refactor: Improve code readability by formatting function dependencie…
BartekObudzinski Jan 27, 2026
fee87c7
Merge remote-tracking branch 'upstream/main' into feat/fix-reverted-v…
BartekObudzinski Jan 28, 2026
9d787c4
prettier fix
BartekObudzinski Jan 28, 2026
cdc3f22
Merge remote-tracking branch 'upstream/main' into feat/fix-reverted-v…
BartekObudzinski Jan 28, 2026
554aa0e
Merge remote-tracking branch 'upstream/main' into feat/fix-reverted-v…
BartekObudzinski Jan 29, 2026
7a352d8
Refactor getSortedReportActionsForDisplay to include reportID paramet…
BartekObudzinski Jan 29, 2026
743f462
Fix potential null reference in getTransactionThreadReportActions by …
BartekObudzinski Jan 29, 2026
2ab17cb
Refactor getReportActionsSections to improve reportID handling and en…
BartekObudzinski Jan 29, 2026
7498ee4
feat: filtering in getSortedReportActionsForDisplay to exclude deprec…
BartekObudzinski Jan 29, 2026
bb8342b
Merge remote-tracking branch 'upstream/main' into feat/fix-reverted-v…
BartekObudzinski Jan 30, 2026
ae70d53
Refactor report visibility logic to use reportActionID consistently, …
BartekObudzinski Jan 30, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/ONYXKEYS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -997,6 +997,7 @@ const ONYXKEYS = {
REPORT_ATTRIBUTES: 'reportAttributes',
REPORT_TRANSACTIONS_AND_VIOLATIONS: 'reportTransactionsAndViolations',
OUTSTANDING_REPORTS_BY_POLICY_ID: 'outstandingReportsByPolicyID',
VISIBLE_REPORT_ACTIONS: 'visibleReportActions',
NON_PERSONAL_AND_WORKSPACE_CARD_LIST: 'nonPersonalAndWorkspaceCardList',
CARD_FEED_ERRORS: 'cardFeedErrors',
},
Expand Down Expand Up @@ -1413,6 +1414,7 @@ type OnyxDerivedValuesMapping = {
[ONYXKEYS.DERIVED.REPORT_ATTRIBUTES]: OnyxTypes.ReportAttributesDerivedValue;
[ONYXKEYS.DERIVED.REPORT_TRANSACTIONS_AND_VIOLATIONS]: OnyxTypes.ReportTransactionsAndViolationsDerivedValue;
[ONYXKEYS.DERIVED.OUTSTANDING_REPORTS_BY_POLICY_ID]: OnyxTypes.OutstandingReportsByPolicyIDDerivedValue;
[ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS]: OnyxTypes.VisibleReportActionsDerivedValue;
[ONYXKEYS.DERIVED.NON_PERSONAL_AND_WORKSPACE_CARD_LIST]: OnyxTypes.NonPersonalAndWorkspaceCardListDerivedValue;
[ONYXKEYS.DERIVED.CARD_FEED_ERRORS]: OnyxTypes.CardFeedErrorsDerivedValue;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ import type {OnyxEntry} from 'react-native-onyx';
import type {ValueOf} from 'type-fest';
import type {Attachment} from '@components/Attachments/types';
import {getFileName, splitExtensionFromFileName} from '@libs/fileDownload/FileUtils';
import {getHtmlWithAttachmentID, getReportActionHtml, getReportActionMessage, getSortedReportActions, isMoneyRequestAction, shouldReportActionBeVisible} from '@libs/ReportActionsUtils';
import {getHtmlWithAttachmentID, getReportActionHtml, getReportActionMessage, getSortedReportActions, isMoneyRequestAction, isReportActionVisible} from '@libs/ReportActionsUtils';
import {canUserPerformWriteAction} from '@libs/ReportUtils';
import tryResolveUrlFromApiRoot from '@libs/tryResolveUrlFromApiRoot';
import CONST from '@src/CONST';
import type {Report, ReportAction, ReportActions} from '@src/types/onyx';
import type {Report, ReportAction, ReportActions, VisibleReportActionsDerivedValue} from '@src/types/onyx';
import type {Note} from '@src/types/onyx/Report';

/**
Expand All @@ -22,13 +22,15 @@ function extractAttachments(
reportActions,
report,
isReportArchived,
visibleReportActionsData,
}: {
privateNotes?: Record<number, Note>;
accountID?: number;
parentReportAction?: OnyxEntry<ReportAction>;
reportActions?: OnyxEntry<ReportActions>;
report: OnyxEntry<Report>;
isReportArchived: boolean | undefined;
visibleReportActionsData?: VisibleReportActionsDerivedValue;
},
) {
const targetNote = privateNotes?.[Number(accountID)]?.note ?? '';
Expand Down Expand Up @@ -115,9 +117,13 @@ function extractAttachments(
return attachments.reverse();
}

const reportID = report?.reportID;
if (!reportID) {
return attachments.reverse();
Comment on lines +120 to +122

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add context about ths change?

@BartekObudzinski BartekObudzinski Jan 28, 2026

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The reportID guard was added because isReportActionVisible requires a valid reportID to perform the derived value cache lookup. If the report is missing, there are no meaningful report actions to extract attachments from anyway, so bailing early with an empty array is safe. The attachments.reverse() form is used instead of returning [] directly for consistency with the other return statements in the function

@mkhutornyi mkhutornyi Jan 28, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

attachments.reverse()

Ah I wanted to know about this change. It's already existing logic.

}
const actions = [...(parentReportAction ? [parentReportAction] : []), ...getSortedReportActions(Object.values(reportActions ?? {}))];
for (const [key, action] of actions.entries()) {
if (!shouldReportActionBeVisible(action, key, canUserPerformAction) || isMoneyRequestAction(action)) {
for (const action of actions) {
if (!isReportActionVisible(action, reportID, canUserPerformAction, visibleReportActionsData) || isMoneyRequestAction(action)) {
continue;
}

Expand Down
88 changes: 44 additions & 44 deletions src/components/LHNOptionsList/LHNOptionsList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import type {BlockingViewProps} from '@components/BlockingViews/BlockingView';
import BlockingView from '@components/BlockingViews/BlockingView';
import Icon from '@components/Icon';
import * as Expensicons from '@components/Icon/Expensicons';

Check warning on line 13 in src/components/LHNOptionsList/LHNOptionsList.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

'@components/Icon/Expensicons' import is restricted from being used by a pattern. Direct imports from Icon/Expensicons are deprecated. Please use lazy loading hooks instead. Use `useMemoizedLazyExpensifyIcons` from @hooks/useLazyAsset. See docs/LAZY_ICONS_AND_ILLUSTRATIONS.md for details

Check warning on line 13 in src/components/LHNOptionsList/LHNOptionsList.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

'@components/Icon/Expensicons' import is restricted from being used. Direct imports from @components/Icon/Expensicons are deprecated. Please use lazy loading hooks instead. Use `useMemoizedLazyExpensifyIcons` from @hooks/useLazyAsset. See docs/LAZY_ICONS_AND_ILLUSTRATIONS.md for details
import {ScrollOffsetContext} from '@components/ScrollOffsetContextProvider';
import TextBlock from '@components/TextBlock';
import useCurrentUserPersonalDetails from '@hooks/useCurrentUserPersonalDetails';
Expand All @@ -29,20 +29,20 @@
import {getMovedReportID} from '@libs/ModifiedExpenseMessage';
import {getIOUReportIDOfLastAction, getLastMessageTextForReport} from '@libs/OptionsListUtils';
import {
getLastVisibleAction,
getOneTransactionThreadReportID,
getOriginalMessage,
getSortedReportActions,
getSortedReportActionsForDisplay,
getReportActionActorAccountID,
isInviteOrRemovedAction,
isMoneyRequestAction,
shouldReportActionBeVisibleAsLastAction,
isReportPreviewAction,
} from '@libs/ReportActionsUtils';
import {canUserPerformWriteAction as canUserPerformWriteActionUtil} from '@libs/ReportUtils';
import variables from '@styles/variables';
import CONST from '@src/CONST';
import NAVIGATORS from '@src/NAVIGATORS';
import ONYXKEYS from '@src/ONYXKEYS';
import type {PersonalDetails, Report, ReportAction} from '@src/types/onyx';
import type {PersonalDetails, Report} from '@src/types/onyx';
import {isEmptyObject} from '@src/types/utils/EmptyObject';
import OptionRowLHNData from './OptionRowLHNData';
import OptionRowRendererComponent from './OptionRowRendererComponent';
Expand Down Expand Up @@ -73,6 +73,7 @@
const [introSelected] = useOnyx(ONYXKEYS.NVP_INTRO_SELECTED, {canBeMissing: true});
const [onboarding] = useOnyx(ONYXKEYS.NVP_ONBOARDING, {canBeMissing: true});
const [isFullscreenVisible] = useOnyx(ONYXKEYS.FULLSCREEN_VISIBILITY, {canBeMissing: true});
const [visibleReportActionsData] = useOnyx(ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS, {canBeMissing: true});
const {accountID: currentUserAccountID} = useCurrentUserPersonalDetails();
const {policyForMovingExpensesID} = usePolicyForMovingExpenses();

Expand Down Expand Up @@ -193,9 +194,6 @@
}
const itemInvoiceReceiverPolicy = policy?.[`${ONYXKEYS.COLLECTION.POLICY}${invoiceReceiverPolicyID}`];

const iouReportIDOfLastAction = getIOUReportIDOfLastAction(item);
const itemIouReportReportActions = iouReportIDOfLastAction ? reportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReportIDOfLastAction}`] : undefined;

const itemPolicy = policy?.[`${ONYXKEYS.COLLECTION.POLICY}${item?.policyID}`];
const transactionID = isMoneyRequestAction(itemParentReportAction)
? (getOriginalMessage(itemParentReportAction)?.IOUTransactionID ?? CONST.DEFAULT_NUMBER_ID)
Expand All @@ -207,55 +205,56 @@

const isReportArchived = !!itemReportNameValuePairs?.private_isArchived;
const canUserPerformWrite = canUserPerformWriteActionUtil(item, isReportArchived);
const sortedReportActions = getSortedReportActionsForDisplay(itemReportActions, canUserPerformWrite);
const lastReportAction = sortedReportActions.at(0);
const lastAction = getLastVisibleAction(
reportID,
canUserPerformWrite,
{},
itemReportActions ? {[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${reportID}`]: itemReportActions} : undefined,
visibleReportActionsData,
);

// Get the transaction for the last report action
const lastReportActionTransactionID = isMoneyRequestAction(lastReportAction)
? (getOriginalMessage(lastReportAction)?.IOUTransactionID ?? CONST.DEFAULT_NUMBER_ID)
: CONST.DEFAULT_NUMBER_ID;
const iouReportIDOfLastAction = getIOUReportIDOfLastAction(item, visibleReportActionsData, lastAction);
const itemIouReportReportActions = iouReportIDOfLastAction ? reportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${iouReportIDOfLastAction}`] : undefined;

const lastReportActionTransactionID = isMoneyRequestAction(lastAction) ? (getOriginalMessage(lastAction)?.IOUTransactionID ?? CONST.DEFAULT_NUMBER_ID) : CONST.DEFAULT_NUMBER_ID;
const lastReportActionTransaction = transactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${lastReportActionTransactionID}`];

// SidebarUtils.getOptionData in OptionRowLHNData does not get re-evaluated when the linked task report changes, so we have the lastMessageTextFromReport evaluation logic here
let lastActorDetails: Partial<PersonalDetails> | null = item?.lastActorAccountID && personalDetails?.[item.lastActorAccountID] ? personalDetails[item.lastActorAccountID] : null;
if (!lastActorDetails && lastReportAction) {
const lastActorDisplayName = lastReportAction?.person?.[0]?.text;
const lastActorAccountID = getReportActionActorAccountID(lastAction, undefined, item) ?? item.lastActorAccountID;
let lastActorDetails: Partial<PersonalDetails> | null = lastActorAccountID && personalDetails?.[lastActorAccountID] ? personalDetails[lastActorAccountID] : null;

if (!lastActorDetails && lastAction) {
const lastActorDisplayName = lastAction?.person?.[0]?.text;
lastActorDetails = lastActorDisplayName
? {
displayName: lastActorDisplayName,
accountID: item?.lastActorAccountID,
accountID: lastActorAccountID,
}
: null;
}
const movedFromReport = reports?.[`${ONYXKEYS.COLLECTION.REPORT}${getMovedReportID(lastReportAction, CONST.REPORT.MOVE_TYPE.FROM)}`];
const movedToReport = reports?.[`${ONYXKEYS.COLLECTION.REPORT}${getMovedReportID(lastReportAction, CONST.REPORT.MOVE_TYPE.TO)}`];

const movedFromReport = reports?.[`${ONYXKEYS.COLLECTION.REPORT}${getMovedReportID(lastAction, CONST.REPORT.MOVE_TYPE.FROM)}`];
const movedToReport = reports?.[`${ONYXKEYS.COLLECTION.REPORT}${getMovedReportID(lastAction, CONST.REPORT.MOVE_TYPE.TO)}`];
const itemReportMetadata = reportMetadataCollection?.[`${ONYXKEYS.COLLECTION.REPORT_METADATA}${reportID}`];
const lastMessageTextFromReport = getLastMessageTextForReport({
translate,
report: item,
lastActorDetails,
movedFromReport,
movedToReport,
policy: itemPolicy,
isReportArchived: !!itemReportNameValuePairs?.private_isArchived,
policyForMovingExpensesID,
reportMetadata: itemReportMetadata,
currentUserAccountID,
});

const shouldShowRBRorGBRTooltip = firstReportIDWithGBRorRBR === reportID;
const shouldAlwaysRecalculateMessage = isReportArchived || isReportPreviewAction(lastAction);
const lastMessageTextFromReport =
(shouldAlwaysRecalculateMessage ? undefined : item.lastMessageText) ??
getLastMessageTextForReport({
translate,
report: item,
lastActorDetails,
movedFromReport,
movedToReport,
policy: itemPolicy,
isReportArchived,
policyForMovingExpensesID,
reportMetadata: itemReportMetadata,
visibleReportActionsDataParam: visibleReportActionsData,
lastAction,
currentUserAccountID,
});

let lastAction: ReportAction | undefined;
if (!itemReportActions || !item) {
lastAction = undefined;
} else {
const canUserPerformWriteAction = canUserPerformWriteActionUtil(item, isReportArchived);
const actionsArray = getSortedReportActions(Object.values(itemReportActions));
const reportActionsForDisplay = actionsArray.filter(
(reportAction) => shouldReportActionBeVisibleAsLastAction(reportAction, canUserPerformWriteAction) && reportAction.actionName !== CONST.REPORT.ACTIONS.TYPE.CREATED,
);
lastAction = reportActionsForDisplay.at(-1);
}
const shouldShowRBRorGBRTooltip = firstReportIDWithGBRorRBR === reportID;

let lastActionReport: OnyxEntry<Report> | undefined;
if (isInviteOrRemovedAction(lastAction)) {
Expand Down Expand Up @@ -331,6 +330,7 @@
isScreenFocused,
localeCompare,
translate,
visibleReportActionsData,
currentUserAccountID,
],
);
Expand Down
3 changes: 3 additions & 0 deletions src/components/LHNOptionsList/OptionRowLHNData.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ function OptionRowLHNData({

const [movedFromReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getMovedReportID(lastAction, CONST.REPORT.MOVE_TYPE.FROM)}`, {canBeMissing: true});
const [movedToReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${getMovedReportID(lastAction, CONST.REPORT.MOVE_TYPE.TO)}`, {canBeMissing: true});
const [visibleReportActionsData] = useOnyx(ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS, {canBeMissing: true});
// Check the report errors equality to avoid re-rendering when there are no changes
const prevReportErrors = usePrevious(reportAttributes?.reportErrors);
const areReportErrorsEqual = useMemo(() => deepEqual(prevReportErrors, reportAttributes?.reportErrors), [prevReportErrors, reportAttributes?.reportErrors]);
Expand Down Expand Up @@ -78,6 +79,7 @@ function OptionRowLHNData({
movedFromReport,
movedToReport,
currentUserAccountID,
visibleReportActionsData,
});
if (deepEqual(item, optionItemRef.current)) {
return optionItemRef.current;
Expand Down Expand Up @@ -114,6 +116,7 @@ function OptionRowLHNData({
movedFromReport,
movedToReport,
currentUserAccountID,
visibleReportActionsData,
]);

return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ import {
isCurrentActionUnread,
isDeletedParentAction,
isIOUActionMatchingTransactionList,
shouldReportActionBeVisible,
isReportActionVisible,
wasMessageReceivedWhileOffline,
} from '@libs/ReportActionsUtils';
import {canUserPerformWriteAction, chatIncludesChronosWithID, getOriginalReportID, getReportLastVisibleActionCreated, isHarvestCreatedExpenseReport, isUnread} from '@libs/ReportUtils';
Expand Down Expand Up @@ -171,6 +171,7 @@ function MoneyRequestReportActionsList({

const isReportArchived = useReportIsArchived(reportID);
const canPerformWriteAction = canUserPerformWriteAction(report, isReportArchived);
const [visibleReportActionsData] = useOnyx(ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS, {canBeMissing: true});

const {shouldUseNarrowLayout} = useResponsiveLayoutOnWideRHP();

Expand Down Expand Up @@ -226,17 +227,29 @@ function MoneyRequestReportActionsList({
const visibleReportActions = useMemo(() => {
const filteredActions = reportActions.filter((reportAction) => {
const isActionVisibleOnMoneyReport = isActionVisibleOnMoneyRequestReport(reportAction, shouldShowHarvestCreatedAction);
if (!isActionVisibleOnMoneyReport) {
return false;
}

return (
isActionVisibleOnMoneyReport &&
(isOffline || isDeletedParentAction(reportAction) || reportAction.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE || reportAction.errors) &&
shouldReportActionBeVisible(reportAction, reportAction.reportActionID, canPerformWriteAction) &&
isIOUActionMatchingTransactionList(reportAction, reportTransactionIDs)
);
const passesOfflineCheck = isOffline || isDeletedParentAction(reportAction) || reportAction.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE || reportAction.errors;
if (!passesOfflineCheck) {
return false;
}

const actionReportID = reportAction.reportID ?? reportID;
if (!isReportActionVisible(reportAction, actionReportID, canPerformWriteAction, visibleReportActionsData)) {
return false;
}

if (!isIOUActionMatchingTransactionList(reportAction, reportTransactionIDs)) {
return false;
}

return true;
});

return filteredActions.toReversed();
}, [reportActions, isOffline, canPerformWriteAction, reportTransactionIDs, shouldShowHarvestCreatedAction]);
}, [reportActions, isOffline, canPerformWriteAction, reportTransactionIDs, shouldShowHarvestCreatedAction, visibleReportActionsData, reportID]);

const reportActionSize = useRef(visibleReportActions.length);
const lastAction = visibleReportActions.at(-1);
Expand Down
5 changes: 3 additions & 2 deletions src/components/ParentNavigationSubtitle.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import useThemeStyles from '@hooks/useThemeStyles';
import {isFullScreenName} from '@libs/Navigation/helpers/isNavigatorName';
import Navigation from '@libs/Navigation/Navigation';
import type {RightModalNavigatorParamList} from '@libs/Navigation/types';
import {getReportAction, shouldReportActionBeVisible} from '@libs/ReportActionsUtils';
import {getReportAction, isReportActionVisible} from '@libs/ReportActionsUtils';
import {canUserPerformWriteAction as canUserPerformWriteActionReportUtils, isMoneyRequestReport} from '@libs/ReportUtils';
import CONST from '@src/CONST';
import type {ParentNavigationSummaryParams} from '@src/languages/params';
Expand Down Expand Up @@ -88,6 +88,7 @@ function ParentNavigationSubtitle({
const {translate} = useLocalize();
const [currentReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`, {canBeMissing: false});
const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${parentReportID}`, {canBeMissing: false});
const [visibleReportActionsData] = useOnyx(ONYXKEYS.DERIVED.VISIBLE_REPORT_ACTIONS, {canBeMissing: true});
const isReportArchived = useReportIsArchived(report?.reportID);
const canUserPerformWriteAction = canUserPerformWriteActionReportUtils(report, isReportArchived);
const isReportInRHP = currentRoute.name === SCREENS.RIGHT_MODAL.SEARCH_REPORT;
Expand Down Expand Up @@ -116,7 +117,7 @@ function ParentNavigationSubtitle({

const onPress = () => {
const parentAction = getReportAction(parentReportID, parentReportActionID);
const isVisibleAction = shouldReportActionBeVisible(parentAction, parentAction?.reportActionID ?? CONST.DEFAULT_NUMBER_ID, canUserPerformWriteAction);
const isVisibleAction = isReportActionVisible(parentAction, parentReportID, canUserPerformWriteAction, visibleReportActionsData);

const focusedNavigatorState = currentFocusedNavigator?.state;
const currentReportIndex = focusedNavigatorState?.index;
Expand Down
Loading
Loading