Repository navigation
Open
Labels
DailyKSv2KSv2ImprovementItem broken or needs improvement.Item broken or needs improvement.Skip PaymentSkips all the payment process steps for an issue. Use it for fixed-price projects.Skips all the payment process steps for an issue. Use it for fixed-price projects.
Description
Coming from #expert-contributors
Problem
Some components subscribe to Onyx values purely so they can pass them to event handlers and side effect functions. When a component subscribes to an Onyx value it never uses for rendering UI, a change to that value re-renders the component without changing anything on screen, which is unnecessary work.
Solution
Expose an Onyx.get() function that can lazily read values from the store
- Ship Onyx.get() in react-native-onyx. Onyx.get(key: TKey): Promise<ReadonlyDeep<OnyxValue>> on the public object, implemented on tryGetCachedValue wrapped in afterInit. That is the read useOnyx already performs, and it handles whole collections..
- Define where it may be called. Handlers, network callbacks, actions and library helpers whose return value no caller consumes synchronously, useCallback and useEffect bodies among them, since both run on an event. Never a render body, a useOnyx selector, a useMemo body, a useState or useReducer lazy initializer, a useSyncExternalStore snapshot or module scope..
- Ban the Search snapshot keys. Our useOnyx wrapper redirects those keys and Onyx.get does not, so it always returns live data and a converted subscription silently changes what a Search-scoped component sees. Scope membership is a runtime property of the mounted tree, so rather than try to decide it, a new lint rule refuses all seven search-overridden keys outright. The ban follows from the redirect, not from anything about the keys themselves. If a future initiative removes snapshot_ and useOnyx wrapper, the rule can be lifted and these high-traffic keys converted..
- Enforce it. New lint rule no-unsafe-onyx-read takes every misuse that one file's syntax decides, tsc takes the forgotten await and any attempt to mutate what comes back, and ONYX-1 review takes the rest. Broken down in the thread details..
- Prove it on one pilot. useSwitchToDelegator is a great candidate because it has 8 useOnyx subscriptions, none of which are used for rendering. PoC commit.
- Convert the easy cases in small PRs. 248 bindings whose value is only used at event time and needs no other change, across 123 files, batched into 19 independent PRs. Details in the thread..
Issue Owner
Current Issue Owner: @TaduJRMetadata
Metadata
Labels
DailyKSv2KSv2ImprovementItem broken or needs improvement.Item broken or needs improvement.Skip PaymentSkips all the payment process steps for an issue. Use it for fixed-price projects.Skips all the payment process steps for an issue. Use it for fixed-price projects.
Type
Projects
- StatusShow more project fieldsHIGH
Activity
chuckdries commentedon Sep 22, 2026
We may also want to do something like https://github.com/Expensify/App/blob/e9cc9d0c696597bf151fa877f7ac74f68c60a18b/.github/workflows/onyxConnectWithoutViewReviewers.yml where we ping a set of reviewers each time a new usage gets added
fabioh8010 commentedon Sep 23, 2026
Hey @chuckdries @tgolen @roryabraham @mountiny based on the lengthy discussion we had in the thread, @LukasMod and I came back with a revised rollout plan so we are all aligned before the next steps.
Phase 0 — API only
ReadonlyDeeptype for now. Why?Onyx.getonly in some test files already required ~50 signature changes inReportUtilsplus six other lib files. AnyReadonlyDeepvalue passed into a lib function typed with our current Onyx types requires changing that function's signature. Every handler in Phase 1 that passes a read value into a lib helper would hit the same thing, so we can't keep readonly and also promise "no lib changes" in the first Phases. I vote for removing it for now and revisiting it per key once we have real usages ofOnyx.getin the codebase.no-unsafe-onyx-read, ONYX-1, the docs and theaddUtilsToWindowcleanup, with three small additions to the lint rule:Onyx.getis allowed only undersrc/components,src/pages,src/hooksandtests. Everywhere else is an error.scripts/checkOnyxConnectBypass.tsalso coversno-unsafe-onyx-read, so an inlineeslint-disablefails CI.OnyxUtils.gettoo since we have a proper API now.Phase 1 — drop-in group, components and hooks
useOnyxline andawait Onyx.get(key)in the handler that used it. We can start with useSwitchToDelegator, which already has tests written before the conversion. We need to regenerate this list first though, since it was made before the proposal.useOnyxbindings were removed, whether any of the converted flows regressed, and how many of the ONYX-1 review comments caught real problems vs false alarms (this tells us how much maintenance the new API actually adds). Only then we decide if we continue to Phase 2.Phase 2 — the "needs a fix" group and lib replacements
On the component side, this is the
useOnyxusages that are not a straightforward change:useEffect. AuseOnyxusage can be replaced byOnyx.getinside an effect only if the Onyx value was not in that effect's dependency array. If it was, the subscription is what re-runs the effect and it stays. This is visible in the diff, so it can be a CI check instead of a review judgment.useOnyxcalls that use aselector.Onyx.gethas no selector option and returns the raw value, so the conversion has to call the selector on the result.useOnyxis used to build the key of the next one.On the lib side, this is where
connectWithoutViewgets reduced. Today ~91 of the ~195connectWithoutViewcalls only exist to keep a module variable up to date so a function can read it later, nothing reacts to the change. Those can become anawait Onyx.get(key)inside that function, but only when the function is already async, or when it returns nothing that a caller uses, so callers can keep calling it without changes. Same rule as above: if callers would have to become async, it goes to Phase 3. To keep this controlled, a lib file only gets added to the allowlist in a PR that also removes aconnectWithoutViewfrom that same file, reviewed by the same group that reviewsconnectWithoutViewtoday. Every approval removes a subscription instead of adding one.Phase 3 — reads moving into actions (follow-up work/proposal)
navigateToConciergeChatfrom 26 call sites to 1, plus every conversion Phases 1 and 2 skipped because it would make a chain of callers async, whether it started as auseOnyxin a component or aconnectWithoutViewin a lib.src/libs/actions, never in utils, with the render-reachability check running in CI for every converted function.tgolen commentedon Sep 23, 2026
I'd like to make a small request on the rollout plan. Could we please put the enforcement into place first, before introducing
.get()into the code?LukasMod commentedon Sep 24, 2026
I prepared 2 PRs based on @tgolen suggestion and the Phase 0 plan. I dropped the readonly changes to avoid having multiple signatures at this stage.
I also added one extra thing:
Onyx.multiGetfor reading multiple keys, which should prevent repetitivePromise.allblocks. Looking back at some previous PoCs, I often migrated multiple keys in a single handler, so it would be nice to have a ready-made method for those cases. WDYT about the idea and the name?rn-onyx: Expensify/react-native-onyx#850
get/multiGetE/App: #102135
OnyxUtils.getswap from testsaddUtilsToWindowchange, to resolve theget()override conflictmountiny commentedon Sep 24, 2026
Thanks for the update! Lets try to get on C+ for this
[-]Expose Onyx.get[/-][+][$1500] Expose Onyx.get[/+]melvin-bot commentedon Sep 24, 2026
mountiny commentedon Sep 24, 2026
@LukasMod @fabioh8010 - @aimane-chnaif will be C+ and reviewer on all the prs for this project. Please make sure they are tagged and added on all the prs as I think onyx prs will still autoassign randomly. Also feel free to start threads in Slack for PRs for easier communication so we can deliver this smoothly and sooner than later.
Thanks!
25 remaining items
aimane-chnaif commentedon Nov 3, 2026
@LukasMod from next PRs, can you please link to this issue (or create sub-issues and assign me) so I can be automatically assigned as reviewer?
would be great to have one person to review and test the Onyx changes in App + the onyx Bumps and I was elected.
TaduJR commentedon Nov 3, 2026
@aimane-chnaif
I thought you got re-assigned from slack https://expensify.slack.com/archives/C02NK2DQWUX/p1792577119686689?thread_ts=1792576979.553359&cid=C02NK2DQWUX. Could you please double check?
Thanks
maybe cc @mountiny
aimane-chnaif commentedon Nov 3, 2026
@TaduJR you were assigned only for this PR which had unrelated Onyx changes, not full project
TaduJR commentedon Nov 3, 2026
Hmm. I'm not sure how we can get forward. We already have Expensify/react-native-onyx#863, and Expensify/react-native-onyx#884. So we must be in sync with the other coming PRs I though @mountiny assigned for the whole project that's why got dive in to onyx. @mountiny could you decide how should we get forward.
Thanks!
mountiny commentedon Nov 3, 2026
@TaduJR no the project has been assigned to @aimane-chnaif
you had been assigned to help with that one pr linked in Slack that was left behind. I hope that is clear now
LukasMod commentedon Nov 5, 2026
Here’s a more detailed plan for the next PRs. I trimmed keys that don’t change after onboarding, plus a few other rarely changing ones, to keep this phase lean. 22 PRs, at most 10 files each. The first few will tell us how complex they get and whether the split is right. I expect most changes to be mechanical
Phase 1: PR list
22 PRs, 380 subscriptions in 172 files. Each PR replaces
useOnyxsubscriptions that only event handlers use with a one-timeOnyx.get/Onyx.multiGetread inside that handler.PR 1: src/hooks/useSwitchToDelegator.ts (pilot, open as #105771) (1 file, 8 subscriptions)
hooks/useSwitchToDelegator.tsswitchToDelegatorACCOUNT,CREDENTIALS,GPS_DRAFT_DETAILS,NVP_ACTIVE_POLICY_ID,SESSION,STASHED_CREDENTIALS,STASHED_SESSIONmultiGetin the press handler, thedelegatedAccessand GPS-tracking selectors are reapplied after the read.PR 2: src/pages/iou (1/3) (10 files, 30 subscriptions)
pages/iou/DynamicSplitBillDetailsPage.tsxonConfirmNVP_QUICK_ACTION_GLOBAL_CREATEpages/iou/DynamicSplitExpensePage.tsxonSaveSplitExpenseCOLLECTION.POLICY_TAGS,COLLECTION.REPORT_DRAFT,COLLECTION.SNAPSHOT,NVP_QUICK_ACTION_GLOBAL_CREATE,RECENTLY_USED_CURRENCIES??.pages/iou/RejectReasonPage.tsxonSubmitCOLLECTION.RULEpages/iou/request/ParticipantSearchResults.tsxonSelectRowCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDpages/iou/request/step/BaseRequestStepWorkspace.tsxselectWorkspaceCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDpages/iou/request/step/DynamicIOURequestEditReport.tsxremoveFromReportCARD_LIST,COLLECTION.POLICY_TAGS,COLLECTION.RULE,PERSONAL_POLICY_IDpages/iou/request/step/DynamicIOURequestEditReport.tsxcreateReportCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDpages/iou/request/step/DynamicIOURequestEditReport.tsxselectReportCARD_LIST,COLLECTION.POLICY_CATEGORIES,COLLECTION.POLICY_TAGS,COLLECTION.RULEpages/iou/request/step/DynamicIOURequestEditReport.tsxcreateReportForPolicyCOLLECTION.RULEpages/iou/request/step/DynamicIOURequestStepAttendees.tsxsaveAttendeesCOLLECTION.RULEpages/iou/request/step/DynamicIOURequestStepCompanyInfo.tsxsubmitCOLLECTION.POLICY_CATEGORIES,COLLECTION.POLICY_RECENTLY_USED_CATEGORIES,COLLECTION.POLICY_RECENTLY_USED_TAGS,COLLECTION.POLICY_TAGS,RECENTLY_USED_CURRENCIESpages/iou/request/step/DynamicIOURequestStepDate.tsxupdateDateCOLLECTION.RULE,NVP_LAST_SELECTED_DISTANCE_RATESpages/iou/request/step/DynamicIOURequestStepDescription.tsxupdateCommentCOLLECTION.RULEPR 3: src/pages/iou (2/3) (9 files, 23 subscriptions)
pages/iou/request/step/DynamicIOURequestStepDestination.tsxupdateDestinationCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDpages/iou/request/step/DynamicIOURequestStepDistanceManual.tsxnavigateToNextPageCOLLECTION.RULE,COLLECTION.SPLIT_TRANSACTION_DRAFT,NVP_LAST_SELECTED_DISTANCE_RATES,NVP_QUICK_ACTION_GLOBAL_CREATE,NVP_RECENT_WAYPOINTS,RECENTLY_USED_CURRENCIESpages/iou/request/step/DynamicIOURequestStepDistanceRate.tsxselectDistanceRateCOLLECTION.RULEpages/iou/request/step/DynamicIOURequestStepMerchant.tsxupdateMerchantCOLLECTION.RULEpages/iou/request/step/DynamicIOURequestStepTaxAmountPage.tsxupdateTaxAmountCOLLECTION.RULEpages/iou/request/step/DynamicIOURequestStepUpgrade.tsxafterUpgradeAcknowledgedCARD_LIST,COLLECTION.POLICY_CATEGORIES,COLLECTION.POLICY_TAGS,COLLECTION.RULEpages/iou/request/step/DynamicIOURequestStepWaypoint.tsxsaveNVP_RECENT_WAYPOINTSpages/iou/request/step/DynamicIOURequestStepWaypoint.tsxselectWaypointNVP_RECENT_WAYPOINTSpages/iou/request/step/IOURequestEditReportCommon.tsxhandleSelectReportCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDpages/iou/request/step/IOURequestEditReportCommon.tsxloadMoreOutstandingReportsHAS_MORE_OUTSTANDING_REPORTS_RESULTS,IS_LOADING_OUTSTANDING_REPORTSpages/iou/request/step/IOURequestStepConfirmation/useParticipantPickerState.tshandleParticipantsAddedNVP_LAST_SELECTED_DISTANCE_RATESPR 4: src/pages/iou (3/3) (7 files, 26 subscriptions)
pages/iou/request/step/IOURequestStepDistance/hooks/useOdometerNavigation.tsreturnedCOLLECTION.RULE,COLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_LAST_SELECTED_DISTANCE_RATES,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_END,NVP_QUICK_ACTION_GLOBAL_CREATE,RECENTLY_USED_CURRENCIESpages/iou/request/step/IOURequestStepDistanceGPS/index.native.tsxnavigateToNextStepCOLLECTION.RULE,NVP_LAST_SELECTED_DISTANCE_RATES,NVP_QUICK_ACTION_GLOBAL_CREATE,NVP_RECENT_WAYPOINTS,RECENTLY_USED_CURRENCIESpages/iou/request/step/IOURequestStepDistanceOdometer.tsxnavigateToNextPageCOLLECTION.RULEpages/iou/request/step/IOURequestStepHours.tsxonPressCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDpages/iou/request/step/IOURequestStepReport/hooks/useReportSelectionActions.tshandleRegularReportSelectionCARD_LIST,COLLECTION.POLICY_CATEGORIES,COLLECTION.POLICY_TAGS,COLLECTION.RULEpages/iou/request/step/IOURequestStepReport/hooks/useReportSelectionActions.tsremoveFromReportCARD_LIST,COLLECTION.POLICY_TAGS,COLLECTION.RULEpages/iou/request/step/IOURequestStepScan/components/ScanSkipConfirmation.tsxsubmitDirectlyNVP_ACTIVE_POLICY_ID,NVP_QUICK_ACTION_GLOBAL_CREATE,NVP_RECENT_WAYPOINTS,RECENTLY_USED_CURRENCIES,USER_LOCATIONpages/iou/request/step/confirmation/submission/useSendMoneySubmission.tssendMoneyNVP_QUICK_ACTION_GLOBAL_CREATEPR 5: src/pages/workspace (1/3) (8 files, 10 subscriptions)
pages/workspace/ConnectExistingBusinessBankAccountPage.tsxhandleItemPressNVP_LAST_PAYMENT_METHODpages/workspace/ConnectExistingBusinessBankAccountPage.tsxhandleAddBankAccountPressREIMBURSEMENT_ACCOUNTpages/workspace/WorkspaceMoreFeaturesPage/index.tsxonToggleNVP_QUICK_ACTION_GLOBAL_CREATEpages/workspace/WorkspaceOverviewPage.tsxhandleBackButtonPressIS_COMING_FROM_GLOBAL_REIMBURSEMENTS_FLOWpages/workspace/accounting/common/TravelBillingContinuousReconciliationSection.tsxonToggleCOLLECTION.TRAVEL_BILLING_CONTINUOUS_RECONCILIATION_CONNECTIONpages/workspace/accounting/reconciliation/CardReconciliationPage.tsxhandleToggleContinuousReconciliationCOLLECTION.EXPENSIFY_CARD_CONTINUOUS_RECONCILIATION_CONNECTIONpages/workspace/accounting/reconciliation/DynamicReconciliationAccountSettingsPage.tsxselectBankAccountCOLLECTION.TRAVEL_BILLING_CONTINUOUS_RECONCILIATION_CONNECTION,COLLECTION.TRAVEL_BILLING_USE_CONTINUOUS_RECONCILIATIONpages/workspace/companyCards/addNew/CardTypeStep.tsxsubmitCOLLECTION.LAST_SELECTED_FEEDpages/workspace/companyCards/addNew/CompanyCardsImportedPage.tsximportTransactionsCOLLECTION.LAST_SELECTED_FEEDPR 6: src/pages/workspace (2/3) (8 files, 11 subscriptions)
pages/workspace/companyCards/addNew/DetailsStep.tsxsubmitCOLLECTION.LAST_SELECTED_FEEDpages/workspace/companyCards/assignCard/ConfirmationStep.tsxsubmitCOLLECTION.WORKSPACE_CARDS_LIST,COUNTRYpages/workspace/copyPolicySettings/CopyPolicySettingsConfirmPage.tsxhandleCopyPolicySettingsCOLLECTION.POLICY_CATEGORIES,COLLECTION.POLICY_TAGS,COLLECTION.RULEpages/workspace/distanceRates/CreateDistanceRatePage.tsxsubmitCOLLECTION.TRANSACTION_DRAFTpages/workspace/distanceRates/PolicyDistanceRateGovernmentRateCountryPage.tsxsaveCountryGOVERNMENT_MILEAGE_RATESpages/workspace/distanceRates/PolicyDistanceRatesSettingsPage.tsxtoggleAutoUpdateGovernmentRateGOVERNMENT_MILEAGE_RATESpages/workspace/downgrade/DynamicWorkspaceDowngradePage.tsxonDowngradeToTeamCOLLECTION.POLICY_CATEGORIESpages/workspace/expensifyCard/WorkspaceCardsListLabel.tsxrequestLimitIncreaseIS_LOADING_APPPR 7: src/pages/workspace (3/3) (8 files, 12 subscriptions)
pages/workspace/expensifyCard/WorkspaceExpensifyCardPageEmptyState.tsxstartFlowBANK_ACCOUNT_LIST,CARD_SUPPORTED_COUNTRIESpages/workspace/expensifyCard/issueNew/ConfirmationStep.tsxhandleIssueCardACCOUNTpages/workspace/hr/HRApprovalModePageBase.tsxsaveApprovalModeCOLLECTION.POLICY_CONNECTION_SYNC_PROGRESS,COLLECTION.RULEpages/workspace/hr/HRApprovalModePageBase.tsxconfirmSaveApprovalModeCOLLECTION.RULEpages/workspace/members/WorkspaceInviteMessageComponent.tsxsendInvitationAPPROVAL_WORKFLOWpages/workspace/merge/MergeFinalApproverPageBase.tsxsetApproverCOLLECTION.POLICY_CONNECTION_SYNC_PROGRESSpages/workspace/recruiting/approver/MergeATSApprovalModePage.tsxsaveApprovalModeCOLLECTION.RULEpages/workspace/recruiting/approver/MergeATSApprovalModePage.tsxconfirmSaveApprovalModeCOLLECTION.RULEpages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsCreatePage.tsxcreateApprovalWorkflowCOLLECTION.RULEpages/workspace/workflows/tabs/WorkflowsPaymentsTab.tsxhandleBankAccountPressCONCIERGE_REPORT_ID,INITIATING_BANK_ACCOUNT_UNLOCK,NVP_INTRO_SELECTEDPR 8: src/hooks (1/2) (9 files, 35 subscriptions)
hooks/useApplyWorkspaceCurrencyChange.tsreturnedBANK_ACCOUNT_LIST,CARD_SUPPORTED_COUNTRIES,GOVERNMENT_MILEAGE_RATES,REIMBURSEMENT_ACCOUNThooks/useBulkDuplicateAction.tshandleDuplicateCOLLECTION.RULE,NVP_QUICK_ACTION_GLOBAL_CREATE,NVP_RECENT_WAYPOINTS,RECENTLY_USED_CURRENCIEShooks/useBulkDuplicateReportAction.tshandleDuplicateReportsCOLLECTION.POLICY_CATEGORIES,COLLECTION.POLICY_TAGS,COLLECTION.RULE,NVP_QUICK_ACTION_GLOBAL_CREATE,NVP_RECENT_WAYPOINTS,RECENTLY_USED_CURRENCIEShooks/useCreateReport.tsxcreateReportCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_END,SESSIONhooks/useExpenseActions.tsduplicateExpenseTransactionCOLLECTION.POLICY_CATEGORIES,NVP_QUICK_ACTION_GLOBAL_CREATE,NVP_RECENT_WAYPOINTS,RECENTLY_USED_CURRENCIEShooks/useExpenseActions.tsonSelectedBANK_ACCOUNT_LIST,COLLECTION.POLICY_CATEGORIES,NVP_QUICK_ACTION_GLOBAL_CREATE,NVP_RECENT_WAYPOINTS,RECENTLY_USED_CURRENCIEShooks/useHoldMenuSubmit.tsonSubmitBANK_ACCOUNT_LIST,COLLECTION.RULE,COLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDhooks/useHoldRejectActions.tsonSelectedCOLLECTION.RULE,NVP_DISMISSED_HOLD_USE_EXPLANATION,NVP_DISMISSED_REJECT_USE_EXPLANATIONhooks/useLifecycleActions.tsxonApproveCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDhooks/useLifecycleActions.tsxhandleSubmitReportCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDhooks/useMoneyReportHeaderEducationalModals.tsdismissModalAndUpdateUseHoldCOLLECTION.RULEhooks/useMoneyReportHeaderEducationalModals.tsdismissRejectModalBasedOnActionCOLLECTION.RULEPR 9: src/hooks (2/2) (8 files, 21 subscriptions)
hooks/useReceiptScanDrop.tsxsaveFileAndInitMoneyRequestCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,CURRENT_DATE,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDhooks/useRestoreWorkspacesTabOnNavigate.tsreturnedCOLLECTION.DOMAINhooks/useSaveReportField.tsreturnedCOLLECTION.RULE,RECENTLY_USED_REPORT_FIELDShooks/useSignOut.tsrunLeaveDelegateAccountSTASHED_CREDENTIALS,STASHED_SESSIONhooks/useUndeleteTransactions.tsreturnedCARD_LIST,COLLECTION.RULEhooks/useUpdateTransactionCategory.tsupdateCategoryCOLLECTION.POLICY_RECENTLY_USED_CATEGORIES,COLLECTION.POLICY_TAGS,COLLECTION.RULE,COLLECTION.SPLIT_TRANSACTION_DRAFThooks/useUpdateTransactionTag.tsupdateTagCOLLECTION.POLICY_CATEGORIES,COLLECTION.POLICY_RECENTLY_USED_TAGS,COLLECTION.RULEhooks/useUpdateTransactionTaxRate.tsupdateTaxRateCOLLECTION.POLICY_CATEGORIES,COLLECTION.POLICY_TAGS,COLLECTION.RULEPR 10: src/pages/settings (1/2) (6 files, 11 subscriptions)
pages/settings/Copilot/CopilotPage.tsxonPressSTASHED_CREDENTIALS,STASHED_SESSIONpages/settings/Rules/RulePageBase.tsxhandleSubmitNVP_EXPENSE_RULES??.pages/settings/Security/SecuritySettingsPage.tsxactionSESSION,STASHED_CREDENTIALS,STASHED_SESSION??.pages/settings/Subscription/SubscriptionPlan/SubscriptionPlanCardActionButton.tsxhandlePlanPressACCOUNTpages/settings/Subscription/SubscriptionSize/index.tsxonFinishedFORMS.SUBSCRIPTION_SIZE_FORM_DRAFTpages/settings/Wallet/ExpensifyCardPage/index.tsxonPressCOUNTRY_CODE,COUNTRY,PRIVATE_PERSONAL_DETAILS??.PR 11: src/pages/settings (2/2) (6 files, 17 subscriptions)
pages/settings/Wallet/ImportTransactionsSpreadsheetPage.tsxuploadStatementIMPORTED_SPREADSHEET,NVP_EXPENSIFY_COMPANY_CARDS_CUSTOM_NAMESpages/settings/Wallet/InternationalDepositAccount/subPages/Confirmation.tsxgetDataAndGoToNextStepCORPAY_FIELDSpages/settings/Wallet/PersonalCardDetailsPage.tsxconfirmDeleteCardNVP_SAVED_CSV_COLUMN_LAYOUT_LISTpages/settings/Wallet/TransactionsImportedPage.tsximportTransactionsNVP_EXPENSIFY_COMPANY_CARDS_CUSTOM_NAMESpages/settings/Wallet/UpdatePersonalBankAccountPage.tsxsubmitPersonalInfoCOUNTRY_CODE,FORMS.HOME_ADDRESS_FORM_DRAFT,FORMS.PERSONAL_BANK_ACCOUNT_FORM_DRAFT,PRIVATE_PERSONAL_DETAILS??.pages/settings/Wallet/WalletPage/index.tsxmakeDefaultPaymentMethodCOLLECTION.POLICY_MEMBER_BANK_ACCOUNTSpages/settings/Wallet/WalletPage/index.tsxconfirmDeleteCardNVP_SAVED_CSV_COLUMN_LAYOUT_LISTpages/settings/Wallet/WalletPage/index.tsxdeletePaymentMethodNVP_LAST_PAYMENT_METHOD,PERSONAL_POLICY_IDpages/settings/Wallet/WalletPage/index.tsxpaymentMethodPressedCOLLECTION.NVP_LOCKED_VBA_UNLOCK_REQUESTED,CONCIERGE_REPORT_ID,INITIATING_BANK_ACCOUNT_UNLOCK,NVP_INTRO_SELECTEDPR 12: src/pages/inbox (1/2) (7 files, 15 subscriptions)
pages/inbox/report/ContextMenu/PopoverReportActionContextMenu.tsxconfirmDeleteAndHideModalBANK_ACCOUNT_LIST,DERIVED.VISIBLE_REPORT_ACTIONSpages/inbox/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsxselectOptionCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDpages/inbox/report/ReportActionCompose/useComposerSubmit.tsvalidateAndSubmitDraftCONCIERGE_REPORT_ID,NVP_QUICK_ACTION_GLOBAL_CREATEpages/inbox/report/ReportActionCompose/useComposerSubmit.tssubmitDraftAndClearComposerCOLLECTION.REPORT_IS_COMPOSER_FULL_SIZEpages/inbox/report/ReportActionCompose/useReceiptDrop.tsonFilesValidatedCURRENT_DATEpages/inbox/report/ReportActionCompose/useReceiptDrop.tsonReceiptDroppedCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDpages/inbox/sidebar/FABPopoverContent/menuItems/CreateReportMenuItem.tsxhandleCreateWorkspaceReportCOLLECTION.RULEpages/inbox/sidebar/FABPopoverContent/menuItems/ExpenseMenuItem.tsxonPressSESSIONpages/inbox/sidebar/FABPopoverContent/menuItems/InvoiceMenuItem.tsxonPressSESSIONPR 13: src/pages/inbox (2/2) (6 files, 13 subscriptions)
pages/inbox/sidebar/FABPopoverContent/menuItems/NewChatMenuItem.tsxonPressSESSIONpages/inbox/sidebar/FABPopoverContent/menuItems/NewWorkspaceMenuItem.tsxonPressSESSIONpages/inbox/sidebar/FABPopoverContent/menuItems/QuickActionMenuItem.tsxonPressCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_LAST_DISTANCE_EXPENSE_TYPE,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_END,SESSIONpages/inbox/sidebar/FABPopoverContent/menuItems/QuickActionMenuItem.tsxselectOptionCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDpages/inbox/sidebar/FABPopoverContent/menuItems/TrackDistanceMenuItem.tsxonPressSESSIONpages/inbox/sidebar/FABPopoverContent/menuItems/TravelMenuItem.tsxonPressSESSIONpages/inbox/sidebar/FABPopoverContent/useScanActions.tsstartScanSESSIONpages/inbox/sidebar/FABPopoverContent/useScanActions.tsstartQuickScanCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_END,SESSIONPR 14: src/pages/Search (9 files, 19 subscriptions)
pages/Search/EmptySearchView.tsxhandleCreateMoneyRequestSESSIONpages/Search/EmptySearchView.tsxhandleCreateWorkspaceReportCOLLECTION.RULEpages/Search/SearchApproverPage.tsxaddApproverCOLLECTION.RULEpages/Search/SearchEditMultiple/SearchEditMultiplePage.tsxcommitCOLLECTION.RAM_ONLY_POLICY_TAGS_LOADING_STATEpages/Search/SearchHoldReasonPage.tsxonSubmitCOLLECTION.RULEpages/Search/SearchRejectReasonPage.tsxonSubmitCOLLECTION.RULEpages/Search/SearchReportsMergeReports.tsxmergeSelectedReportsBANK_ACCOUNT_LIST,CARD_LIST,COLLECTION.POLICY_CATEGORIES,COLLECTION.POLICY_TAGSpages/Search/SearchTransactionsChangeReport.tsxcreateReportForPolicyCOLLECTION.POLICY_CATEGORIES,COLLECTION.POLICY_TAGS,COLLECTION.RULEpages/Search/SearchTransactionsChangeReport.tsxselectReportCOLLECTION.POLICY_CATEGORIES,COLLECTION.POLICY_TAGS,COLLECTION.RULEpages/Search/SearchTransactionsChangeReport.tsxremoveFromReportCOLLECTION.POLICY_TAGS,COLLECTION.RULE,PERSONAL_POLICY_IDpages/Search/SearchTransactionsChangeReport.tsxcreateReportCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDpages/Search/SearchTypeMenuNarrow.tsxhandleTabPressSEARCH_FILTERSpages/Search/SearchTypeMenuWide.tsxarg of singleExecution()SEARCH_FILTERSPR 15: src/pages (other) (1/4) (9 files, 30 subscriptions)
pages/AddExistingExpense.tsxbuttonActionCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_END,SESSIONpages/DynamicNewReportWorkspaceSelectionPage.tsxcreateReportCARD_LIST,COLLECTION.POLICY_TAGS,COLLECTION.RULE,NVP_ACTIVE_POLICY_ID??.pages/DynamicNewReportWorkspaceSelectionPage.tsxselectPolicyCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDpages/DynamicReportChangeApproverPage.tsxchangeApproverCOLLECTION.RULEpages/DynamicReportChangeWorkspacePage.tsxselectPolicyCOLLECTION.RULE,COLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDpages/DynamicReportDetailsPage/ReportDetailsMenuLeaveItem.tsxleaveChatCONCIERGE_REPORT_ID,DERIVED.GUIDE_ACCOUNT_IDS,NVP_INTRO_SELECTED,NVP_QUICK_ACTION_GLOBAL_CREATEpages/DynamicReportDetailsPage/ReportDetailsTaskDeleteAction.tsxdeleteTransactionCONCIERGE_REPORT_ID,DERIVED.GUIDE_ACCOUNT_IDSpages/EnablePayments/Wallet/AddBankAccount/AddBankAccount.tsxsubmitFORMS.WALLET_ADDITIONAL_DETAILS_DRAFT,PERSONAL_POLICY_ID,PLAID_DATA,PRIVATE_PERSONAL_DETAILS,WALLET_ADDITIONAL_DETAILSpages/EnablePayments/Wallet/AddBankAccount/AddBankAccount.tsxexitFlowPERSONAL_BANK_ACCOUNTpages/EnablePayments/Wallet/FeesAndTerms/FeesAndTerms.tsxsubmitWALLET_TERMSpages/EnablePayments/shared/useWalletPhoneValidateCode.tssubmitPersonalDetailsPRIVATE_PERSONAL_DETAILSPR 16: src/pages (other) (2/4) (9 files, 12 subscriptions)
pages/MissingPersonalDetails/MissingPersonalDetailsContent.tsxhandleFinishStepCOUNTRY_CODEpages/OnboardingPersonalTrackGoal/BaseOnboardingPersonalTrackGoal.tsxcompleteTrackGoalSelectionFORMS.ONBOARDING_PERSONAL_DETAILS_FORMpages/OnboardingPurpose/BaseOnboardingPurpose.tsxonPressFORMS.ONBOARDING_PERSONAL_DETAILS_FORM,NVP_INTRO_SELECTED,ONBOARDING_COMPANY_SIZE,ONBOARDING_POLICY_IDpages/OnboardingWorkEmailValidation/BaseOnboardingWorkEmailValidation.tsxsendValidateCodeCREDENTIALSpages/ReimbursementAccount/EnterSignerInfo/index.tsxsubmitFORMS.ENTER_SINGER_INFO_FORM_DRAFTpages/ReimbursementAccount/ReimbursementAccountPage.tsxgoBackONFIDO_TOKENpages/ReimbursementAccount/USD/CompleteVerification/CompleteVerification.tsxsubmitNVP_LAST_PAYMENT_METHODpages/ReimbursementAccount/USD/Requestor/VerifyIdentity/VerifyIdentity.tsxhandleOnfidoSuccessONFIDO_APPLICANT_IDpages/RejectExpenseReportPage.tsxonSubmitCOLLECTION.RULEPR 17: src/pages (other) (3/4) (9 files, 14 subscriptions)
pages/ReportAddApproverPage.tsxaddApproverCOLLECTION.RULEpages/ReportReassignApproverPage.tsxsaveCOLLECTION.RULEpages/ReportSubmitToContent.tsxhandleSubmitCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDpages/SetDefaultWorkspacePage.tsxselectPolicyNVP_ACTIVE_POLICY_ID??.pages/Share/SubmitDetailsPage.tsxonConfirmNVP_LAST_LOCATION_PERMISSION_PROMPTpages/TransactionDuplicate/DynamicReviewPage.tsxonPreviewPressedTRANSACTION_THREAD_NAVIGATION_SNAPSHOT_HASH,TRANSACTION_THREAD_NAVIGATION_THREAD_REPORT_IDS,TRANSACTION_THREAD_NAVIGATION_TRANSACTION_IDSpages/TransactionDuplicate/DynamicReviewPage.tsxkeepAllCOLLECTION.RULEpages/TransactionMerge/DynamicConfirmationPage.tsxmergeExpensesCOLLECTION.RULEpages/Travel/DynamicTripDetailsPage.tsxonPressNVP_ACTIVE_POLICY_IDpages/Travel/EnableTravel/subPages/TermsStep.tsxcreateTravelEnablementIssueACCOUNTPR 18: src/pages (other) (4/4) (7 files, 11 subscriptions)
pages/domain/DomainsListPage.tsxonPressSESSIONpages/home/ForYouSection/ConciergePromptBox.tsxsendAttachmentSESSIONpages/home/ForYouSection/ConciergePromptBox.tsxsubmitSESSIONpages/home/ForYouSection/ConciergePromptBox.tsxonPressSESSIONpages/home/ForYouSection/ConciergePromptBox.tsxonPasteFileSESSIONpages/home/TimeSensitiveSection/items/UnlockBankAccount.tsxhandleCtaPressCOLLECTION.NVP_LOCKED_VBA_UNLOCK_REQUESTED,CONCIERGE_REPORT_ID,INITIATING_BANK_ACCOUNT_UNLOCK,NVP_INTRO_SELECTEDpages/signin/ChooseSSOOrValidateCode.tsxonPressCREDENTIALSpages/signin/SignUpWelcomeForm.tsxonPressMARKETING_ATTRIBUTION,NVP_PREFERRED_LOCALEpages/tasks/DynamicNewTaskDetailsPage.tsxonSubmitNVP_QUICK_ACTION_GLOBAL_CREATEpages/tasks/DynamicNewTaskPage.tsxonSubmitNVP_QUICK_ACTION_GLOBAL_CREATEPR 19: src/components (1/4) (9 files, 24 subscriptions)
components/AccountSwitcherButton.tsxonSelectedCREDENTIALS,NVP_ACTIVE_POLICY_ID,SESSIONcomponents/AddExistingExpenseFooter.tsxhandleConfirmCARD_LIST,COLLECTION.RULE,NVP_QUICK_ACTION_GLOBAL_CREATE,RECENTLY_USED_CURRENCIEScomponents/FloatingCameraButton/BaseFloatingCameraButton.tsxonPressCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_END,SESSIONcomponents/ImportOnyxState/index.native.tsxhandleFileReadACCOUNT,SESSIONcomponents/ImportOnyxState/index.tsxhandleFileReadACCOUNT,SESSIONcomponents/ImportSpreadsheet.tsxreadFileIMPORTED_SPREADSHEETcomponents/MoneyReportHeaderPrimaryAction/RemoveHoldPrimaryAction.tsxonPressCOLLECTION.RULEcomponents/MoneyReportHeaderPrimaryAction/SubmitPrimaryAction.tsxhandleSubmitCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDcomponents/MoneyReportHeaderPrimaryAction/useConfirmApproval.tsonApproveCOLLECTION.RULE,COLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDPR 20: src/components (2/4) (9 files, 14 subscriptions)
components/MoneyRequestConfirmationList/sections/AmountField.tsxbuildAndSaveSplitSharesCOLLECTION.SPLIT_TRANSACTION_DRAFTcomponents/MoneyRequestConfirmationList/sections/DateField.tsxhandleDateChangeCOLLECTION.SPLIT_TRANSACTION_DRAFT,NVP_LAST_SELECTED_DISTANCE_RATEScomponents/MoneyRequestConfirmationList/sections/DescriptionField.tsxhandleDescriptionInputChangeCOLLECTION.SPLIT_TRANSACTION_DRAFTcomponents/MoneyRequestConfirmationList/sections/MerchantField.tsxhandleMerchantInputChangeCOLLECTION.SPLIT_TRANSACTION_DRAFTcomponents/MoneyRequestConfirmationList/sections/TaxFields.tsxhandleTaxAmountChangeCOLLECTION.SPLIT_TRANSACTION_DRAFTcomponents/MoneyRequestHeaderSecondaryActions.tsxduplicateTransactionNVP_QUICK_ACTION_GLOBAL_CREATE,NVP_RECENT_WAYPOINTS,RECENTLY_USED_CURRENCIES??.components/MoneyRequestReportView/SearchMoneyRequestReportEmptyState.tsxonSelectedCOLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDcomponents/Navigation/AccountAvatarButton.tsxnavigateToAccountSESSIONcomponents/Navigation/DebugTabView.tsxnavigateToREIMBURSEMENT_ACCOUNTPR 21: src/components (3/4) (9 files, 14 subscriptions)
components/Navigation/NavigationTabBar/InsightsTabButton.tsxnavigateToInsightsSESSIONcomponents/Navigation/NavigationTabBar/SearchTabButton.tsxnavigateToSearchREPORT_NAVIGATION_LAST_SEARCH_QUERY,SESSIONcomponents/Navigation/NavigationTabBar/index.tsxnavigateToSettingsSESSIONcomponents/Navigation/QuickCreationActionsBar/index.tsxhandleDistanceNVP_LAST_DISTANCE_EXPENSE_TYPEcomponents/Navigation/QuickCreationActionsBar/index.tsxhandleCreateWorkspaceReportCOLLECTION.RULEcomponents/Reactions/ReportActionItemEmojiReactions.tsxonPressPREFERRED_EMOJI_SKIN_TONEcomponents/ReportActionItem/MoneyRequestReportPreview/useConfirmApproveReportAction.tsreturnedCOLLECTION.RULEcomponents/Search/FilterComponents/AdvancedFilters/SearchNLFilterContent.tsxhandleSubmitNVP_ACTIVE_POLICY_IDcomponents/Search/SearchBulkActionsButton.tsxpayBulkSelectedItemBANK_ACCOUNT_LIST,COLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END,NVP_PRIVATE_AMOUNT_OWED,NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_ENDcomponents/Search/SearchList/ListItem/TransactionGroupListExpanded.tsxhandleOnPressRAM_ONLY_MOBILE_SELECTION_MODEPR 22: src/components (4/4) (9 files, 10 subscriptions)
components/Search/SearchPageHeader/SearchActionsBarCreateButton.tsxonSelectedSESSIONcomponents/Search/SearchPageHeader/SearchActionsBarCreateButton.tsxhandleCreateWorkspaceReportCOLLECTION.RULEcomponents/Search/SearchRouter/useAskConcierge.tsxaskConciergeNVP_QUICK_ACTION_GLOBAL_CREATEcomponents/Search/SearchRouter/useCreateNavigationSuggestions.tsonCreateReportCOLLECTION.RULEcomponents/Search/hooks/useUpdateFilterQuery.tsxsetFilterQueryParamsFORMS.SEARCH_ADVANCED_FILTERS_FORMcomponents/Search/hooks/useUpdateFilterQuery.tsxupdateFilterQueryParamsFORMS.SEARCH_ADVANCED_FILTERS_FORMcomponents/SignInButtons/AppleSignIn/index.android.tsxhandleSignInNVP_PREFERRED_LOCALEcomponents/SignInButtons/AppleSignIn/index.ios.tsxhandleSignInNVP_PREFERRED_LOCALEcomponents/SignInButtons/GoogleSignIn/index.native.tsxonPressNVP_PREFERRED_LOCALEcomponents/Tables/WorkspaceCompanyCardsTable/WorkspaceCompanyCardsTableHeaderButtons.tsxopenBankConnectionCOUNTRYcomponents/ValidateCode/ValidateCodeModal.tsxsignInHereNVP_PREFERRED_LOCALELukasMod commentedon Nov 10, 2026
I plan to start working on the next planned PRs over the coming days. I'll be OOO on November 11 due to a national public holiday.
Update:
melvin-bot commentedon Nov 11, 2026
@TaduJR / @aimane-chnaif
The solution for this issue has been 🚀 deployed to production 🚀 in version 9.5.35-3 and is now subject to a 7-day regression period 📆. Here is the list of pull requests that resolve this issue: