From 367f867a3a1c96a2a98007a1ef7eb7ee17f3e6a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Tue, 25 Nov 2025 13:51:06 +0100 Subject: [PATCH 01/11] bump eslint config expensify --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7d4cd821631b..7f0fece693e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -245,7 +245,7 @@ "electron-builder": "26.0.19", "eslint": "^9.36.0", "eslint-config-airbnb-typescript": "^18.0.0", - "eslint-config-expensify": "2.0.99", + "eslint-config-expensify": "2.0.100", "eslint-config-prettier": "^9.1.0", "eslint-plugin-jest": "^29.0.1", "eslint-plugin-jsdoc": "^60.7.0", @@ -23632,9 +23632,9 @@ } }, "node_modules/eslint-config-expensify": { - "version": "2.0.99", - "resolved": "https://registry.npmjs.org/eslint-config-expensify/-/eslint-config-expensify-2.0.99.tgz", - "integrity": "sha512-9UTMrM6Li8yjKq1+h0xAHTyg6KAsch0ATgwQm3zvbIeSeeg/EbWxOnXCArrEbNGqAUbz6CC58pQiMsYrJeNSNw==", + "version": "2.0.100", + "resolved": "https://registry.npmjs.org/eslint-config-expensify/-/eslint-config-expensify-2.0.100.tgz", + "integrity": "sha512-+4Z0fSk6Evep94MqkMtfT4Dg14INm/jwKMZL2lg50UZsM1HECcBVEdRV8FDqOA7M2YfeDLE7jKz7lCXrNdi8VA==", "dev": true, "license": "ISC", "dependencies": { diff --git a/package.json b/package.json index a364ad0ed6ec..669522c01965 100644 --- a/package.json +++ b/package.json @@ -312,7 +312,7 @@ "electron-builder": "26.0.19", "eslint": "^9.36.0", "eslint-config-airbnb-typescript": "^18.0.0", - "eslint-config-expensify": "2.0.99", + "eslint-config-expensify": "2.0.100", "eslint-config-prettier": "^9.1.0", "eslint-plugin-jest": "^29.0.1", "eslint-plugin-jsdoc": "^60.7.0", From 486daf77641b7e4ce1886c99f9bb4cc7b3f79fba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Tue, 25 Nov 2025 13:55:03 +0100 Subject: [PATCH 02/11] add prefer-narrow-hook-dependencies rule --- eslint.config.mjs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/eslint.config.mjs b/eslint.config.mjs index c46379b91207..24c5b7246078 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -272,6 +272,16 @@ const config = defineConfig([ 'rulesdir/prefer-underscore-method': 'off', 'rulesdir/prefer-import-module-contents': 'off', 'rulesdir/no-beta-handler': 'error', + 'rulesdir/prefer-narrow-hook-dependencies': [ + 'error', + { + stableObjectPatterns: [ + '[Ss]tyles?$', // Excludes 'style', 'styles', 'themeStyles', etc. + '^theme', // Excludes 'theme', 'themeStyles', 'themeIllustrations', etc. + '[Ii]cons?$', // Excludes 'icon', 'icons', 'expensifyIcons', etc. + ], + }, + ], // React and React Native specific rules 'react-native-a11y/has-accessibility-hint': ['off'], From bcf81aabd54f708bc85db8089db6bcf462642a5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Tue, 25 Nov 2025 19:07:09 +0100 Subject: [PATCH 03/11] autofix run --- src/Expensify.tsx | 2 +- src/components/AddPlaidBankAccount.tsx | 2 +- src/components/ApproverSelectionList.tsx | 2 +- src/components/AvatarWithDisplayName.tsx | 2 +- .../BlockingViews/ForceFullScreenView/index.tsx | 2 +- src/components/DatePicker/CalendarPicker/index.tsx | 2 +- .../EmojiPickerMenu/useEmojiPickerMenu.ts | 2 +- .../FullScreenBlockingViewContextProvider.tsx | 2 +- src/components/Image/index.tsx | 2 +- src/components/LHNOptionsList/LHNOptionsList.tsx | 2 +- src/components/LocaleContextProvider.tsx | 2 +- src/components/MagicCodeInput.tsx | 4 ++-- src/components/MapView/MapView.tsx | 2 +- src/components/MapView/MapViewImpl.website.tsx | 6 +++--- src/components/MoneyRequestConfirmationList.tsx | 4 ++-- .../MoneyRequestReportActionsList.tsx | 4 ++-- src/components/Navigation/SearchSidebar.tsx | 2 +- src/components/NumberWithSymbolForm.tsx | 2 +- .../PopoverWithMeasuredContentBase.tsx | 4 ++-- src/components/ReportActionItem/MoneyReportView.tsx | 2 +- src/components/ReportActionItem/MoneyRequestView.tsx | 2 +- .../Search/FilterDropdowns/SingleSelectPopup.tsx | 2 +- .../Search/SearchPageHeader/SearchFiltersBar.tsx | 12 ++++++------ .../Search/SearchSingleSelectionPicker.tsx | 4 ++-- .../Search/TransactionGroupListExpanded.tsx | 4 ++-- .../Search/TransactionGroupListItem.tsx | 2 +- .../Search/TransactionListItem.tsx | 4 ++-- .../AgreementsFullStep/subSteps/Confirmation.tsx | 2 +- src/components/ThumbnailImage.tsx | 2 +- src/components/TimePicker/TimePicker.tsx | 4 ++-- .../EducationalTooltip/BaseEducationalTooltip.tsx | 2 +- .../ValidateCodeForm/BaseValidateCodeForm.tsx | 2 +- .../VideoPlayerContexts/PlaybackContext/index.tsx | 2 +- src/hooks/useIsAuthenticated.tsx | 2 +- src/hooks/useSearchResults.ts | 2 +- src/hooks/useSelectedTransactionsActions.ts | 2 +- src/libs/Accessibility/index.ts | 2 +- .../AppNavigator/Navigators/RightModalNavigator.tsx | 2 +- .../AppNavigator/usePreloadFullScreenNavigators.ts | 2 +- src/pages/AddPersonalBankAccountPage.tsx | 4 ++-- .../AddBankAccount/substeps/PlaidStep.tsx | 2 +- src/pages/InviteReportParticipantsPage.tsx | 6 +++--- .../BaseOnboardingInterestedFeatures.tsx | 2 +- .../BaseOnboardingWorkEmailValidation.tsx | 2 +- .../BaseOnboardingWorkspaceInvite.tsx | 2 +- src/pages/ProfilePage.tsx | 2 +- .../ReimbursementAccount/EnterSignerInfo/index.tsx | 2 +- .../ReimbursementAccount/NonUSD/Agreements/index.tsx | 2 +- .../BeneficialOwnerInfo/BeneficialOwnerInfo.tsx | 2 +- .../NonUSD/BusinessInfo/BusinessInfo.tsx | 2 +- .../BusinessInfo/subSteps/AverageReimbursement.tsx | 2 +- .../NonUSD/BusinessInfo/subSteps/BusinessType.tsx | 6 +++--- .../NonUSD/BusinessInfo/subSteps/PaymentVolume.tsx | 2 +- .../ReimbursementAccount/NonUSD/Docusign/index.tsx | 2 +- .../NonUSD/SignerInfo/HangTight.tsx | 2 +- .../ReimbursementAccount/NonUSD/SignerInfo/index.tsx | 4 ++-- .../ReimbursementAccount/USD/BankInfo/BankInfo.tsx | 2 +- .../USD/BankInfo/subSteps/Plaid.tsx | 2 +- .../USD/BusinessInfo/BusinessInfo.tsx | 4 ++-- .../CompleteVerification/CompleteVerification.tsx | 2 +- .../components/BankAccountValidationForm.tsx | 2 +- src/pages/ReportParticipantDetailsPage.tsx | 2 +- src/pages/ReportParticipantsPage.tsx | 6 +++--- src/pages/RoomInvitePage.tsx | 2 +- src/pages/RoomMemberDetailsPage.tsx | 2 +- src/pages/RoomMembersPage.tsx | 4 ++-- .../ScheduleCall/ScheduleCallConfirmationPage.tsx | 2 +- src/pages/Search/EmptySearchView.tsx | 2 +- src/pages/Share/ShareDetailsPage.tsx | 2 +- src/pages/TransactionMerge/DetailsReviewPage.tsx | 2 +- .../MergeTransactionsListContent.tsx | 6 +++--- src/pages/home/ReportScreen.tsx | 10 +++++----- src/pages/home/report/PureReportActionItem.tsx | 2 +- .../ComposerWithSuggestions.tsx | 2 +- .../ReportActionCompose/ReportActionCompose.tsx | 4 ++-- .../report/ReportActionCompose/SuggestionEmoji.tsx | 4 ++-- .../report/ReportActionCompose/SuggestionMention.tsx | 4 ++-- src/pages/home/report/ReportActionItemSingle.tsx | 2 +- src/pages/home/report/ReportActionsList.tsx | 4 ++-- src/pages/home/report/UserTypingEventListener.tsx | 2 +- .../home/sidebar/FloatingActionButtonAndPopover.tsx | 4 ++-- src/pages/iou/SplitExpensePage.tsx | 4 ++-- .../iou/request/MoneyRequestAttendeeSelector.tsx | 2 +- .../iou/request/MoneyRequestParticipantsSelector.tsx | 4 ++-- .../iou/request/step/IOURequestEditReportCommon.tsx | 4 ++-- .../iou/request/step/IOURequestStepDistance.tsx | 4 ++-- .../iou/request/step/IOURequestStepDistanceMap.tsx | 4 ++-- .../iou/request/step/IOURequestStepParticipants.tsx | 2 +- .../request/step/IOURequestStepPerDiemWorkspace.tsx | 2 +- .../request/step/IOURequestStepScan/index.native.tsx | 6 +++--- .../iou/request/step/IOURequestStepScan/index.tsx | 4 ++-- .../iou/request/step/IOURequestStepSendFrom.tsx | 2 +- .../routes/report/ReportAttachmentModalContent.tsx | 2 +- .../NewContactMethodConfirmMagicCodePage.tsx | 2 +- .../Profile/PersonalDetails/CountrySelectionPage.tsx | 2 +- src/pages/settings/Report/RoomNamePage.tsx | 2 +- .../Security/AddDelegate/AddDelegatePage.tsx | 4 ++-- .../UpdateDelegateMagicCodePage.tsx | 2 +- .../BusinessInfo/subSteps/AverageReimbursement.tsx | 2 +- .../BusinessInfo/subSteps/BusinessType.tsx | 4 ++-- .../BusinessInfo/subSteps/PaymentVolume.tsx | 2 +- src/pages/settings/Wallet/ReportCardLostPage.tsx | 2 +- src/pages/signin/LoginForm/BaseLoginForm.tsx | 4 ++-- .../signin/ValidateCodeForm/BaseValidateCodeForm.tsx | 4 ++-- src/pages/tasks/NewTaskDetailsPage.tsx | 2 +- src/pages/tasks/TaskAssigneeSelectorModal.tsx | 2 +- src/pages/workspace/WorkspaceInitialPage.tsx | 2 +- src/pages/workspace/WorkspaceInvitePage.tsx | 4 ++-- src/pages/workspace/WorkspaceOverviewAddressPage.tsx | 2 +- .../intacct/export/SageIntacctExportPage.tsx | 2 +- .../export/SageIntacctPreferredExporterPage.tsx | 4 ++-- .../qbo/export/QuickbooksExportDateSelectPage.tsx | 2 +- .../ReconciliationAccountSettingsPage.tsx | 2 +- .../XeroMapTrackingCategoryConfigurationPage.tsx | 2 +- .../WorkspaceCompanyCardPageEmptyState.tsx | 4 ++-- .../companyCards/addNew/PlaidConnectionStep.tsx | 2 +- .../companyCards/addNew/StatementCloseDateStep.tsx | 2 +- .../companyCards/assignCard/ConfirmationStep.tsx | 2 +- .../distanceRates/PolicyDistanceRateNameEditPage.tsx | 2 +- .../distanceRates/PolicyDistanceRatesPage.tsx | 6 +++--- .../expensifyCard/WorkspaceEditCardLimitTypePage.tsx | 2 +- .../workspace/members/WorkspaceMemberDetailsPage.tsx | 2 +- .../receiptPartners/WorkspaceReceiptPartnersPage.tsx | 2 +- src/pages/workspace/reports/WorkspaceReportsPage.tsx | 2 +- 124 files changed, 177 insertions(+), 177 deletions(-) diff --git a/src/Expensify.tsx b/src/Expensify.tsx index 2943bae16226..d082e9726527 100644 --- a/src/Expensify.tsx +++ b/src/Expensify.tsx @@ -133,7 +133,7 @@ function Expensify() { }, [isCheckingPublicRoom]); const isAuthenticated = useIsAuthenticated(); - const autoAuthState = useMemo(() => session?.autoAuthState ?? '', [session]); + const autoAuthState = useMemo(() => session?.autoAuthState ?? '', [session?.autoAuthState]); const isSplashReadyToBeHidden = splashScreenState === CONST.BOOT_SPLASH_STATE.READY_TO_BE_HIDDEN; const isSplashVisible = splashScreenState === CONST.BOOT_SPLASH_STATE.VISIBLE; diff --git a/src/components/AddPlaidBankAccount.tsx b/src/components/AddPlaidBankAccount.tsx index 1394a7138a0a..ab53b42d9862 100644 --- a/src/components/AddPlaidBankAccount.tsx +++ b/src/components/AddPlaidBankAccount.tsx @@ -103,7 +103,7 @@ function AddPlaidBankAccount({ */ const isAuthenticatedWithPlaid = useCallback( () => (!!receivedRedirectURI && !!plaidLinkOAuthToken) || !!plaidData?.bankAccounts?.length || !isEmptyObject(plaidData?.errors), - [plaidData, plaidLinkOAuthToken, receivedRedirectURI], + [plaidData?.bankAccounts?.length, plaidData?.errors, plaidLinkOAuthToken, receivedRedirectURI], ); /** diff --git a/src/components/ApproverSelectionList.tsx b/src/components/ApproverSelectionList.tsx index 9d07a20f6a94..5ad3f35e27af 100644 --- a/src/components/ApproverSelectionList.tsx +++ b/src/components/ApproverSelectionList.tsx @@ -137,7 +137,7 @@ function ApproverSelectionList({ contentFitImage="contain" /> ), - [translate, listEmptyContentSubtitle, styles.textSupporting, styles.pb10, lazyIllustrations], + [translate, listEmptyContentSubtitle, styles.textSupporting, styles.pb10, lazyIllustrations.TurtleInShell], ); return ( diff --git a/src/components/AvatarWithDisplayName.tsx b/src/components/AvatarWithDisplayName.tsx index 2b9378247359..80abc89e86d8 100644 --- a/src/components/AvatarWithDisplayName.tsx +++ b/src/components/AvatarWithDisplayName.tsx @@ -207,7 +207,7 @@ function AvatarWithDisplayName({ } const parentReportAction = parentReportActions?.[report?.parentReportActionID]; actorAccountID.current = parentReportAction?.actorAccountID ?? CONST.DEFAULT_NUMBER_ID; - }, [parentReportActions, report]); + }, [parentReportActions, report?.parentReportActionID]); const goToDetailsPage = useCallback(() => { navigateToDetailsPage(report, Navigation.getActiveRoute()); diff --git a/src/components/BlockingViews/ForceFullScreenView/index.tsx b/src/components/BlockingViews/ForceFullScreenView/index.tsx index f83c35aa038c..6282b48383f1 100644 --- a/src/components/BlockingViews/ForceFullScreenView/index.tsx +++ b/src/components/BlockingViews/ForceFullScreenView/index.tsx @@ -18,7 +18,7 @@ function ForceFullScreenView({children, shouldForceFullScreen = false}: ForceFul addRouteKey(route.key); return () => removeRouteKey(route.key); - }, [addRouteKey, removeRouteKey, route, shouldForceFullScreen]); + }, [addRouteKey, removeRouteKey, route.key, shouldForceFullScreen]); if (shouldForceFullScreen) { return {children}; diff --git a/src/components/DatePicker/CalendarPicker/index.tsx b/src/components/DatePicker/CalendarPicker/index.tsx index e4933cc1ef13..b46720c88c82 100644 --- a/src/components/DatePicker/CalendarPicker/index.tsx +++ b/src/components/DatePicker/CalendarPicker/index.tsx @@ -165,7 +165,7 @@ function CalendarPicker({ const newHeight = rowCount * CONST.CALENDAR_PICKER_DAY_HEIGHT; heightValue.set(withTiming(newHeight, {duration: 50})); - }, [calendarDaysMatrix, heightValue, isSmallScreenWidth]); + }, [calendarDaysMatrix?.length, heightValue, isSmallScreenWidth]); const animatedStyle = useAnimatedStyle(() => { return { diff --git a/src/components/EmojiPicker/EmojiPickerMenu/useEmojiPickerMenu.ts b/src/components/EmojiPicker/EmojiPickerMenu/useEmojiPickerMenu.ts index 7916a72b0310..4a18692c8c75 100644 --- a/src/components/EmojiPicker/EmojiPickerMenu/useEmojiPickerMenu.ts +++ b/src/components/EmojiPicker/EmojiPickerMenu/useEmojiPickerMenu.ts @@ -54,7 +54,7 @@ const useEmojiPickerMenu = () => { return [normalizedSearchTerm, emojisSuggestions] as const; }, - [allEmojis, preferredLocale], + [allEmojis.length, preferredLocale], ); return { diff --git a/src/components/FullScreenBlockingViewContextProvider.tsx b/src/components/FullScreenBlockingViewContextProvider.tsx index cffe8b55dc76..cb41c992943e 100644 --- a/src/components/FullScreenBlockingViewContextProvider.tsx +++ b/src/components/FullScreenBlockingViewContextProvider.tsx @@ -40,7 +40,7 @@ function FullScreenBlockingViewContextProvider({children}: FullScreenBlockingVie }); }, []); - const isBlockingViewVisible = useMemo(() => routeKeys.size > 0, [routeKeys]); + const isBlockingViewVisible = useMemo(() => routeKeys.size > 0, [routeKeys.size]); const contextValue = useMemo( () => ({ diff --git a/src/components/Image/index.tsx b/src/components/Image/index.tsx index 7964b5349672..33ad36dca0a3 100644 --- a/src/components/Image/index.tsx +++ b/src/components/Image/index.tsx @@ -101,7 +101,7 @@ function Image({ return session.creationDate; } return undefined; - }, [session, isAuthTokenRequired, isAcceptedSession]); + }, [session?.creationDate, isAuthTokenRequired, isAcceptedSession]); useEffect(() => { if (!isAuthTokenRequired) { return; diff --git a/src/components/LHNOptionsList/LHNOptionsList.tsx b/src/components/LHNOptionsList/LHNOptionsList.tsx index 91995ac2b304..823bb744a5eb 100644 --- a/src/components/LHNOptionsList/LHNOptionsList.tsx +++ b/src/components/LHNOptionsList/LHNOptionsList.tsx @@ -411,7 +411,7 @@ function LHNOptionsList({style, contentContainerStyles, data, onSelectRow, optio reportsIDsFromUseReportsCount: data.length, }); } - }, [data, shouldShowEmptyLHN, route, reports, reportActions, policy, personalDetails]); + }, [data.length, shouldShowEmptyLHN, route, reports, reportActions, policy, personalDetails]); return ( diff --git a/src/components/LocaleContextProvider.tsx b/src/components/LocaleContextProvider.tsx index 5a4fb048812a..fcb88455cd71 100644 --- a/src/components/LocaleContextProvider.tsx +++ b/src/components/LocaleContextProvider.tsx @@ -131,7 +131,7 @@ function LocaleContextProvider({children}: LocaleContextProviderProps) { setCurrentLocale(locale); }, [areTranslationsLoading]); - const selectedTimezone = useMemo(() => currentUserPersonalDetails?.timezone?.selected, [currentUserPersonalDetails]); + const selectedTimezone = useMemo(() => currentUserPersonalDetails?.timezone?.selected, [currentUserPersonalDetails?.timezone?.selected]); const collator = useMemo(() => new Intl.Collator(currentLocale, COLLATOR_OPTIONS), [currentLocale]); diff --git a/src/components/MagicCodeInput.tsx b/src/components/MagicCodeInput.tsx index 74a4cb7ab2ea..d0eee9f31b2f 100644 --- a/src/components/MagicCodeInput.tsx +++ b/src/components/MagicCodeInput.tsx @@ -169,7 +169,7 @@ function MagicCodeInput({ useEffect(() => { lastValue.current = input.length; - }, [input]); + }, [input.length]); useEffect(() => { // Note: there are circumstances where the value state isn't updated yet @@ -184,7 +184,7 @@ function MagicCodeInput({ return; } setWasSubmitted(false); - }, [value, maxLength]); + }, [value.length, maxLength]); const blurMagicCodeInput = () => { inputRef.current?.blur(); diff --git a/src/components/MapView/MapView.tsx b/src/components/MapView/MapView.tsx index f078e06ef33f..dac9d99b0c1d 100644 --- a/src/components/MapView/MapView.tsx +++ b/src/components/MapView/MapView.tsx @@ -211,7 +211,7 @@ function MapView({ animationDuration: CONST.MAPBOX.ANIMATION_DURATION_ON_CENTER_ME, zoomLevel: CONST.MAPBOX.SINGLE_MARKER_ZOOM, }); - }, [directionCoordinates, currentPosition, mapPadding, waypoints]); + }, [directionCoordinates, currentPosition?.longitude, currentPosition?.latitude, mapPadding, waypoints]); const centerCoordinate = useMemo(() => (currentPosition ? [currentPosition.longitude, currentPosition.latitude] : initialState?.location), [currentPosition, initialState?.location]); diff --git a/src/components/MapView/MapViewImpl.website.tsx b/src/components/MapView/MapViewImpl.website.tsx index 4e8ce82aabb3..82ba6c736beb 100644 --- a/src/components/MapView/MapViewImpl.website.tsx +++ b/src/components/MapView/MapViewImpl.website.tsx @@ -135,7 +135,7 @@ function MapViewImpl({ zoom: CONST.MAPBOX.DEFAULT_ZOOM, animate: shouldAnimate, }); - }, [currentPosition, mapRef, prevUserPosition, shouldPanMapToCurrentPosition]); + }, [currentPosition, mapRef, prevUserPosition.longitude, prevUserPosition.latitude, shouldPanMapToCurrentPosition]); const resetBoundaries = useCallback(() => { if (!waypoints || waypoints.length === 0) { @@ -224,7 +224,7 @@ function MapViewImpl({ animate: true, duration: CONST.MAPBOX.ANIMATION_DURATION_ON_CENTER_ME, }); - }, [directionCoordinates, currentPosition, mapRef, waypoints, mapPadding]); + }, [directionCoordinates, currentPosition?.longitude, currentPosition?.latitude, mapRef, waypoints, mapPadding]); const initialViewState: Partial | undefined = useMemo(() => { if (!interactive) { @@ -245,7 +245,7 @@ function MapViewImpl({ latitude: currentPosition?.latitude, zoom: initialState.zoom, }; - }, [waypoints, directionCoordinates, interactive, currentPosition, initialState.zoom]); + }, [waypoints, directionCoordinates, interactive, currentPosition?.longitude, currentPosition?.latitude, initialState.zoom]); const distanceSymbolCoordinate = useMemo(() => { if (!directionCoordinates?.length || !waypoints?.length) { diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx index ac601e5f361e..7352ab7fec57 100755 --- a/src/components/MoneyRequestConfirmationList.tsx +++ b/src/components/MoneyRequestConfirmationList.tsx @@ -453,7 +453,7 @@ function MoneyRequestConfirmationList({ // If none of the above conditions are met, display the rate error setFormError(errorKey); - }, [isDistanceRequest, isPolicyExpenseChat, transactionID, mileageRate, customUnitRateID, policy, isMovingTransactionFromTrackExpense, setFormError, clearFormErrors]); + }, [isDistanceRequest, isPolicyExpenseChat, transactionID, mileageRate.rate, mileageRate.unit, customUnitRateID, policy, isMovingTransactionFromTrackExpense, setFormError, clearFormErrors]); const routeError = Object.values(transaction?.errorFields?.route ?? {}).at(0); const isFirstUpdatedDistanceAmount = useRef(false); @@ -565,7 +565,7 @@ function MoneyRequestConfirmationList({ const amountInCents = convertToBackendAmount(value); setIndividualShare(transaction?.transactionID, accountID, amountInCents); }, - [transaction], + [transaction?.transactionID], ); useEffect(() => { diff --git a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx index ac77aa36ffec..490346ed63a0 100644 --- a/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx +++ b/src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx @@ -193,7 +193,7 @@ function MoneyRequestReportActionsList({ policyID: policy?.id, }); }, - [report, policy], + [report, policy?.id], ); const { @@ -442,7 +442,7 @@ function MoneyRequestReportActionsList({ previousLastIndex.current = lastActionIndex; reportActionSize.current = visibleReportActions.length; hasNewestReportActionRef.current = hasNewestReportAction; - }, [lastActionIndex, reportActions, reportScrollManager, hasNewestReportAction, visibleReportActions.length, setIsFloatingMessageCounterVisible]); + }, [lastActionIndex, reportActions.length, reportScrollManager, hasNewestReportAction, visibleReportActions.length, setIsFloatingMessageCounterVisible]); /** * Subscribe to read/unread events and update our unreadMarkerTime diff --git a/src/components/Navigation/SearchSidebar.tsx b/src/components/Navigation/SearchSidebar.tsx index caebc42a49d9..c5b667728ff1 100644 --- a/src/components/Navigation/SearchSidebar.tsx +++ b/src/components/Navigation/SearchSidebar.tsx @@ -53,7 +53,7 @@ function SearchSidebar({state}: SearchSidebarProps) { } setLastSearchType(currentSearchResults.type); - }, [lastSearchType, queryJSON, setLastSearchType, currentSearchResults]); + }, [lastSearchType, queryJSON, setLastSearchType, currentSearchResults?.type]); const shouldShowLoadingState = route?.name === SCREENS.SEARCH.MONEY_REQUEST_REPORT ? false : !isOffline && !!currentSearchResults?.isLoading; diff --git a/src/components/NumberWithSymbolForm.tsx b/src/components/NumberWithSymbolForm.tsx index 9bfbc8f74db4..7563b167da3a 100644 --- a/src/components/NumberWithSymbolForm.tsx +++ b/src/components/NumberWithSymbolForm.tsx @@ -306,7 +306,7 @@ function NumberWithSymbolForm({ const newNumber = addLeadingZero(`${currentNumber.substring(0, selection.start)}${key}${currentNumber.substring(selection.end)}`); setNewNumber(newNumber); }, - [currentNumber, selection, shouldUpdateSelection, setNewNumber], + [currentNumber, selection.start, selection.end, shouldUpdateSelection, setNewNumber], ); /** diff --git a/src/components/PopoverWithMeasuredContent/PopoverWithMeasuredContentBase.tsx b/src/components/PopoverWithMeasuredContent/PopoverWithMeasuredContentBase.tsx index 1d1e7abe6811..c3e24ed936fc 100644 --- a/src/components/PopoverWithMeasuredContent/PopoverWithMeasuredContentBase.tsx +++ b/src/components/PopoverWithMeasuredContent/PopoverWithMeasuredContentBase.tsx @@ -148,7 +148,7 @@ function PopoverWithMeasuredContentBase({ ...horizontalConstraint, ...verticalConstraint, }; - }, [anchorPosition, anchorAlignment, popoverWidth, popoverHeight]); + }, [anchorPosition.horizontal, anchorPosition.vertical, anchorAlignment.horizontal, anchorAlignment.vertical, popoverWidth, popoverHeight]); const positionCalculations = useMemo(() => { const horizontalShift = PopoverWithMeasuredContentUtils.computeHorizontalShift(adjustedAnchorPosition.left, popoverWidth, availableWidth); @@ -182,7 +182,7 @@ function PopoverWithMeasuredContentBase({ } return result; - }, [adjustedAnchorPosition, positionCalculations, anchorAlignment.vertical, windowHeight, popoverHeight, shouldMeasureAnchorPositionFromTop]); + }, [adjustedAnchorPosition.left, adjustedAnchorPosition.top, positionCalculations.horizontalShift, positionCalculations.verticalShift, anchorAlignment.vertical, windowHeight, popoverHeight, shouldMeasureAnchorPositionFromTop]); return isContentMeasured ? ( ((): PolicyReportField[] => { const fields = getAvailableReportFields(report, Object.values(policy?.fieldList ?? {})); return fields.filter((field) => field.target === report?.type).sort(({orderWeight: firstOrderWeight}, {orderWeight: secondOrderWeight}) => firstOrderWeight - secondOrderWeight); - }, [policy, report]); + }, [policy?.fieldList, report]); const enabledReportFields = sortedPolicyReportFields.filter( (reportField) => !isReportFieldDisabled(report, reportField, policy) || reportField.type === CONST.REPORT_FIELD_TYPES.FORMULA, diff --git a/src/components/ReportActionItem/MoneyRequestView.tsx b/src/components/ReportActionItem/MoneyRequestView.tsx index 4ce1537ccd07..32dcf1402143 100644 --- a/src/components/ReportActionItem/MoneyRequestView.tsx +++ b/src/components/ReportActionItem/MoneyRequestView.tsx @@ -352,7 +352,7 @@ function MoneyRequestView({ } updateMoneyRequestReimbursable(transaction.transactionID, report?.reportID, newReimbursable, policy, policyTagList, policyCategories); }, - [transaction, report, policy, policyTagList, policyCategories], + [transaction, report?.reportID, policy, policyTagList, policyCategories], ); if (isCardTransaction) { diff --git a/src/components/Search/FilterDropdowns/SingleSelectPopup.tsx b/src/components/Search/FilterDropdowns/SingleSelectPopup.tsx index 7128bfeb6811..aedc2d1621a9 100644 --- a/src/components/Search/FilterDropdowns/SingleSelectPopup.tsx +++ b/src/components/Search/FilterDropdowns/SingleSelectPopup.tsx @@ -93,7 +93,7 @@ function SingleSelectPopup({label, value, items, closeOverlay, ], noResultsFound: false, }; - }, [isSearchable, items, value, selectedItem, debouncedSearchTerm]); + }, [isSearchable, items, value, selectedItem?.value, debouncedSearchTerm]); const dataLength = useMemo(() => sections.flatMap((section) => section.data).length, [sections]); diff --git a/src/components/Search/SearchPageHeader/SearchFiltersBar.tsx b/src/components/Search/SearchPageHeader/SearchFiltersBar.tsx index bc887099729f..a2ba613256fe 100644 --- a/src/components/Search/SearchPageHeader/SearchFiltersBar.tsx +++ b/src/components/Search/SearchPageHeader/SearchFiltersBar.tsx @@ -169,7 +169,7 @@ function SearchFiltersBar({ return [options, value]; }, [allPolicies, email, unsafeType]); - const isExpenseReportType = useMemo(() => type?.value === CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT, [type]); + const isExpenseReportType = useMemo(() => type?.value === CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT, [type?.value]); const selectedItemsCount = useMemo(() => { if (!selectedTransactions) { @@ -222,7 +222,7 @@ function SearchFiltersBar({ const options = getHasOptions(type?.value ?? CONST.SEARCH.DATA_TYPES.EXPENSE); const value = hasFilterValues ? options.filter((option) => hasFilterValues.includes(option.value)) : []; return [options, value]; - }, [flatFilters, type]); + }, [flatFilters, type?.value]); const [isOptions, is] = useMemo(() => { const isFilterValues = flatFilters.find((filter) => filter.key === CONST.SEARCH.SYNTAX_FILTER_KEYS.IS)?.filters?.map((filter) => filter.value); @@ -651,10 +651,10 @@ function SearchFiltersBar({ return filterList; }, [ - type, - groupBy, - groupCurrency, - withdrawalType, + type?.value, type?.text, + groupBy?.value, groupBy?.text, + groupCurrency?.value, + withdrawalType?.text, displayDate, displayPosted, displayWithdrawn, diff --git a/src/components/Search/SearchSingleSelectionPicker.tsx b/src/components/Search/SearchSingleSelectionPicker.tsx index 14a9d6aafb38..8d7bb829bb0f 100644 --- a/src/components/Search/SearchSingleSelectionPicker.tsx +++ b/src/components/Search/SearchSingleSelectionPicker.tsx @@ -70,7 +70,7 @@ function SearchSingleSelectionPicker({items, initiallySelectedItem, pickerTitle, ], noResultsFound: isEmpty, }; - }, [initiallySelectedItem, selectedItem, items, pickerTitle, debouncedSearchTerm]); + }, [initiallySelectedItem, selectedItem?.value, items, pickerTitle, debouncedSearchTerm]); const onSelectItem = useCallback((item: Partial) => { if (!item.text || !item.keyForList || !item.value) { @@ -88,7 +88,7 @@ function SearchSingleSelectionPicker({items, initiallySelectedItem, pickerTitle, const applyChanges = useCallback(() => { onSaveSelection(selectedItem?.value); Navigation.goBack(ROUTES.SEARCH_ADVANCED_FILTERS.getRoute()); - }, [onSaveSelection, selectedItem]); + }, [onSaveSelection, selectedItem?.value]); const footerContent = useMemo( () => ( diff --git a/src/components/SelectionListWithSections/Search/TransactionGroupListExpanded.tsx b/src/components/SelectionListWithSections/Search/TransactionGroupListExpanded.tsx index a806d85e147a..3a31e59d70e1 100644 --- a/src/components/SelectionListWithSections/Search/TransactionGroupListExpanded.tsx +++ b/src/components/SelectionListWithSections/Search/TransactionGroupListExpanded.tsx @@ -51,7 +51,7 @@ function TransactionGroupListExpanded({ const {currentSearchHash} = useSearchContext(); const transactionsSnapshotMetadata = useMemo(() => { return transactionsSnapshot?.search; - }, [transactionsSnapshot]); + }, [transactionsSnapshot?.search]); const visibleTransactions = useMemo(() => { if (isExpenseReportType) { @@ -64,7 +64,7 @@ function TransactionGroupListExpanded({ (index: number) => { return index === visibleTransactions.length - 1; }, - [visibleTransactions], + [visibleTransactions.length], ); const currentColumns = useMemo(() => { diff --git a/src/components/SelectionListWithSections/Search/TransactionGroupListItem.tsx b/src/components/SelectionListWithSections/Search/TransactionGroupListItem.tsx index 318f8764bf19..d16f9fbb169d 100644 --- a/src/components/SelectionListWithSections/Search/TransactionGroupListItem.tsx +++ b/src/components/SelectionListWithSections/Search/TransactionGroupListItem.tsx @@ -78,7 +78,7 @@ function TransactionGroupListItem({ const [oneTransaction] = originalUseOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${oneTransactionItem?.transactionID}`, {canBeMissing: true}); const parentReportActionSelector = useCallback( (reportActions: OnyxEntry): OnyxEntry => reportActions?.[`${oneTransactionItem?.moneyRequestReportActionID}`], - [oneTransactionItem], + [oneTransactionItem?.moneyRequestReportActionID], ); const [parentReportAction] = originalUseOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${oneTransactionItem?.reportID}`, {selector: parentReportActionSelector, canBeMissing: true}, [ oneTransactionItem, diff --git a/src/components/SelectionListWithSections/Search/TransactionListItem.tsx b/src/components/SelectionListWithSections/Search/TransactionListItem.tsx index 5d94b386ecf8..b3a7635c3815 100644 --- a/src/components/SelectionListWithSections/Search/TransactionListItem.tsx +++ b/src/components/SelectionListWithSections/Search/TransactionListItem.tsx @@ -71,7 +71,7 @@ function TransactionListItem({ const [transaction] = originalUseOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionItem.transactionID}`, {canBeMissing: true}); const parentReportActionSelector = useCallback( (reportActions: OnyxEntry): OnyxEntry => reportActions?.[`${transactionItem?.moneyRequestReportActionID}`], - [transactionItem], + [transactionItem?.moneyRequestReportActionID], ); const [parentReportAction] = originalUseOnyx(`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transactionItem.reportID}`, {selector: parentReportActionSelector, canBeMissing: true}, [ transactionItem, @@ -102,7 +102,7 @@ function TransactionListItem({ taxAmountColumnSize: transactionItem.isTaxAmountColumnWide ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL, dateColumnSize: transactionItem.shouldShowYear ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL, }; - }, [transactionItem]); + }, [transactionItem.isAmountColumnWide, transactionItem.isTaxAmountColumnWide, transactionItem.shouldShowYear]); const transactionViolations = useMemo(() => { return (violations?.[`${ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS}${transactionItem.transactionID}`] ?? []).filter( diff --git a/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx b/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx index d9d37d23230e..6ce1a75e6c39 100644 --- a/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx +++ b/src/components/SubStepForms/AgreementsFullStep/subSteps/Confirmation.tsx @@ -62,7 +62,7 @@ function Confirmation({defaultValue const stepFields = useMemo( () => [inputIDs.authorizedToBindClientToAgreement, inputIDs.provideTruthfulInformation, inputIDs.agreeToTermsAndConditions, inputIDs.consentToPrivacyNotice], - [inputIDs], + [inputIDs.authorizedToBindClientToAgreement, inputIDs.provideTruthfulInformation, inputIDs.agreeToTermsAndConditions, inputIDs.consentToPrivacyNotice], ); const validate = useCallback( diff --git a/src/components/ThumbnailImage.tsx b/src/components/ThumbnailImage.tsx index 5631c08a4e7a..cfa36a5bd922 100644 --- a/src/components/ThumbnailImage.tsx +++ b/src/components/ThumbnailImage.tsx @@ -134,7 +134,7 @@ function ThumbnailImage({ setImageDimensions({width, height}); }, - [previewSourceURL, imageDimensions, shouldDynamicallyResize], + [previewSourceURL, imageDimensions.width, imageDimensions.height, shouldDynamicallyResize], ); const sizeStyles = shouldDynamicallyResize ? [thumbnailDimensionsStyles] : [styles.w100, styles.h100]; diff --git a/src/components/TimePicker/TimePicker.tsx b/src/components/TimePicker/TimePicker.tsx index 12b4d4cf4d4f..fffb95c41aa4 100644 --- a/src/components/TimePicker/TimePicker.tsx +++ b/src/components/TimePicker/TimePicker.tsx @@ -652,7 +652,7 @@ function TimePicker({defaultValue = '', onSubmit, onInputChange = () => {}, shou } }, // eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps - [selectionHour, selectionMinute], + [selectionHour, selectionMinute.start], ); const arrowRightCallback = useCallback( (e?: GestureResponderEvent | KeyboardEvent) => { @@ -673,7 +673,7 @@ function TimePicker({defaultValue = '', onSubmit, onInputChange = () => {}, shou } }, // eslint-disable-next-line react-compiler/react-compiler, react-hooks/exhaustive-deps - [selectionHour, selectionMinute, selectionSecond, selectionMillisecond], + [selectionHour.start, selectionMinute.start, selectionSecond.start, selectionMillisecond], ); useKeyboardShortcut(CONST.KEYBOARD_SHORTCUTS.ARROW_LEFT, arrowLeftCallback, arrowConfig); diff --git a/src/components/Tooltip/EducationalTooltip/BaseEducationalTooltip.tsx b/src/components/Tooltip/EducationalTooltip/BaseEducationalTooltip.tsx index 9119fe379b7e..5b33e9041f2f 100644 --- a/src/components/Tooltip/EducationalTooltip/BaseEducationalTooltip.tsx +++ b/src/components/Tooltip/EducationalTooltip/BaseEducationalTooltip.tsx @@ -65,7 +65,7 @@ function BaseEducationalTooltip({children, shouldRender = false, shouldHideOnNav showTooltip(); } }); - }, [insets, shouldSuppressTooltip]); + }, [insets.top, insets.bottom, insets.left, insets.right, shouldSuppressTooltip]); useEffect(() => { if (!genericTooltipStateRef.current || !shouldRender) { diff --git a/src/components/ValidateCodeActionModal/ValidateCodeForm/BaseValidateCodeForm.tsx b/src/components/ValidateCodeActionModal/ValidateCodeForm/BaseValidateCodeForm.tsx index bac3c52b7a3a..b15b3db0fb59 100644 --- a/src/components/ValidateCodeActionModal/ValidateCodeForm/BaseValidateCodeForm.tsx +++ b/src/components/ValidateCodeActionModal/ValidateCodeForm/BaseValidateCodeForm.tsx @@ -272,7 +272,7 @@ function BaseValidateCodeForm({ return translate(formError?.validateCode); } return getLatestErrorMessage(account ?? {}); - }, [canShowError, formError, account, translate]); + }, [canShowError, formError?.validateCode, account, translate]); const shouldShowTimer = isCountdownRunning && !isOffline; diff --git a/src/components/VideoPlayerContexts/PlaybackContext/index.tsx b/src/components/VideoPlayerContexts/PlaybackContext/index.tsx index 0ce29dda869e..48ef7777267c 100644 --- a/src/components/VideoPlayerContexts/PlaybackContext/index.tsx +++ b/src/components/VideoPlayerContexts/PlaybackContext/index.tsx @@ -126,7 +126,7 @@ function PlaybackContextProvider({children}: ChildrenProps) { videoResumeTryNumberRef: video.resumeTryNumberRef, resetVideoPlayerData: video.resetPlayerData, }), - [updateCurrentURLAndReportID, currentlyPlayingURL, currentRouteReportID, originalParent, sharedElement, video, shareVideoPlayerElements], + [updateCurrentURLAndReportID, currentlyPlayingURL, currentRouteReportID, originalParent, sharedElement, video.ref, video.play, video.pause, video.stop, video.isPlaying, video.resumeTryNumberRef, video.resetPlayerData, shareVideoPlayerElements], ); return {children}; diff --git a/src/hooks/useIsAuthenticated.tsx b/src/hooks/useIsAuthenticated.tsx index 011b50de3cc8..3c0d6d6a5473 100644 --- a/src/hooks/useIsAuthenticated.tsx +++ b/src/hooks/useIsAuthenticated.tsx @@ -4,7 +4,7 @@ import useOnyx from './useOnyx'; function useIsAuthenticated() { const [session] = useOnyx(ONYXKEYS.SESSION); - const isAuthenticated = useMemo(() => !!(session?.authToken ?? null), [session]); + const isAuthenticated = useMemo(() => !!(session?.authToken ?? null), [session?.authToken]); return isAuthenticated; } diff --git a/src/hooks/useSearchResults.ts b/src/hooks/useSearchResults.ts index 26d5e84a7690..4ce2de9afa97 100644 --- a/src/hooks/useSearchResults.ts +++ b/src/hooks/useSearchResults.ts @@ -32,7 +32,7 @@ function useSearchResults(data: TValue[], filterData: ( return; } setInputValue(''); - }, [data, prevData]); + }, [data.length, prevData.length]); return [inputValue, setInputValue, result] as const; } diff --git a/src/hooks/useSelectedTransactionsActions.ts b/src/hooks/useSelectedTransactionsActions.ts index 7a830853d8b3..5a6d2567dd51 100644 --- a/src/hooks/useSelectedTransactionsActions.ts +++ b/src/hooks/useSelectedTransactionsActions.ts @@ -120,7 +120,7 @@ function useSelectedTransactionsActions({ } return false; - }, [selectedTransactionsList, selectedTransactionsMeta, selectedTransactionIDs]); + }, [selectedTransactionsList, selectedTransactionsMeta, selectedTransactionIDs.length]); const {translate} = useLocalize(); const [isDeleteModalVisible, setIsDeleteModalVisible] = useState(false); diff --git a/src/libs/Accessibility/index.ts b/src/libs/Accessibility/index.ts index 167634acce56..20f840633e3c 100644 --- a/src/libs/Accessibility/index.ts +++ b/src/libs/Accessibility/index.ts @@ -41,7 +41,7 @@ const useAutoHitSlop = () => { setFrameSize({x: layout.width, y: layout.height}); } }, - [frameSize], + [frameSize.x, frameSize.y], ); return [getHitSlopForSize(frameSize), onLayout] as const; }; diff --git a/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx b/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx index 1e2b5003d38a..196715609ab9 100644 --- a/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx +++ b/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx @@ -51,7 +51,7 @@ function RightModalNavigator({navigation, route}: RightModalNavigatorProps) { }); }, }), - [navigation, route], + [navigation, route.params?.screen], ); const handleOverlayPress = useCallback(() => { diff --git a/src/libs/Navigation/AppNavigator/usePreloadFullScreenNavigators.ts b/src/libs/Navigation/AppNavigator/usePreloadFullScreenNavigators.ts index 3ec54834db5a..05e8dbfc372b 100644 --- a/src/libs/Navigation/AppNavigator/usePreloadFullScreenNavigators.ts +++ b/src/libs/Navigation/AppNavigator/usePreloadFullScreenNavigators.ts @@ -100,7 +100,7 @@ function usePreloadFullScreenNavigators() { const route = useRoute(); const state = navigation.getState(); // The fallback is used to prevent crashing from the UI test - const preloadedRoutes = useMemo(() => state.preloadedRoutes ?? [], [state]); + const preloadedRoutes = useMemo(() => state.preloadedRoutes ?? [], [state.preloadedRoutes]); const subscriptionPlan = useSubscriptionPlan(); const isAuthenticated = useIsAuthenticated(); const hasPreloadedRef = useRef(false); diff --git a/src/pages/AddPersonalBankAccountPage.tsx b/src/pages/AddPersonalBankAccountPage.tsx index 7a5eba02fede..5d8a4ead0f82 100644 --- a/src/pages/AddPersonalBankAccountPage.tsx +++ b/src/pages/AddPersonalBankAccountPage.tsx @@ -61,7 +61,7 @@ function AddPersonalBankAccountPage() { }; addPersonalBankAccount(bankAccountWithToken, policyID, source); } - }, [plaidData, selectedPlaidAccountId, personalBankAccount]); + }, [plaidData?.bankAccounts, plaidData?.plaidAccessToken, selectedPlaidAccountId, personalBankAccount?.policyID, personalBankAccount?.source]); const exitFlow = useCallback( (shouldContinue = false) => { @@ -76,7 +76,7 @@ function AddPersonalBankAccountPage() { goBack(); } }, - [personalBankAccount, goBack, kycWallRef], + [personalBankAccount?.exitReportID, personalBankAccount?.onSuccessFallbackRoute, goBack, kycWallRef], ); useEffect(() => clearPersonalBankAccount, []); diff --git a/src/pages/EnablePayments/AddBankAccount/substeps/PlaidStep.tsx b/src/pages/EnablePayments/AddBankAccount/substeps/PlaidStep.tsx index 85d76d06d7f0..5c53fc39841c 100644 --- a/src/pages/EnablePayments/AddBankAccount/substeps/PlaidStep.tsx +++ b/src/pages/EnablePayments/AddBankAccount/substeps/PlaidStep.tsx @@ -48,7 +48,7 @@ function PlaidStep({onNext}: SubStepProps) { return; } clearPersonalBankAccountSetupType(); - }, [isFocused, plaidData]); + }, [isFocused, plaidData?.bankAccounts]); return ( { @@ -120,7 +120,7 @@ function InviteReportParticipantsPage({report}: InviteReportParticipantsPageProp [toggleSelection], ); - const validate = useCallback(() => selectedOptions.length > 0, [selectedOptions]); + const validate = useCallback(() => selectedOptions.length > 0, [selectedOptions.length]); const reportID = report.reportID; const reportName = useMemo(() => getGroupChatName(undefined, true, report), [report]); @@ -167,7 +167,7 @@ function InviteReportParticipantsPage({report}: InviteReportParticipantsPageProp countryCode, false, ); - }, [searchTerm, availableOptions, selectedOptionsForDisplay, excludedUsers, translate, reportName, countryCode]); + }, [searchTerm, availableOptions.userToInvite, availableOptions.recentReports.length, availableOptions.personalDetails.length, selectedOptionsForDisplay.length, excludedUsers, translate, reportName, countryCode]); const footerContent = useMemo( () => ( diff --git a/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx b/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx index 19c6f0b2fe7f..b06a9b3b2c73 100644 --- a/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx +++ b/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx @@ -114,7 +114,7 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin requiresUpdate: true, }, ]; - }, [illustrations, translate, userReportedIntegration]); + }, [illustrations.FolderOpen, illustrations.Accounting, illustrations.CompanyCard, illustrations.Workflows, illustrations.InvoiceBlue, illustrations.Rules, illustrations.Car, illustrations.HandCard, illustrations.Tag, illustrations.PerDiem, translate, userReportedIntegration]); const [userToggledFeatures, setUserToggledFeatures] = useState>(new Set()); diff --git a/src/pages/OnboardingWorkEmailValidation/BaseOnboardingWorkEmailValidation.tsx b/src/pages/OnboardingWorkEmailValidation/BaseOnboardingWorkEmailValidation.tsx index 9c50334c9b33..ecaad9eacc70 100644 --- a/src/pages/OnboardingWorkEmailValidation/BaseOnboardingWorkEmailValidation.tsx +++ b/src/pages/OnboardingWorkEmailValidation/BaseOnboardingWorkEmailValidation.tsx @@ -65,7 +65,7 @@ function BaseOnboardingWorkEmailValidation({shouldUseNativeStyles}: BaseOnboardi } Navigation.navigate(ROUTES.ONBOARDING_PURPOSE.getRoute(), {forceReplace: true}); - }, [onboardingValues, isVsb, isSmb, isFocused]); + }, [onboardingValues?.isMergeAccountStepCompleted, onboardingValues?.shouldRedirectToClassicAfterMerge, onboardingValues?.isMergeAccountStepSkipped, isVsb, isSmb, isFocused]); const sendValidateCode = useCallback(() => { if (!credentials?.login) { diff --git a/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx b/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx index bc5608ed706d..ad533e02081f 100644 --- a/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx +++ b/src/pages/OnboardingWorkspaceInvite/BaseOnboardingWorkspaceInvite.tsx @@ -117,7 +117,7 @@ function BaseOnboardingWorkspaceInvite({shouldUseNativeStyles}: BaseOnboardingWo }); } return sectionsArr; - }, [areOptionsInitialized, selectedOptionsForDisplay, availableOptions, translate]); + }, [areOptionsInitialized, selectedOptionsForDisplay, availableOptions.personalDetails.length, availableOptions.userToInvite, translate]); const handleToggleSelection = useCallback( (option: OptionData) => { diff --git a/src/pages/ProfilePage.tsx b/src/pages/ProfilePage.tsx index c14252210698..ef332fdb1020 100755 --- a/src/pages/ProfilePage.tsx +++ b/src/pages/ProfilePage.tsx @@ -84,7 +84,7 @@ function ProfilePage({route}: ProfilePageProps) { return `${ONYXKEYS.COLLECTION.REPORT}0` as const; } return `${ONYXKEYS.COLLECTION.REPORT}${reportID}` as const; - }, [accountID, isCurrentUser, reports, session]); + }, [accountID, isCurrentUser, reports, session?.accountID]); const [report] = useOnyx(reportKey, {canBeMissing: true}); const styles = useThemeStyles(); diff --git a/src/pages/ReimbursementAccount/EnterSignerInfo/index.tsx b/src/pages/ReimbursementAccount/EnterSignerInfo/index.tsx index 83dbc3dee71c..59321e2b3229 100644 --- a/src/pages/ReimbursementAccount/EnterSignerInfo/index.tsx +++ b/src/pages/ReimbursementAccount/EnterSignerInfo/index.tsx @@ -68,7 +68,7 @@ function EnterSignerInfo({route}: EnterSignerInfoProps) { return () => { clearEnterSignerInformationFormSave(); }; - }, [enterSignerInfoForm]); + }, [enterSignerInfoForm?.errors, enterSignerInfoForm?.isSavingSignerInformation, enterSignerInfoForm?.isSuccess]); useEffect(() => { return clearErrors(ONYXKEYS.FORMS.ENTER_SINGER_INFO_FORM); diff --git a/src/pages/ReimbursementAccount/NonUSD/Agreements/index.tsx b/src/pages/ReimbursementAccount/NonUSD/Agreements/index.tsx index 4da01d34528e..619b871cda3a 100644 --- a/src/pages/ReimbursementAccount/NonUSD/Agreements/index.tsx +++ b/src/pages/ReimbursementAccount/NonUSD/Agreements/index.tsx @@ -72,7 +72,7 @@ function Agreements({onBackButtonPress, onSubmit, stepNames, policyCurrency}: Ag return () => { clearReimbursementAccountFinishCorpayBankAccountOnboarding(); }; - }, [reimbursementAccount, onSubmit, policyCurrency, isDocusignStepRequired]); + }, [reimbursementAccount?.errors, reimbursementAccount?.isFinishingCorpayBankAccountOnboarding, reimbursementAccount?.isSuccess, onSubmit, policyCurrency, isDocusignStepRequired]); const handleBackButtonPress = () => { clearErrors(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM); diff --git a/src/pages/ReimbursementAccount/NonUSD/BeneficialOwnerInfo/BeneficialOwnerInfo.tsx b/src/pages/ReimbursementAccount/NonUSD/BeneficialOwnerInfo/BeneficialOwnerInfo.tsx index 7e5cf1fa174d..499351d13631 100644 --- a/src/pages/ReimbursementAccount/NonUSD/BeneficialOwnerInfo/BeneficialOwnerInfo.tsx +++ b/src/pages/ReimbursementAccount/NonUSD/BeneficialOwnerInfo/BeneficialOwnerInfo.tsx @@ -102,7 +102,7 @@ function BeneficialOwnerInfo({onBackButtonPress, onSubmit, stepNames}: Beneficia return () => { clearReimbursementAccountSaveCorpayOnboardingBeneficialOwners(); }; - }, [reimbursementAccount, onSubmit]); + }, [reimbursementAccount?.errors, reimbursementAccount?.isSavingCorpayOnboardingBeneficialOwnersFields, reimbursementAccount?.isSuccess, onSubmit]); const addOwner = (ownerID: string) => { const newOwners = [...ownerKeys, ownerID]; diff --git a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/BusinessInfo.tsx b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/BusinessInfo.tsx index c74f82b438b6..9b9dfa520951 100644 --- a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/BusinessInfo.tsx +++ b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/BusinessInfo.tsx @@ -128,7 +128,7 @@ function BusinessInfo({onBackButtonPress, onSubmit, stepNames}: BusinessInfoProp return () => { clearReimbursementAccountSaveCorpayOnboardingCompanyDetails(); }; - }, [reimbursementAccount, onSubmit]); + }, [reimbursementAccount?.errors, reimbursementAccount?.isSavingCorpayOnboardingCompanyFields, reimbursementAccount?.isSuccess, onSubmit]); const {componentToRender: SubStep, isEditing, screenIndex, nextScreen, prevScreen, moveTo, goToTheLastStep} = useSubStep({bodyContent, startFrom, onFinished: submit}); diff --git a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/AverageReimbursement.tsx b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/AverageReimbursement.tsx index 005645e62a3d..8cb868439468 100644 --- a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/AverageReimbursement.tsx +++ b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/AverageReimbursement.tsx @@ -21,7 +21,7 @@ function AverageReimbursement({onNext, onMove, isEditing}: AverageReimbursementP const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: false}); const currency = policy?.outputCurrency ?? ''; - const tradeVolumeRangeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.TradeVolumeRange), [corpayOnboardingFields]); + const tradeVolumeRangeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.TradeVolumeRange), [corpayOnboardingFields?.picklists.TradeVolumeRange]); const pushRowFields = useMemo( () => [ diff --git a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/BusinessType.tsx b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/BusinessType.tsx index f63551d0ba52..f50b6e75fd81 100644 --- a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/BusinessType.tsx +++ b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/BusinessType.tsx @@ -24,9 +24,9 @@ function BusinessType({onNext, isEditing, onMove}: BusinessTypeProps) { const country = reimbursementAccountDraft?.[COUNTRY] ?? reimbursementAccount?.achData?.[COUNTRY] ?? ''; const isBusinessTypeRequired = country !== CONST.COUNTRY.CA; - const incorporationTypeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.ApplicantType), [corpayOnboardingFields]); - const natureOfBusinessListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.NatureOfBusiness), [corpayOnboardingFields]); - const businessTypeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.BusinessType), [corpayOnboardingFields]); + const incorporationTypeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.ApplicantType), [corpayOnboardingFields?.picklists.ApplicantType]); + const natureOfBusinessListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.NatureOfBusiness), [corpayOnboardingFields?.picklists.NatureOfBusiness]); + const businessTypeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.BusinessType), [corpayOnboardingFields?.picklists.BusinessType]); const incorporationTypeDefaultValue = reimbursementAccount?.achData?.corpay?.[APPLICANT_TYPE_ID] ?? ''; const businessCategoryDefaultValue = reimbursementAccount?.achData?.corpay?.[BUSINESS_CATEGORY] ?? ''; diff --git a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/PaymentVolume.tsx b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/PaymentVolume.tsx index cf7fe3654429..711b78e66466 100644 --- a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/PaymentVolume.tsx +++ b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/PaymentVolume.tsx @@ -21,7 +21,7 @@ function PaymentVolume({onNext, onMove, isEditing}: PaymentVolumeProps) { const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: false}); const currency = policy?.outputCurrency ?? ''; - const annualVolumeRangeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.AnnualVolumeRange), [corpayOnboardingFields]); + const annualVolumeRangeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.AnnualVolumeRange), [corpayOnboardingFields?.picklists.AnnualVolumeRange]); const annualVolumeDefaultValue = reimbursementAccount?.achData?.corpay?.[ANNUAL_VOLUME] ?? ''; diff --git a/src/pages/ReimbursementAccount/NonUSD/Docusign/index.tsx b/src/pages/ReimbursementAccount/NonUSD/Docusign/index.tsx index 32b6c2e85622..f6cf6cb5acf1 100644 --- a/src/pages/ReimbursementAccount/NonUSD/Docusign/index.tsx +++ b/src/pages/ReimbursementAccount/NonUSD/Docusign/index.tsx @@ -63,7 +63,7 @@ function Docusign({onBackButtonPress, onSubmit, stepNames, policyCurrency}: Docu return () => { clearReimbursementAccountFinishCorpayBankAccountOnboarding(); }; - }, [reimbursementAccount, onSubmit]); + }, [reimbursementAccount?.errors, reimbursementAccount?.isFinishingCorpayBankAccountOnboarding, reimbursementAccount?.isSuccess, onSubmit]); const handleBackButtonPress = () => { clearErrors(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM); diff --git a/src/pages/ReimbursementAccount/NonUSD/SignerInfo/HangTight.tsx b/src/pages/ReimbursementAccount/NonUSD/SignerInfo/HangTight.tsx index c33e84b63717..2ef50d63ede4 100644 --- a/src/pages/ReimbursementAccount/NonUSD/SignerInfo/HangTight.tsx +++ b/src/pages/ReimbursementAccount/NonUSD/SignerInfo/HangTight.tsx @@ -57,7 +57,7 @@ function HangTight({policyID, bankAccountID}: HangTightProps) { return () => { clearReimbursementAccountSendReminderForCorpaySignerInformation(); }; - }, [reimbursementAccount]); + }, [reimbursementAccount?.errors, reimbursementAccount?.isSendingReminderForCorpaySignerInformation, reimbursementAccount?.isSuccess]); return ( { clearReimbursementAccountSaveCorpayOnboardingDirectorInformation(); }; - }, [reimbursementAccount, onSubmit, currency, currentSubStep]); + }, [reimbursementAccount?.errors, reimbursementAccount?.isSavingCorpayOnboardingDirectorInformation, reimbursementAccount?.isSuccess, onSubmit, currency, currentSubStep]); useEffect(() => { // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing @@ -118,7 +118,7 @@ function SignerInfo({onBackButtonPress, onSubmit, stepNames}: SignerInfoProps) { if (reimbursementAccount?.isAskingForCorpaySignerInformationSuccess) { setCurrentSubStep(SUBSTEP.HANG_TIGHT); } - }, [reimbursementAccount]); + }, [reimbursementAccount?.errors, reimbursementAccount?.isAskingForCorpaySignerInformation, reimbursementAccount?.isAskingForCorpaySignerInformationSuccess]); const bodyContent = useMemo(() => { if (isUserOwner) { diff --git a/src/pages/ReimbursementAccount/USD/BankInfo/BankInfo.tsx b/src/pages/ReimbursementAccount/USD/BankInfo/BankInfo.tsx index 362913c559e8..9b0f7eebe932 100644 --- a/src/pages/ReimbursementAccount/USD/BankInfo/BankInfo.tsx +++ b/src/pages/ReimbursementAccount/USD/BankInfo/BankInfo.tsx @@ -104,7 +104,7 @@ function BankInfo({onBackButtonPress, policyID, setUSDBankAccountStep}: BankInfo if (setupType === CONST.BANK_ACCOUNT.SETUP_TYPE.MANUAL && values.bankName !== '' && !redirectedFromPlaidToManual) { setRedirectedFromPlaidToManual(true); } - }, [redirectedFromPlaidToManual, setupType, values]); + }, [redirectedFromPlaidToManual, setupType, values.bankName]); const handleBackButtonPress = () => { if (screenIndex === 0) { diff --git a/src/pages/ReimbursementAccount/USD/BankInfo/subSteps/Plaid.tsx b/src/pages/ReimbursementAccount/USD/BankInfo/subSteps/Plaid.tsx index eec91ca2bb36..6badeef0d2d0 100644 --- a/src/pages/ReimbursementAccount/USD/BankInfo/subSteps/Plaid.tsx +++ b/src/pages/ReimbursementAccount/USD/BankInfo/subSteps/Plaid.tsx @@ -55,7 +55,7 @@ function Plaid({onNext, setUSDBankAccountStep}: PlaidProps) { } setBankAccountSubStep(null); setUSDBankAccountStep(null); - }, [isFocused, plaidData, setUSDBankAccountStep]); + }, [isFocused, plaidData?.bankAccounts, setUSDBankAccountStep]); const handlePlaidExit = () => { setBankAccountSubStep(null); diff --git a/src/pages/ReimbursementAccount/USD/BusinessInfo/BusinessInfo.tsx b/src/pages/ReimbursementAccount/USD/BusinessInfo/BusinessInfo.tsx index d875cc51539d..b21b6e55d4d1 100644 --- a/src/pages/ReimbursementAccount/USD/BusinessInfo/BusinessInfo.tsx +++ b/src/pages/ReimbursementAccount/USD/BusinessInfo/BusinessInfo.tsx @@ -55,7 +55,7 @@ function BusinessInfo({onBackButtonPress}: BusinessInfoProps) { ...lodashPick(reimbursementAccount?.achData, ...fieldNames), ...lodashPick(reimbursementAccountDraft, ...fieldNames), }), - [reimbursementAccount, reimbursementAccountDraft], + [reimbursementAccount?.achData, reimbursementAccountDraft], ); const policyID = reimbursementAccount?.achData?.policyID; @@ -77,7 +77,7 @@ function BusinessInfo({onBackButtonPress}: BusinessInfoProps) { isConfirmPage, ); }, - [reimbursementAccount, values, getBankAccountFields, policyID], + [reimbursementAccount?.achData?.bankAccountID, values, getBankAccountFields, policyID], ); const isBankAccountVerifying = reimbursementAccount?.achData?.state === CONST.BANK_ACCOUNT.STATE.VERIFYING; diff --git a/src/pages/ReimbursementAccount/USD/CompleteVerification/CompleteVerification.tsx b/src/pages/ReimbursementAccount/USD/CompleteVerification/CompleteVerification.tsx index bbc534f43f7f..666b1953cc45 100644 --- a/src/pages/ReimbursementAccount/USD/CompleteVerification/CompleteVerification.tsx +++ b/src/pages/ReimbursementAccount/USD/CompleteVerification/CompleteVerification.tsx @@ -39,7 +39,7 @@ function CompleteVerification({onBackButtonPress}: CompleteVerificationProps) { }, policyID, ); - }, [reimbursementAccount, values, policyID]); + }, [reimbursementAccount?.achData?.bankAccountID, values.isAuthorizedToUseBankAccount, values.certifyTrueInformation, values.acceptTermsAndConditions, policyID]); const {componentToRender: SubStep, isEditing, screenIndex, nextScreen, prevScreen, moveTo, goToTheLastStep} = useSubStep({bodyContent, startFrom: 0, onFinished: submit}); diff --git a/src/pages/ReimbursementAccount/USD/ConnectBankAccount/components/BankAccountValidationForm.tsx b/src/pages/ReimbursementAccount/USD/ConnectBankAccount/components/BankAccountValidationForm.tsx index 8c4450a1df14..62176e1ac4ea 100644 --- a/src/pages/ReimbursementAccount/USD/ConnectBankAccount/components/BankAccountValidationForm.tsx +++ b/src/pages/ReimbursementAccount/USD/ConnectBankAccount/components/BankAccountValidationForm.tsx @@ -94,7 +94,7 @@ function BankAccountValidationForm({requiresTwoFactorAuth, reimbursementAccount, BankAccounts.validateBankAccount(bankAccountID, validateCode, policyID); } }, - [reimbursementAccount, policyID, permittedDecimalSeparator], + [reimbursementAccount?.achData?.bankAccountID, policyID, permittedDecimalSeparator], ); // On android autoCapitalize="words" is necessary when keyboardType="decimal-pad" or inputMode="decimal" to prevent input lag. // See https://github.com/Expensify/App/issues/51868 for more information diff --git a/src/pages/ReportParticipantDetailsPage.tsx b/src/pages/ReportParticipantDetailsPage.tsx index ce75eeb9dc61..86ddc916f94c 100644 --- a/src/pages/ReportParticipantDetailsPage.tsx +++ b/src/pages/ReportParticipantDetailsPage.tsx @@ -57,7 +57,7 @@ function ReportParticipantDetails({report, route}: ReportParticipantDetailsPageP setIsRemoveMemberConfirmModalVisible(false); removeFromGroupChat(report?.reportID, [accountID]); Navigation.goBack(backTo); - }, [backTo, report, accountID]); + }, [backTo, report?.reportID, accountID]); const navigateToProfile = useCallback(() => { Navigation.navigate(ROUTES.PROFILE.getRoute(accountID, Navigation.getActiveRoute())); diff --git a/src/pages/ReportParticipantsPage.tsx b/src/pages/ReportParticipantsPage.tsx index 4136e039a23f..a6a01021145c 100755 --- a/src/pages/ReportParticipantsPage.tsx +++ b/src/pages/ReportParticipantsPage.tsx @@ -234,7 +234,7 @@ function ReportParticipantsPage({report, route}: ReportParticipantsPageProps) { */ const inviteUser = useCallback(() => { Navigation.navigate(ROUTES.REPORT_PARTICIPANTS_INVITE.getRoute(report.reportID, backTo)); - }, [report, backTo]); + }, [report.reportID, backTo]); /** * Remove selected users from the workspace @@ -368,7 +368,7 @@ function ReportParticipantsPage({report, route}: ReportParticipantsPageProps) { )} ); - }, [bulkActionsButtonOptions, inviteUser, isSmallScreenWidth, selectedMembers, styles, translate, isGroupChat, canSelectMultiple, shouldUseNarrowLayout]); + }, [bulkActionsButtonOptions, inviteUser, isSmallScreenWidth, selectedMembers.length, styles, translate, isGroupChat, canSelectMultiple, shouldUseNarrowLayout]); /** Opens the member details page */ const openMemberDetails = useCallback( @@ -379,7 +379,7 @@ function ReportParticipantsPage({report, route}: ReportParticipantsPageProps) { } Navigation.navigate(ROUTES.PROFILE.getRoute(item.accountID, Navigation.getActiveRoute())); }, - [report, isCurrentUserAdmin, isGroupChat, backTo], + [report.reportID, isCurrentUserAdmin, isGroupChat, backTo], ); const headerTitle = useMemo(() => { if (isChatRoom(report) || isPolicyExpenseChat(report) || isChatThread(report) || isTaskReport(report) || isMoneyRequestReport(report) || isGroupChat) { diff --git a/src/pages/RoomInvitePage.tsx b/src/pages/RoomInvitePage.tsx index 3740053d382e..8ef6ecc1b239 100644 --- a/src/pages/RoomInvitePage.tsx +++ b/src/pages/RoomInvitePage.tsx @@ -183,7 +183,7 @@ function RoomInvitePage({ [selectedOptions], ); - const validate = useCallback(() => selectedOptions.length > 0, [selectedOptions]); + const validate = useCallback(() => selectedOptions.length > 0, [selectedOptions.length]); // Non policy members should not be able to view the participants of a room const reportID = report?.reportID; diff --git a/src/pages/RoomMemberDetailsPage.tsx b/src/pages/RoomMemberDetailsPage.tsx index 510c51d575a5..4170bd589a40 100644 --- a/src/pages/RoomMemberDetailsPage.tsx +++ b/src/pages/RoomMemberDetailsPage.tsx @@ -59,7 +59,7 @@ function RoomMemberDetailsPage({report, route}: RoomMemberDetailsPagePageProps) setIsRemoveMemberConfirmModalVisible(false); removeFromRoom(report?.reportID, [accountID]); Navigation.goBack(backTo); - }, [backTo, report, accountID]); + }, [backTo, report?.reportID, accountID]); const navigateToProfile = useCallback(() => { Navigation.navigate(ROUTES.PROFILE.getRoute(accountID, Navigation.getActiveRoute())); diff --git a/src/pages/RoomMembersPage.tsx b/src/pages/RoomMembersPage.tsx index b53fbd87d4f5..25b484e2024c 100644 --- a/src/pages/RoomMembersPage.tsx +++ b/src/pages/RoomMembersPage.tsx @@ -353,7 +353,7 @@ function RoomMembersPage({report, policy}: RoomMembersPageProps) { )} ); - }, [bulkActionsButtonOptions, inviteUser, isSmallScreenWidth, selectedMembers, styles, translate, canSelectMultiple, shouldUseNarrowLayout]); + }, [bulkActionsButtonOptions, inviteUser, isSmallScreenWidth, selectedMembers.length, styles, translate, canSelectMultiple, shouldUseNarrowLayout]); /** Opens the room member details page */ const openRoomMemberDetails = useCallback( @@ -364,7 +364,7 @@ function RoomMembersPage({report, policy}: RoomMembersPageProps) { Navigation.navigate(ROUTES.ROOM_MEMBER_DETAILS.getRoute(report.reportID, item?.accountID, backTo)); }, - [report, backTo], + [report.reportID, backTo], ); const selectionModeHeader = isMobileSelectionModeEnabled && isSmallScreenWidth; diff --git a/src/pages/ScheduleCall/ScheduleCallConfirmationPage.tsx b/src/pages/ScheduleCall/ScheduleCallConfirmationPage.tsx index af35f852d6f8..5fa4bc1c864c 100644 --- a/src/pages/ScheduleCall/ScheduleCallConfirmationPage.tsx +++ b/src/pages/ScheduleCall/ScheduleCallConfirmationPage.tsx @@ -52,7 +52,7 @@ function ScheduleCallConfirmationPage() { currentUserPersonalDetails, userTimezone, ); - }, [currentUserPersonalDetails, scheduleCallDraft, userTimezone]); + }, [currentUserPersonalDetails, scheduleCallDraft?.timeSlot, scheduleCallDraft?.date, scheduleCallDraft?.guide, scheduleCallDraft?.reportID, userTimezone]); const guideDetails: PersonalDetails | null = useMemo( () => diff --git a/src/pages/Search/EmptySearchView.tsx b/src/pages/Search/EmptySearchView.tsx index a608e1c80c30..787224860397 100644 --- a/src/pages/Search/EmptySearchView.tsx +++ b/src/pages/Search/EmptySearchView.tsx @@ -488,7 +488,7 @@ function EmptySearchViewContent({ hasResults, defaultViewItemHeader, hasSeenTour, - groupPoliciesWithChatEnabled, + groupPoliciesWithChatEnabled.length, tripViewChildren, hasTransactions, shouldRedirectToExpensifyClassic, diff --git a/src/pages/Share/ShareDetailsPage.tsx b/src/pages/Share/ShareDetailsPage.tsx index b8fd2dc6baf5..741f295ea2b5 100644 --- a/src/pages/Share/ShareDetailsPage.tsx +++ b/src/pages/Share/ShareDetailsPage.tsx @@ -94,7 +94,7 @@ function ShareDetailsPage({route}: ShareDetailsPageProps) { setErrorMessage(translate('attachmentPicker.sizeNotMet')); } }); - }, [currentAttachment, errorTitle, translate]); + }, [currentAttachment?.content, errorTitle, translate]); useEffect(() => { if (!errorTitle || !errorMessage) { diff --git a/src/pages/TransactionMerge/DetailsReviewPage.tsx b/src/pages/TransactionMerge/DetailsReviewPage.tsx index 6778b6dd140f..e7ef36f4b582 100644 --- a/src/pages/TransactionMerge/DetailsReviewPage.tsx +++ b/src/pages/TransactionMerge/DetailsReviewPage.tsx @@ -166,7 +166,7 @@ function DetailsReviewPage({route}: DetailsReviewPageProps) { } as Partial>, }); }, - [mergeTransaction, transactionID], + [mergeTransaction?.selectedTransactionByField, transactionID], ); // Handle continue diff --git a/src/pages/TransactionMerge/MergeTransactionsListContent.tsx b/src/pages/TransactionMerge/MergeTransactionsListContent.tsx index d3820d99a625..f086b0b878c2 100644 --- a/src/pages/TransactionMerge/MergeTransactionsListContent.tsx +++ b/src/pages/TransactionMerge/MergeTransactionsListContent.tsx @@ -61,7 +61,7 @@ function MergeTransactionsListContent({transactionID, mergeTransaction}: MergeTr } getTransactionsForMerging({isOffline, targetTransaction, transactions, policy, report, currentUserLogin}); - }, [transactions, isOffline, mergeTransaction, policy, report, currentUserLogin, targetTransaction]); + }, [transactions, isOffline, mergeTransaction?.eligibleTransactions, policy, report, currentUserLogin, targetTransaction]); const sections = useMemo(() => { return [ @@ -77,7 +77,7 @@ function MergeTransactionsListContent({transactionID, mergeTransaction}: MergeTr shouldShow: true, }, ]; - }, [eligibleTransactions, mergeTransaction, localeCompare]); + }, [eligibleTransactions, mergeTransaction?.sourceTransactionID, localeCompare]); const handleSelectRow = useCallback( (item: MergeTransactionListItemType) => { @@ -88,7 +88,7 @@ function MergeTransactionsListContent({transactionID, mergeTransaction}: MergeTr eligibleTransactions: mergeTransaction?.eligibleTransactions, }); }, - [mergeTransaction, transactionID], + [mergeTransaction?.eligibleTransactions, transactionID], ); const headerContent = useMemo( diff --git a/src/pages/home/ReportScreen.tsx b/src/pages/home/ReportScreen.tsx index 0ecbe51a050d..54e7d2891580 100644 --- a/src/pages/home/ReportScreen.tsx +++ b/src/pages/home/ReportScreen.tsx @@ -213,7 +213,7 @@ function ReportScreen({route, navigation}: ReportScreenProps) { Log.info(`[ReportScreen] no reportID found in params, setting it to lastAccessedReportID: ${lastAccessedReportID}`); navigation.setParams({reportID: lastAccessedReportID}); }); - }, [isBetaEnabled, navigation, route]); + }, [isBetaEnabled, navigation, route.params]); const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: true}); const chatWithAccountManagerText = useMemo(() => { @@ -283,7 +283,7 @@ function ReportScreen({route, navigation}: ReportScreenProps) { policyAvatar: reportOnyx.policyAvatar, nextStep: reportOnyx.nextStep, }, - [reportOnyx, reportNameValuePairsOnyx, permissions], + [reportOnyx, reportNameValuePairsOnyx?.private_isArchived, permissions], ); const reportID = report?.reportID; @@ -366,7 +366,7 @@ function ReportScreen({route, navigation}: ReportScreenProps) { return; } wasReportAccessibleRef.current = true; - }, [report]); + }, [report?.reportID]); const backTo = route?.params?.backTo as string; const onBackButtonPress = useCallback( @@ -665,7 +665,7 @@ function ReportScreen({route, navigation}: ReportScreenProps) { return; } fetchReport(); - }, [prevReportActions, reportActions, fetchReport]); + }, [prevReportActions.length, reportActions, fetchReport]); // If a user has chosen to leave a thread, and then returns to it (e.g. with the back button), we need to call `openReport` again in order to allow the user to rejoin and to receive real-time updates useEffect(() => { @@ -801,7 +801,7 @@ function ReportScreen({route, navigation}: ReportScreenProps) { } interactionTask.cancel(); }; - }, [report, didSubscribeToReportLeavingEvents, reportIDFromRoute]); + }, [report?.reportID, didSubscribeToReportLeavingEvents, reportIDFromRoute, report?.pendingFields]); const actionListValue = useMemo((): ActionListContextType => ({flatListRef, scrollPosition, setScrollPosition}), [flatListRef, scrollPosition, setScrollPosition]); diff --git a/src/pages/home/report/PureReportActionItem.tsx b/src/pages/home/report/PureReportActionItem.tsx index 5059490d37f6..614d7d646f3a 100644 --- a/src/pages/home/report/PureReportActionItem.tsx +++ b/src/pages/home/report/PureReportActionItem.tsx @@ -704,7 +704,7 @@ function PureReportActionItem({ }, [ draftMessage, - action, + action.errors, action.reportActionID, reportID, toggleContextMenuFromActiveReportAction, originalReportID, diff --git a/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.tsx b/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.tsx index bc2931f1c700..acf045cc6599 100644 --- a/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.tsx +++ b/src/pages/home/report/ReportActionCompose/ComposerWithSuggestions/ComposerWithSuggestions.tsx @@ -607,7 +607,7 @@ function ComposerWithSuggestions({ // Checking whether the screen is focused or not, helps avoid `modal.isVisible` false when popups are closed, even if the modal is opened. const isComposerCoveredUp = !isFocused || isEmojiPickerVisible() || isMenuVisible || !!modal?.isVisible || modal?.willAlertModalBecomeVisible; return !isComposerCoveredUp; - }, [isMenuVisible, modal, isFocused]); + }, [isMenuVisible, modal?.isVisible, modal?.willAlertModalBecomeVisible, isFocused]); const focusComposerOnKeyPress = useCallback( (e: KeyboardEvent) => { diff --git a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx index 10675f62b529..7332d2f14ce9 100644 --- a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx +++ b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx @@ -389,7 +389,7 @@ function ReportActionCompose({ ); // When we invite someone to a room they don't have the policy object, but we still want them to be able to mention other reports they are members of, so we only check if the policyID in the report is from a workspace - const isGroupPolicyReport = useMemo(() => !!report?.policyID && report.policyID !== CONST.POLICY.ID_FAKE, [report]); + const isGroupPolicyReport = useMemo(() => !!report?.policyID && report.policyID !== CONST.POLICY.ID_FAKE, [report?.policyID]); const reportRecipientAccountIDs = getReportRecipientAccountIDs(report, currentUserPersonalDetails.accountID); const reportRecipient = personalDetails?.[reportRecipientAccountIDs[0]]; const shouldUseFocusedColor = !isBlockedFromConcierge && isFocused; @@ -464,7 +464,7 @@ function ReportActionCompose({ const reportActionComposeHeight = emojiPositionValues.composeBoxMinHeight + chatItemComposeSecondaryRowHeight; const emojiOffsetWithComposeBox = (emojiPositionValues.composeBoxMinHeight - emojiPositionValues.emojiButtonHeight) / 2; return reportActionComposeHeight - emojiOffsetWithComposeBox - CONST.MENU_POSITION_REPORT_ACTION_COMPOSE_BOTTOM; - }, [emojiPositionValues]); + }, [emojiPositionValues.secondaryRowHeight, emojiPositionValues.secondaryRowMarginTop, emojiPositionValues.secondaryRowMarginBottom, emojiPositionValues.composeBoxMinHeight, emojiPositionValues.emojiButtonHeight]); const onValueChange = useCallback( (value: string) => { diff --git a/src/pages/home/report/ReportActionCompose/SuggestionEmoji.tsx b/src/pages/home/report/ReportActionCompose/SuggestionEmoji.tsx index f8670512f7ed..44ffb5ff6e0d 100644 --- a/src/pages/home/report/ReportActionCompose/SuggestionEmoji.tsx +++ b/src/pages/home/report/ReportActionCompose/SuggestionEmoji.tsx @@ -181,7 +181,7 @@ function SuggestionEmoji({ } calculateEmojiSuggestion(value, selection.start, selection.end); - }, [value, selection, calculateEmojiSuggestion, isComposerFocused]); + }, [value, selection.start, selection.end, calculateEmojiSuggestion, isComposerFocused]); const setShouldBlockSuggestionCalc = useCallback( (shouldBlockSuggestionCalc: boolean) => { @@ -190,7 +190,7 @@ function SuggestionEmoji({ [shouldBlockCalc], ); - const getSuggestions = useCallback(() => suggestionValues.suggestedEmojis, [suggestionValues]); + const getSuggestions = useCallback(() => suggestionValues.suggestedEmojis, [suggestionValues.suggestedEmojis]); const getIsSuggestionsMenuVisible = useCallback(() => isEmojiSuggestionsMenuVisible, [isEmojiSuggestionsMenuVisible]); diff --git a/src/pages/home/report/ReportActionCompose/SuggestionMention.tsx b/src/pages/home/report/ReportActionCompose/SuggestionMention.tsx index 6a41e11f625a..ddbfe85b5254 100644 --- a/src/pages/home/report/ReportActionCompose/SuggestionMention.tsx +++ b/src/pages/home/report/ReportActionCompose/SuggestionMention.tsx @@ -111,7 +111,7 @@ function SuggestionMention({ } : null, ); - }, [policyID, policy, currentReport, personalDetails, getPersonalDetailsWeight, currentUserPersonalDetails]); + }, [policyID, policy, currentReport, personalDetails, getPersonalDetailsWeight, currentUserPersonalDetails.accountID]); const [highlightedMentionIndex, setHighlightedMentionIndex] = useArrowKeyFocusManager({ isActive: isMentionSuggestionsMenuVisible, @@ -467,7 +467,7 @@ function SuggestionMention({ [shouldBlockCalc], ); - const getSuggestions = useCallback(() => suggestionValues.suggestedMentions, [suggestionValues]); + const getSuggestions = useCallback(() => suggestionValues.suggestedMentions, [suggestionValues.suggestedMentions]); const getIsSuggestionsMenuVisible = useCallback(() => isMentionSuggestionsMenuVisible, [isMentionSuggestionsMenuVisible]); useImperativeHandle( diff --git a/src/pages/home/report/ReportActionItemSingle.tsx b/src/pages/home/report/ReportActionItemSingle.tsx index 79533b2f456c..97a3e56d4b7e 100644 --- a/src/pages/home/report/ReportActionItemSingle.tsx +++ b/src/pages/home/report/ReportActionItemSingle.tsx @@ -145,7 +145,7 @@ function ReportActionItemSingle({ () => CONST.RESTRICTED_ACCOUNT_IDS.includes(details.accountID ?? CONST.DEFAULT_NUMBER_ID) || (!details.isWorkspaceActor && isOptimisticPersonalDetail(action?.delegateAccountID ? Number(action.delegateAccountID) : (details.accountID ?? CONST.DEFAULT_NUMBER_ID))), - [action, details.isWorkspaceActor, details.accountID], + [action?.delegateAccountID, details.isWorkspaceActor, details.accountID], ); const getBackgroundColor = () => { diff --git a/src/pages/home/report/ReportActionsList.tsx b/src/pages/home/report/ReportActionsList.tsx index d5a08a512400..e878fd3c67ec 100644 --- a/src/pages/home/report/ReportActionsList.tsx +++ b/src/pages/home/report/ReportActionsList.tsx @@ -386,7 +386,7 @@ function ReportActionsList({ } previousLastIndex.current = lastActionIndex; reportActionSize.current = sortedVisibleReportActions.length; - }, [lastActionIndex, sortedVisibleReportActions, reportScrollManager, hasNewestReportAction, linkedReportActionID, setIsFloatingMessageCounterVisible]); + }, [lastActionIndex, sortedVisibleReportActions.length, reportScrollManager, hasNewestReportAction, linkedReportActionID, setIsFloatingMessageCounterVisible]); useEffect(() => { const shouldTriggerScroll = shouldFocusToTopOnMount && prevHasCreatedActionAdded && !hasCreatedActionAdded; @@ -516,7 +516,7 @@ function ReportActionsList({ reportScrollManager.scrollToBottom(); }); } - }, [lastAction, prevSortedVisibleReportActionsObjects, reportScrollManager]); + }, [lastAction?.reportActionID, lastAction?.actionName, prevSortedVisibleReportActionsObjects, reportScrollManager]); useEffect(() => { sortedVisibleReportActionsRef.current = sortedVisibleReportActions; diff --git a/src/pages/home/report/UserTypingEventListener.tsx b/src/pages/home/report/UserTypingEventListener.tsx index 9dff0b8847bb..1b0540fe22d4 100644 --- a/src/pages/home/report/UserTypingEventListener.tsx +++ b/src/pages/home/report/UserTypingEventListener.tsx @@ -76,7 +76,7 @@ function UserTypingEventListener({report}: UserTypingEventListenerProps) { } interactionTask.cancel(); }; - }, [isFocused, report.pendingFields, didSubscribeToReportTypingEvents, lastVisitedPath, reportID, route]); + }, [isFocused, report.pendingFields, didSubscribeToReportTypingEvents, lastVisitedPath, reportID, route?.params?.reportID]); return null; } diff --git a/src/pages/home/sidebar/FloatingActionButtonAndPopover.tsx b/src/pages/home/sidebar/FloatingActionButtonAndPopover.tsx index 674c3cf58884..337e8bd6beca 100644 --- a/src/pages/home/sidebar/FloatingActionButtonAndPopover.tsx +++ b/src/pages/home/sidebar/FloatingActionButtonAndPopover.tsx @@ -257,7 +257,7 @@ function FloatingActionButtonAndPopover({onHideCreateMenu, onShowCreateMenu, ref } const titleKey = getQuickActionTitle(quickAction?.action ?? ('' as QuickActionName)); return titleKey ? translate(titleKey) : ''; - }, [quickAction, translate, quickActionAvatars, quickActionReport]); + }, [quickAction?.action, translate, quickActionAvatars, quickActionReport]); const hideQABSubtitle = useMemo(() => { if (!isValidReport) { @@ -518,7 +518,7 @@ function FloatingActionButtonAndPopover({onHideCreateMenu, onShowCreateMenu, ref return; } Navigation.navigate(ROUTES.TRAVEL_MY_TRIPS); - }, [activePolicy, isTravelEnabled]); + }, [activePolicy?.id, isTravelEnabled]); const menuItems = [ ...expenseMenuItems, diff --git a/src/pages/iou/SplitExpensePage.tsx b/src/pages/iou/SplitExpensePage.tsx index 2d456c0a4758..edd45176c749 100644 --- a/src/pages/iou/SplitExpensePage.tsx +++ b/src/pages/iou/SplitExpensePage.tsx @@ -88,7 +88,7 @@ function SplitExpensePage({route}: SplitExpensePageProps) { const transactionDetails = useMemo>(() => getTransactionDetails(transaction) ?? {}, [transaction]); const transactionDetailsAmount = transactionDetails?.amount ?? 0; - const sumOfSplitExpenses = useMemo(() => (draftTransaction?.comment?.splitExpenses ?? []).reduce((acc, item) => acc + (item.amount ?? 0), 0), [draftTransaction]); + const sumOfSplitExpenses = useMemo(() => (draftTransaction?.comment?.splitExpenses ?? []).reduce((acc, item) => acc + (item.amount ?? 0), 0), [draftTransaction?.comment?.splitExpenses]); const splitExpenses = useMemo(() => draftTransaction?.comment?.splitExpenses ?? [], [draftTransaction?.comment?.splitExpenses]); const currencySymbol = currencyList?.[transactionDetails.currency ?? '']?.symbol ?? transactionDetails.currency ?? CONST.CURRENCY.USD; @@ -317,7 +317,7 @@ function SplitExpensePage({route}: SplitExpensePageProps) { onAddSplitExpense, onMakeSplitsEven, translate, - childTransactions, + childTransactions.length, shouldUseNarrowLayout, styles.w100, styles.ph4, diff --git a/src/pages/iou/request/MoneyRequestAttendeeSelector.tsx b/src/pages/iou/request/MoneyRequestAttendeeSelector.tsx index 8d824bebf5de..6a415b64a156 100644 --- a/src/pages/iou/request/MoneyRequestAttendeeSelector.tsx +++ b/src/pages/iou/request/MoneyRequestAttendeeSelector.tsx @@ -159,7 +159,7 @@ function MoneyRequestAttendeeSelector({attendees = [], onFinish, onAttendeesAdde onFinish(CONST.IOU.TYPE.SUBMIT); }, - [shouldShowErrorMessage, onFinish, selectedOptions], + [shouldShowErrorMessage, onFinish, selectedOptions.length], ); const showLoadingPlaceholder = useMemo(() => !areOptionsInitialized || !didScreenTransitionEnd, [areOptionsInitialized, didScreenTransitionEnd]); diff --git a/src/pages/iou/request/MoneyRequestParticipantsSelector.tsx b/src/pages/iou/request/MoneyRequestParticipantsSelector.tsx index 1c691c4fc639..9ff06098d8ce 100644 --- a/src/pages/iou/request/MoneyRequestParticipantsSelector.tsx +++ b/src/pages/iou/request/MoneyRequestParticipantsSelector.tsx @@ -400,7 +400,7 @@ function MoneyRequestParticipantsSelector({ onFinish(CONST.IOU.TYPE.SPLIT); }, - [shouldShowSplitBillErrorMessage, onFinish, addSingleParticipant, selectedOptions], + [shouldShowSplitBillErrorMessage, onFinish, addSingleParticipant, selectedOptions.length], ); const showLoadingPlaceholder = useMemo(() => !areOptionsInitialized || !didScreenTransitionEnd, [areOptionsInitialized, didScreenTransitionEnd]); @@ -526,7 +526,7 @@ function MoneyRequestParticipantsSelector({ isInSearch={false} /> ); - }, [searchTerm, isSearchingForReports, contactState?.showImportUI, showImportContacts, translate]); + }, [searchTerm.length, isSearchingForReports, contactState?.showImportUI, showImportContacts, translate]); const EmptySelectionListContentWithPermission = useMemo(() => { return ( <> diff --git a/src/pages/iou/request/step/IOURequestEditReportCommon.tsx b/src/pages/iou/request/step/IOURequestEditReportCommon.tsx index b5d71d45f0d2..1ed02f42b771 100644 --- a/src/pages/iou/request/step/IOURequestEditReportCommon.tsx +++ b/src/pages/iou/request/step/IOURequestEditReportCommon.tsx @@ -91,7 +91,7 @@ function IOURequestEditReportCommon({ } return currentUserPersonalDetails.accountID; - }, [targetOwnerAccountID, selectedReport, currentUserPersonalDetails.accountID]); + }, [targetOwnerAccountID, selectedReport?.ownerAccountID, currentUserPersonalDetails.accountID]); const reportPolicy = usePolicy(selectedReport?.policyID); const {policyForMovingExpenses} = usePolicyForMovingExpenses(isPerDiemRequest); @@ -211,7 +211,7 @@ function IOURequestEditReportCommon({ Navigation.goBack(backTo); }; - const headerMessage = useMemo(() => (searchValue && !reportOptions.length ? translate('common.noResultsFound') : ''), [searchValue, reportOptions, translate]); + const headerMessage = useMemo(() => (searchValue && !reportOptions.length ? translate('common.noResultsFound') : ''), [searchValue, reportOptions.length, translate]); const createReportOption = useMemo(() => { if (!createReport || (isEditing && !isOwner)) { diff --git a/src/pages/iou/request/step/IOURequestStepDistance.tsx b/src/pages/iou/request/step/IOURequestStepDistance.tsx index 434f47620f9b..4c0f8a2d4139 100644 --- a/src/pages/iou/request/step/IOURequestStepDistance.tsx +++ b/src/pages/iou/request/step/IOURequestStepDistance.tsx @@ -101,7 +101,7 @@ function IOURequestStepDistance({ waypoint0: {keyForList: 'start_waypoint'}, waypoint1: {keyForList: 'stop_waypoint'}, }, - [optimisticWaypoints, transaction], + [optimisticWaypoints, transaction?.comment?.waypoints], ); const [reportAttributesDerived] = useOnyx(ONYXKEYS.DERIVED.REPORT_ATTRIBUTES, {canBeMissing: true, selector: reportsSelector}); @@ -198,7 +198,7 @@ function IOURequestStepDistance({ !isArchivedReport(reportNameValuePairs) && !(isPolicyExpenseChatUtil(report) && ((policy?.requiresCategory ?? false) || (policy?.requiresTag ?? false))) ); - }, [report, skipConfirmation, policy, reportNameValuePairs, iouType]); + }, [report, skipConfirmation, policy?.requiresCategory, policy?.requiresTag, reportNameValuePairs, iouType]); let buttonText = !isCreatingNewRequest ? translate('common.save') : translate('common.next'); if (shouldSkipConfirmation) { if (iouType === CONST.IOU.TYPE.SPLIT) { diff --git a/src/pages/iou/request/step/IOURequestStepDistanceMap.tsx b/src/pages/iou/request/step/IOURequestStepDistanceMap.tsx index 2093fdd4e79b..6f5502cc883a 100644 --- a/src/pages/iou/request/step/IOURequestStepDistanceMap.tsx +++ b/src/pages/iou/request/step/IOURequestStepDistanceMap.tsx @@ -102,7 +102,7 @@ function IOURequestStepDistanceMap({ waypoint0: {keyForList: 'start_waypoint'}, waypoint1: {keyForList: 'stop_waypoint'}, }, - [optimisticWaypoints, transaction], + [optimisticWaypoints, transaction?.comment?.waypoints], ); const [reportAttributesDerived] = useOnyx(ONYXKEYS.DERIVED.REPORT_ATTRIBUTES, {canBeMissing: true, selector: reportsSelector}); @@ -199,7 +199,7 @@ function IOURequestStepDistanceMap({ !isArchivedReport(reportNameValuePairs) && !(isPolicyExpenseChatUtil(report) && ((policy?.requiresCategory ?? false) || (policy?.requiresTag ?? false))) ); - }, [report, skipConfirmation, policy, reportNameValuePairs, iouType]); + }, [report, skipConfirmation, policy?.requiresCategory, policy?.requiresTag, reportNameValuePairs, iouType]); let buttonText = !isCreatingNewRequest ? translate('common.save') : translate('common.next'); if (shouldSkipConfirmation) { if (iouType === CONST.IOU.TYPE.SPLIT) { diff --git a/src/pages/iou/request/step/IOURequestStepParticipants.tsx b/src/pages/iou/request/step/IOURequestStepParticipants.tsx index 9b3d7ef22037..b17e174f7156 100644 --- a/src/pages/iou/request/step/IOURequestStepParticipants.tsx +++ b/src/pages/iou/request/step/IOURequestStepParticipants.tsx @@ -397,7 +397,7 @@ function IOURequestStepParticipants({ const isWorkspacesOnly = useMemo(() => { return !!(initialTransaction?.amount && initialTransaction?.amount < 0); - }, [initialTransaction]); + }, [initialTransaction?.amount]); return ( { const results = tokenizedSearch([workspaceOption], searchInput, (option) => [option.text ?? '']); diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx index 1c8befdf4ccc..e77ec4b0bc9e 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.native.tsx @@ -174,7 +174,7 @@ function IOURequestStepScan({ } return !isArchivedReport(reportNameValuePairs) && !(isPolicyExpenseChat(report) && ((policy?.requiresCategory ?? false) || (policy?.requiresTag ?? false))); - }, [report, skipConfirmation, policy, reportNameValuePairs]); + }, [report, skipConfirmation, policy?.requiresCategory, policy?.requiresTag, reportNameValuePairs]); const {translate} = useLocalize(); @@ -517,7 +517,7 @@ function IOURequestStepScan({ initialTransaction?.reportID, reportNameValuePairs, iouType, - personalPolicy, + personalPolicy?.autoReporting, defaultExpensePolicy, report, initialTransactionID, @@ -647,7 +647,7 @@ function IOURequestStepScan({ } navigateToConfirmationStep(files, false); }, - [shouldSkipConfirmation, navigateToConfirmationStep, initialTransaction, iouType, shouldStartLocationPermissionFlow], + [shouldSkipConfirmation, navigateToConfirmationStep, initialTransaction?.amount, iouType, shouldStartLocationPermissionFlow], ); const viewfinderLayout = useRef(null); diff --git a/src/pages/iou/request/step/IOURequestStepScan/index.tsx b/src/pages/iou/request/step/IOURequestStepScan/index.tsx index c4172524db45..d8187299fc2b 100644 --- a/src/pages/iou/request/step/IOURequestStepScan/index.tsx +++ b/src/pages/iou/request/step/IOURequestStepScan/index.tsx @@ -178,7 +178,7 @@ function IOURequestStepScan({ } return !isArchivedReport(reportNameValuePairs) && !(isPolicyExpenseChat(report) && ((policy?.requiresCategory ?? false) || (policy?.requiresTag ?? false))); - }, [report, skipConfirmation, policy, reportNameValuePairs]); + }, [report, skipConfirmation, policy?.requiresCategory, policy?.requiresTag, reportNameValuePairs]); /** * On phones that have ultra-wide lens, react-webcam uses ultra-wide by default. @@ -705,7 +705,7 @@ function IOURequestStepScan({ } navigateToConfirmationStep(files, false); }, - [initialTransaction, iouType, shouldStartLocationPermissionFlow, navigateToConfirmationStep, shouldSkipConfirmation], + [initialTransaction?.amount, iouType, shouldStartLocationPermissionFlow, navigateToConfirmationStep, shouldSkipConfirmation], ); const viewfinderLayout = useRef(null); diff --git a/src/pages/iou/request/step/IOURequestStepSendFrom.tsx b/src/pages/iou/request/step/IOURequestStepSendFrom.tsx index 57aa6d5501db..20364cfb3a45 100644 --- a/src/pages/iou/request/step/IOURequestStepSendFrom.tsx +++ b/src/pages/iou/request/step/IOURequestStepSendFrom.tsx @@ -62,7 +62,7 @@ function IOURequestStepSendFrom({route, transaction}: IOURequestStepSendFromProp ], isSelected: selectedWorkspace?.policyID === policy.id, })); - }, [allPolicies, currentUserLogin, selectedWorkspace, localeCompare, expensifyIcons.FallbackWorkspaceAvatar]); + }, [allPolicies, currentUserLogin, selectedWorkspace?.policyID, localeCompare, expensifyIcons.FallbackWorkspaceAvatar]); const navigateBack = () => { Navigation.goBack(backTo); diff --git a/src/pages/media/AttachmentModalScreen/routes/report/ReportAttachmentModalContent.tsx b/src/pages/media/AttachmentModalScreen/routes/report/ReportAttachmentModalContent.tsx index 848fdd06dd15..6a5856bfe365 100644 --- a/src/pages/media/AttachmentModalScreen/routes/report/ReportAttachmentModalContent.tsx +++ b/src/pages/media/AttachmentModalScreen/routes/report/ReportAttachmentModalContent.tsx @@ -55,7 +55,7 @@ function ReportAttachmentModalContent({route, navigation}: AttachmentModalScreen } const isEmptyReport = isEmptyObject(report); return !!isLoadingApp || isEmptyReport || (reportMetadata?.isLoadingInitialReportActions !== false && shouldFetchReport); - }, [isOffline, reportActionReportID, isLoadingApp, report, reportMetadata, shouldFetchReport]); + }, [isOffline, reportActionReportID, isLoadingApp, report, reportMetadata?.isLoadingInitialReportActions, shouldFetchReport]); const fetchReport = useCallback(() => { openReport(reportActionReportID, reportActionID); diff --git a/src/pages/settings/Profile/Contacts/NewContactMethodConfirmMagicCodePage.tsx b/src/pages/settings/Profile/Contacts/NewContactMethodConfirmMagicCodePage.tsx index c56e7b2e1563..17b2239e9d9e 100644 --- a/src/pages/settings/Profile/Contacts/NewContactMethodConfirmMagicCodePage.tsx +++ b/src/pages/settings/Profile/Contacts/NewContactMethodConfirmMagicCodePage.tsx @@ -45,7 +45,7 @@ function NewContactMethodConfirmMagicCodePage({route}: NewContactMethodConfirmMa } clearUnvalidatedNewContactMethodAction(); Navigation.goBack(ROUTES.SETTINGS_CONTACT_METHOD_DETAILS.getRoute(addSMSDomainIfPhoneNumber(newContactMethod), navigateBackTo, true)); - }, [navigateBackTo, newContactMethod, pendingContactAction, pendingContactAction?.actionVerified, prevPendingContactAction?.contactMethod]); + }, [navigateBackTo, newContactMethod, pendingContactAction?.actionVerified, pendingContactAction?.actionVerified, prevPendingContactAction?.contactMethod]); return ( { const sectionsList = []; @@ -91,7 +91,7 @@ function AddDelegatePage() { shouldShowSubscript: option.shouldShowSubscript ?? undefined, })), })); - }, [availableOptions, translate]); + }, [availableOptions.recentReports?.length, availableOptions.personalDetails?.length, availableOptions.userToInvite, translate]); useEffect(() => { searchInServer(debouncedSearchTerm); diff --git a/src/pages/settings/Security/AddDelegate/UpdateDelegateRole/UpdateDelegateMagicCodePage.tsx b/src/pages/settings/Security/AddDelegate/UpdateDelegateRole/UpdateDelegateMagicCodePage.tsx index bbb380ace521..80312f10bbeb 100644 --- a/src/pages/settings/Security/AddDelegate/UpdateDelegateRole/UpdateDelegateMagicCodePage.tsx +++ b/src/pages/settings/Security/AddDelegate/UpdateDelegateRole/UpdateDelegateMagicCodePage.tsx @@ -32,7 +32,7 @@ function UpdateDelegateMagicCodePage({route}: UpdateDelegateMagicCodePageProps) // Dismiss modal on successful magic code verification Navigation.goBack(ROUTES.SETTINGS_SECURITY); - }, [login, currentDelegate, updateDelegateErrors, newRole]); + }, [login, currentDelegate?.role, currentDelegate?.pendingFields?.role, updateDelegateErrors, newRole]); const clearError = () => { if (isEmptyObject(updateDelegateErrors) && isEmptyObject(validateCodeAction?.errorFields)) { diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/AverageReimbursement.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/AverageReimbursement.tsx index 587f12d66881..1d0322f8e62b 100644 --- a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/AverageReimbursement.tsx +++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/AverageReimbursement.tsx @@ -18,7 +18,7 @@ function AverageReimbursements({onNext, onMove, isEditing, currency}: AverageRei const [enableGlobalReimbursementsDraft] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT, {canBeMissing: true}); const [corpayOnboardingFields] = useOnyx(ONYXKEYS.CORPAY_ONBOARDING_FIELDS, {canBeMissing: true}); - const tradeVolumeRangeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.TradeVolumeRange), [corpayOnboardingFields]); + const tradeVolumeRangeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.TradeVolumeRange), [corpayOnboardingFields?.picklists.TradeVolumeRange]); const pushRowFields = useMemo( () => [ diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/BusinessType.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/BusinessType.tsx index 27a3b1c3a9d1..bb4d6aa7445d 100644 --- a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/BusinessType.tsx +++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/BusinessType.tsx @@ -16,8 +16,8 @@ function BusinessType({onNext, onMove, isEditing}: SubStepProps) { const [enableGlobalReimbursementsDraft] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT, {canBeMissing: true}); const [corpayOnboardingFields] = useOnyx(ONYXKEYS.CORPAY_ONBOARDING_FIELDS, {canBeMissing: true}); - const incorporationTypeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.ApplicantType), [corpayOnboardingFields]); - const natureOfBusinessListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.NatureOfBusiness), [corpayOnboardingFields]); + const incorporationTypeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.ApplicantType), [corpayOnboardingFields?.picklists.ApplicantType]); + const natureOfBusinessListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.NatureOfBusiness), [corpayOnboardingFields?.picklists.NatureOfBusiness]); const pushRowFields = useMemo( () => [ diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/PaymentVolume.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/PaymentVolume.tsx index 1052d8e44106..515009e52502 100644 --- a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/PaymentVolume.tsx +++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/PaymentVolume.tsx @@ -18,7 +18,7 @@ function PaymentVolume({onNext, onMove, isEditing, currency}: PaymentVolumeProps const [enableGlobalReimbursementsDraft] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT, {canBeMissing: true}); const [corpayOnboardingFields] = useOnyx(ONYXKEYS.CORPAY_ONBOARDING_FIELDS, {canBeMissing: true}); - const annualVolumeRangeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.AnnualVolumeRange), [corpayOnboardingFields]); + const annualVolumeRangeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.AnnualVolumeRange), [corpayOnboardingFields?.picklists.AnnualVolumeRange]); const pushRowFields = useMemo( () => [ diff --git a/src/pages/settings/Wallet/ReportCardLostPage.tsx b/src/pages/settings/Wallet/ReportCardLostPage.tsx index 3a23c9a2e033..dccc0f2dc608 100644 --- a/src/pages/settings/Wallet/ReportCardLostPage.tsx +++ b/src/pages/settings/Wallet/ReportCardLostPage.tsx @@ -92,7 +92,7 @@ function ReportCardLostPage({ return; } setNewCardID(newID); - }, [cardList, physicalCard, previousCardList]); + }, [cardList, physicalCard?.cardID, previousCardList]); useEffect(() => { resetValidateActionCodeSent(); diff --git a/src/pages/signin/LoginForm/BaseLoginForm.tsx b/src/pages/signin/LoginForm/BaseLoginForm.tsx index 26c9202d6360..ed15a760907b 100644 --- a/src/pages/signin/LoginForm/BaseLoginForm.tsx +++ b/src/pages/signin/LoginForm/BaseLoginForm.tsx @@ -105,7 +105,7 @@ function BaseLoginForm({blurOnSubmit = false, isVisible, ref}: BaseLoginFormProp setDefaultData(); } }, - [account, closeAccount, input, setLogin, validate], + [account?.errors, account?.message, closeAccount?.success, input, setLogin, validate], ); function getSignInWithStyles() { @@ -144,7 +144,7 @@ function BaseLoginForm({blurOnSubmit = false, isVisible, ref}: BaseLoginFormProp // Check if this login has an account associated with it or not beginSignIn(parsedPhoneNumber.possible && parsedPhoneNumber.number?.e164 ? parsedPhoneNumber.number.e164 : loginTrim); - }, [login, account, closeAccount, isOffline, validate, countryCode]); + }, [login, account?.isLoading, closeAccount?.success, isOffline, validate, countryCode]); useEffect(() => { // Call clearAccountMessages on the login page (home route). diff --git a/src/pages/signin/ValidateCodeForm/BaseValidateCodeForm.tsx b/src/pages/signin/ValidateCodeForm/BaseValidateCodeForm.tsx index d2deeed34ea7..d03e1645303d 100755 --- a/src/pages/signin/ValidateCodeForm/BaseValidateCodeForm.tsx +++ b/src/pages/signin/ValidateCodeForm/BaseValidateCodeForm.tsx @@ -111,14 +111,14 @@ function BaseValidateCodeForm({autoComplete, isUsingRecoveryCode, setIsUsingReco return; } inputValidateCodeRef.current.clear(); - }, [validateCode]); + }, [validateCode.length]); useEffect(() => { if (!input2FARef.current || twoFactorAuthCode.length > 0) { return; } input2FARef.current.clear(); - }, [twoFactorAuthCode]); + }, [twoFactorAuthCode.length]); /** * Handle text input and clear formError upon text change diff --git a/src/pages/tasks/NewTaskDetailsPage.tsx b/src/pages/tasks/NewTaskDetailsPage.tsx index aec295d657b8..ab16dd14959d 100644 --- a/src/pages/tasks/NewTaskDetailsPage.tsx +++ b/src/pages/tasks/NewTaskDetailsPage.tsx @@ -49,7 +49,7 @@ function NewTaskDetailsPage({route}: NewTaskDetailsPageProps) { useEffect(() => { setTaskTitle(Parser.htmlToMarkdown(Parser.replace(task?.title ?? ''))); setTaskDescription(Parser.htmlToMarkdown(Parser.replace(task?.description ?? ''))); - }, [task]); + }, [task?.title, task?.description]); const validate = (values: FormOnyxValues): FormInputErrors => { const errors = {}; diff --git a/src/pages/tasks/TaskAssigneeSelectorModal.tsx b/src/pages/tasks/TaskAssigneeSelectorModal.tsx index 3f855e09c1d3..281e6eef715e 100644 --- a/src/pages/tasks/TaskAssigneeSelectorModal.tsx +++ b/src/pages/tasks/TaskAssigneeSelectorModal.tsx @@ -90,7 +90,7 @@ function TaskAssigneeSelectorModal() { }); } return reports?.[`${ONYXKEYS.COLLECTION.REPORT}${route.params?.reportID}`]; - }, [reports, route]); + }, [reports, route.params?.reportID]); const sections = useMemo(() => { const sectionsList = []; diff --git a/src/pages/workspace/WorkspaceInitialPage.tsx b/src/pages/workspace/WorkspaceInitialPage.tsx index 2d3671e20b8b..0ddc3c25e8a8 100644 --- a/src/pages/workspace/WorkspaceInitialPage.tsx +++ b/src/pages/workspace/WorkspaceInitialPage.tsx @@ -158,7 +158,7 @@ function WorkspaceInitialPage({policyDraft, policy: policyProp, route}: Workspac [CONST.POLICY.MORE_FEATURES.ARE_PER_DIEM_RATES_ENABLED]: policy?.arePerDiemRatesEnabled, [CONST.POLICY.MORE_FEATURES.ARE_RECEIPT_PARTNERS_ENABLED]: isUberForBusinessEnabled && (policy?.receiptPartners?.enabled ?? false), }), - [policy, isUberForBusinessEnabled], + [policy?.areDistanceRatesEnabled, policy?.areWorkflowsEnabled, policy?.areCategoriesEnabled, policy?.areTagsEnabled, policy?.tax?.trackingEnabled, policy?.areCompanyCardsEnabled, policy?.areConnectionsEnabled, policy?.connections, policy?.areExpensifyCardsEnabled, policy?.areReportFieldsEnabled, policy?.areRulesEnabled, policy?.areInvoicesEnabled, policy?.arePerDiemRatesEnabled, policy?.receiptPartners?.enabled, isUberForBusinessEnabled], ) as PolicyFeatureStates; const fetchPolicyData = useCallback(() => { diff --git a/src/pages/workspace/WorkspaceInvitePage.tsx b/src/pages/workspace/WorkspaceInvitePage.tsx index 363bdb89c85f..de294175ec7b 100644 --- a/src/pages/workspace/WorkspaceInvitePage.tsx +++ b/src/pages/workspace/WorkspaceInvitePage.tsx @@ -116,7 +116,7 @@ function WorkspaceInvitePage({route, policy}: WorkspaceInvitePageProps) { } return sectionsArr; - }, [areOptionsInitialized, selectedOptionsForDisplay, availableOptions, translate]); + }, [areOptionsInitialized, selectedOptionsForDisplay, availableOptions.personalDetails.length, availableOptions.userToInvite, translate]); const handleToggleSelection = useCallback( (option: OptionData) => { @@ -152,7 +152,7 @@ function WorkspaceInvitePage({route, policy}: WorkspaceInvitePageProps) { Navigation.navigate(ROUTES.WORKSPACE_INVITE_MESSAGE.getRoute(route.params.policyID, Navigation.getActiveRoute())); }, [route.params.policyID, selectedOptions]); - const [policyName, shouldShowAlertPrompt] = useMemo(() => [policy?.name ?? '', !isEmptyObject(policy?.errors) || !!policy?.alertMessage], [policy]); + const [policyName, shouldShowAlertPrompt] = useMemo(() => [policy?.name ?? '', !isEmptyObject(policy?.errors) || !!policy?.alertMessage], [policy?.name, policy?.errors, policy?.alertMessage]); const headerMessage = useMemo(() => { const searchValue = searchTerm.trim().toLowerCase(); diff --git a/src/pages/workspace/WorkspaceOverviewAddressPage.tsx b/src/pages/workspace/WorkspaceOverviewAddressPage.tsx index 045d48cc8015..4dd24096ab7c 100644 --- a/src/pages/workspace/WorkspaceOverviewAddressPage.tsx +++ b/src/pages/workspace/WorkspaceOverviewAddressPage.tsx @@ -29,7 +29,7 @@ function WorkspaceOverviewAddressPage({policy, route}: WorkspaceOverviewAddressP country: tempAddress?.country ?? '', }; return result; - }, [policy]); + }, [policy?.address]); const updatePolicyAddress = (values: FormOnyxValues) => { if (!policy) { diff --git a/src/pages/workspace/accounting/intacct/export/SageIntacctExportPage.tsx b/src/pages/workspace/accounting/intacct/export/SageIntacctExportPage.tsx index 223261c6547b..0f5a70585235 100644 --- a/src/pages/workspace/accounting/intacct/export/SageIntacctExportPage.tsx +++ b/src/pages/workspace/accounting/intacct/export/SageIntacctExportPage.tsx @@ -62,7 +62,7 @@ function SageIntacctExportPage({policy}: WithPolicyProps) { ], }, ], - [exportConfig, policyID, translate], + [exportConfig?.exporter, exportConfig?.exportDate, exportConfig?.reimbursable, exportConfig?.nonReimbursable, policyID, translate], ); return ( diff --git a/src/pages/workspace/accounting/intacct/export/SageIntacctPreferredExporterPage.tsx b/src/pages/workspace/accounting/intacct/export/SageIntacctPreferredExporterPage.tsx index 58ded7e4b89e..26054651e8b6 100644 --- a/src/pages/workspace/accounting/intacct/export/SageIntacctPreferredExporterPage.tsx +++ b/src/pages/workspace/accounting/intacct/export/SageIntacctPreferredExporterPage.tsx @@ -73,7 +73,7 @@ function SageIntacctPreferredExporterPage({policy}: WithPolicyProps) { }); return options; }, []); - }, [exportConfiguration, exporters, policyOwner, currentUserLogin]); + }, [exportConfiguration?.exporter, exporters, policyOwner, currentUserLogin]); const selectExporter = useCallback( (row: CardListItem) => { @@ -82,7 +82,7 @@ function SageIntacctPreferredExporterPage({policy}: WithPolicyProps) { } goBack(); }, - [policyID, exportConfiguration, goBack], + [policyID, exportConfiguration?.exporter, goBack], ); const headerContent = useMemo( diff --git a/src/pages/workspace/accounting/qbo/export/QuickbooksExportDateSelectPage.tsx b/src/pages/workspace/accounting/qbo/export/QuickbooksExportDateSelectPage.tsx index b9fc2263be2b..17e717b88245 100644 --- a/src/pages/workspace/accounting/qbo/export/QuickbooksExportDateSelectPage.tsx +++ b/src/pages/workspace/accounting/qbo/export/QuickbooksExportDateSelectPage.tsx @@ -38,7 +38,7 @@ function QuickbooksExportDateSelectPage({policy}: WithPolicyConnectionsProps) { isSelected: qboConfig?.exportDate === dateType, })); - const exportDate = useMemo(() => qboConfig?.exportDate, [qboConfig]); + const exportDate = useMemo(() => qboConfig?.exportDate, [qboConfig?.exportDate]); const goBack = useCallback(() => { Navigation.goBack(backTo ?? ROUTES.POLICY_ACCOUNTING_QUICKBOOKS_ONLINE_EXPORT.getRoute(policyID)); diff --git a/src/pages/workspace/accounting/reconciliation/ReconciliationAccountSettingsPage.tsx b/src/pages/workspace/accounting/reconciliation/ReconciliationAccountSettingsPage.tsx index 0b8a33d41e04..b61a82a8c6de 100644 --- a/src/pages/workspace/accounting/reconciliation/ReconciliationAccountSettingsPage.tsx +++ b/src/pages/workspace/accounting/reconciliation/ReconciliationAccountSettingsPage.tsx @@ -45,7 +45,7 @@ function ReconciliationAccountSettingsPage({route}: ReconciliationAccountSetting const paymentBankAccountID = cardSettings?.paymentBankAccountID; const selectedBankAccount = useMemo(() => bankAccountList?.[paymentBankAccountID?.toString() ?? ''], [paymentBankAccountID, bankAccountList]); - const bankAccountNumber = useMemo(() => selectedBankAccount?.accountData?.accountNumber ?? '', [selectedBankAccount]); + const bankAccountNumber = useMemo(() => selectedBankAccount?.accountData?.accountNumber ?? '', [selectedBankAccount?.accountData?.accountNumber]); const settlementAccountEnding = getLastFourDigits(bankAccountNumber); const domainName = cardSettings?.domainName ?? getDomainNameForPolicy(policyID); const {environmentURL} = useEnvironment(); diff --git a/src/pages/workspace/accounting/xero/XeroMapTrackingCategoryConfigurationPage.tsx b/src/pages/workspace/accounting/xero/XeroMapTrackingCategoryConfigurationPage.tsx index d569f0f3b4ba..d0e4eca9218d 100644 --- a/src/pages/workspace/accounting/xero/XeroMapTrackingCategoryConfigurationPage.tsx +++ b/src/pages/workspace/accounting/xero/XeroMapTrackingCategoryConfigurationPage.tsx @@ -91,7 +91,7 @@ function XeroMapTrackingCategoryConfigurationPage({policy}: WithPolicyProps) { } Navigation.goBack(ROUTES.POLICY_ACCOUNTING_XERO_TRACKING_CATEGORIES.getRoute(policyID)); }, - [categoryId, currentTrackingCategoryValue, reportFieldTrackingCategories, policy, policyID], + [categoryId, currentTrackingCategoryValue, reportFieldTrackingCategories.length, policy, policyID], ); return ( diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardPageEmptyState.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardPageEmptyState.tsx index 205fd20fab00..57c73029f7bb 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardPageEmptyState.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardPageEmptyState.tsx @@ -58,7 +58,7 @@ function WorkspaceCompanyCardPageEmptyState({policy, shouldShowGBDisclaimer}: Wo icon: feature.icon, translationKey: feature.translationKey, })); - }, [illustrations]); + }, [illustrations.CreditCardsNew, illustrations.HandCard, illustrations.MagnifyingGlassMoney]); const handleCtaPress = useCallback(() => { if (!policy?.id) { @@ -70,7 +70,7 @@ function WorkspaceCompanyCardPageEmptyState({policy, shouldShowGBDisclaimer}: Wo } clearAddNewCardFlow(); Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_ADD_NEW.getRoute(policy.id)); - }, [policy, isActingAsDelegate, showDelegateNoAccessModal]); + }, [policy?.id, isActingAsDelegate, showDelegateNoAccessModal]); return ( diff --git a/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx b/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx index 0a4025da1d0f..05d1f56f91e0 100644 --- a/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx +++ b/src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx @@ -41,7 +41,7 @@ function PlaidConnectionStep({feed, policyID, onExit}: {feed?: CompanyCardFeed; const {isOffline} = useNetwork(); const domain = getDomainNameForPolicy(policyID); - const isAuthenticatedWithPlaid = useCallback(() => !!plaidData?.bankAccounts?.length || !isEmptyObject(plaidData?.errors), [plaidData]); + const isAuthenticatedWithPlaid = useCallback(() => !!plaidData?.bankAccounts?.length || !isEmptyObject(plaidData?.errors), [plaidData?.bankAccounts?.length, plaidData?.errors]); /** * Blocks the keyboard shortcuts that can navigate diff --git a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx index 045b784c01d5..7acb1aca5d38 100644 --- a/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx +++ b/src/pages/workspace/companyCards/addNew/StatementCloseDateStep.tsx @@ -41,7 +41,7 @@ function StatementCloseDateStep({policyID}: StatementCloseDateStepProps) { Navigation.goBack(ROUTES.WORKSPACE_COMPANY_CARDS.getRoute(policyID)); } }, - [policyID, addNewCard, cardFeeds, lastSelectedFeed, isPlaid], + [policyID, addNewCard?.data.feedType, addNewCard?.data.feedDetails, cardFeeds, lastSelectedFeed, isPlaid], ); const goBack = useCallback(() => { diff --git a/src/pages/workspace/companyCards/assignCard/ConfirmationStep.tsx b/src/pages/workspace/companyCards/assignCard/ConfirmationStep.tsx index 470ea0ea3562..3aba3479588c 100644 --- a/src/pages/workspace/companyCards/assignCard/ConfirmationStep.tsx +++ b/src/pages/workspace/companyCards/assignCard/ConfirmationStep.tsx @@ -67,7 +67,7 @@ function ConfirmationStep({policyID, feed, backTo}: ConfirmationStepProps) { } // eslint-disable-next-line @typescript-eslint/no-deprecated InteractionManager.runAfterInteractions(() => clearAssignCardStepAndData()); - }, [assignCard, backTo, policyID, currentFullScreenRoute?.state?.routes]); + }, [assignCard?.isAssigned, backTo, policyID, currentFullScreenRoute?.state?.routes]); const submit = () => { if (!policyID) { diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRateNameEditPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRateNameEditPage.tsx index 98f30da9ca80..8dbaf9d4ca71 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRateNameEditPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRateNameEditPage.tsx @@ -52,7 +52,7 @@ function PolicyDistanceRateNameEditPage({route}: PolicyDistanceRateNameEditPageP return errors; }, - [customUnit, currentRateName, translate], + [customUnit?.rates, currentRateName, translate], ); const submit = useCallback( diff --git a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx index 2b8bc8634666..9ebae716771b 100644 --- a/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx +++ b/src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx @@ -75,7 +75,7 @@ function PolicyDistanceRatesPage({ const canSelectMultiple = shouldUseNarrowLayout ? isMobileSelectionModeEnabled : true; const {asset: CarIce} = useMemoizedLazyAsset(() => loadIllustration('CarIce' as IllustrationName)); const customUnit = useMemo(() => getDistanceRateCustomUnit(policy), [policy]); - const customUnitRates: Record = useMemo(() => customUnit?.rates ?? {}, [customUnit]); + const customUnitRates: Record = useMemo(() => customUnit?.rates ?? {}, [customUnit?.rates]); const selectableRates = useMemo( () => @@ -133,7 +133,7 @@ function PolicyDistanceRatesPage({ {transactionIDs: new Set(), rateIDToTransactionIDsMap: {} as Record}, ); }, - [customUnit, rateIDs, policyReports], + [customUnit?.customUnitID, rateIDs, policyReports], ); const [eligibleTransactionsData] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, { @@ -250,7 +250,7 @@ function PolicyDistanceRatesPage({ /> ), })), - [canDisableOrDeleteRate, customUnitRates, translate, customUnit, policy?.pendingAction, updateDistanceRateEnabled], + [canDisableOrDeleteRate, customUnitRates, translate, customUnit?.attributes?.unit, customUnit?.pendingFields?.attributes, policy?.pendingAction, updateDistanceRateEnabled], ); const filterRate = useCallback((rate: RateForList, searchInput: string) => { diff --git a/src/pages/workspace/expensifyCard/WorkspaceEditCardLimitTypePage.tsx b/src/pages/workspace/expensifyCard/WorkspaceEditCardLimitTypePage.tsx index 0004f5aac6e4..dc7a852f06f0 100644 --- a/src/pages/workspace/expensifyCard/WorkspaceEditCardLimitTypePage.tsx +++ b/src/pages/workspace/expensifyCard/WorkspaceEditCardLimitTypePage.tsx @@ -152,7 +152,7 @@ function WorkspaceEditCardLimitTypePage({route}: WorkspaceEditCardLimitTypePageP } return options; - }, [areApprovalsConfigured, card, initialLimitType, translate, typeSelected]); + }, [areApprovalsConfigured, card?.totalSpend, card?.nameValuePairs?.unapprovedExpenseLimit, initialLimitType, translate, typeSelected]); return ( Navigation.goBack()); - }, [member, prevMember]); + }, [member?.pendingAction, prevMember]); const askForConfirmationToRemove = () => { if (isReimburser) { diff --git a/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx b/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx index 9796e123292f..c05e9460d786 100644 --- a/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx +++ b/src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx @@ -74,7 +74,7 @@ function WorkspaceReceiptPartnersPage({route}: WorkspaceReceiptPartnersPageProps } } }, - [integrations], + [integrations?.uber?.connectFormData], ); const fetchReceiptPartners = useCallback(() => { diff --git a/src/pages/workspace/reports/WorkspaceReportsPage.tsx b/src/pages/workspace/reports/WorkspaceReportsPage.tsx index 3b43760a9942..35e2f4eefe69 100644 --- a/src/pages/workspace/reports/WorkspaceReportsPage.tsx +++ b/src/pages/workspace/reports/WorkspaceReportsPage.tsx @@ -77,7 +77,7 @@ function WorkspaceReportFieldsPage({ } // eslint-disable-next-line @typescript-eslint/no-unused-vars return Object.fromEntries(Object.entries(policy.fieldList).filter(([_, value]) => value.fieldID !== 'text_title')); - }, [policy]); + }, [policy?.fieldList]); const [isOrganizeWarningModalOpen, setIsOrganizeWarningModalOpen] = useState(false); const illustrations = useMemoizedLazyIllustrations(['ReportReceipt'] as const); From e5d8a3630070412493664e39f63a5354e6439313 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Tue, 25 Nov 2025 23:32:01 +0100 Subject: [PATCH 04/11] remove PERF-6 rule from ai reviewer --- .claude/agents/code-inline-reviewer.md | 33 -------------------------- 1 file changed, 33 deletions(-) diff --git a/.claude/agents/code-inline-reviewer.md b/.claude/agents/code-inline-reviewer.md index 9b722a038d3b..39a8e15b8c69 100644 --- a/.claude/agents/code-inline-reviewer.md +++ b/.claude/agents/code-inline-reviewer.md @@ -198,39 +198,6 @@ memo(ReportActionItem, (prevProps, nextProps) => ) ``` ---- - -### [PERF-6] Use specific properties as hook dependencies - -- **Search patterns**: `useEffect`, `useMemo`, `useCallback` dependency arrays - -- **Condition**: In `useEffect`, `useMemo`, and `useCallback`, specify individual object properties as dependencies instead of passing entire objects. -- **Reasoning**: Passing entire objects as dependencies causes hooks to re-execute whenever any property changes, even unrelated ones. Specifying individual properties creates more granular dependency tracking, reducing unnecessary hook executions and improving performance predictability. - -Good: - -```tsx -const {amountColumnSize, dateColumnSize, taxAmountColumnSize} = useMemo(() => { - return { - amountColumnSize: transactionItem.isAmountColumnWide ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL, - taxAmountColumnSize: transactionItem.isTaxAmountColumnWide ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL, - dateColumnSize: transactionItem.shouldShowYear ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL, - }; -}, [transactionItem.isAmountColumnWide, transactionItem.isTaxAmountColumnWide, transactionItem.shouldShowYear]); -``` - -Bad: - -```tsx -const {amountColumnSize, dateColumnSize, taxAmountColumnSize} = useMemo(() => { - return { - amountColumnSize: transactionItem.isAmountColumnWide ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL, - taxAmountColumnSize: transactionItem.isTaxAmountColumnWide ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL, - dateColumnSize: transactionItem.shouldShowYear ? CONST.SEARCH.TABLE_COLUMN_SIZES.WIDE : CONST.SEARCH.TABLE_COLUMN_SIZES.NORMAL, - }; -}, [transactionItem]); -``` - ## Instructions 1. **First, get the list of changed files and their diffs:** From 23ece5b4b82fac6af0ecc1ca8a677d344dde0534 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Tue, 25 Nov 2025 23:38:18 +0100 Subject: [PATCH 05/11] fix prettier --- .../MoneyRequestConfirmationList.tsx | 13 ++++++++++++- .../PopoverWithMeasuredContentBase.tsx | 11 ++++++++++- .../SearchPageHeader/SearchFiltersBar.tsx | 6 ++++-- .../PlaybackContext/index.tsx | 16 +++++++++++++++- src/pages/InviteReportParticipantsPage.tsx | 12 +++++++++++- .../BaseOnboardingInterestedFeatures.tsx | 15 ++++++++++++++- .../subSteps/AverageReimbursement.tsx | 5 ++++- .../BusinessInfo/subSteps/BusinessType.tsx | 5 ++++- .../BusinessInfo/subSteps/PaymentVolume.tsx | 5 ++++- src/pages/home/report/PureReportActionItem.tsx | 3 ++- .../ReportActionCompose.tsx | 8 +++++++- .../subSteps/AverageReimbursement.tsx | 5 ++++- .../BusinessInfo/subSteps/BusinessType.tsx | 5 ++++- .../BusinessInfo/subSteps/PaymentVolume.tsx | 5 ++++- src/pages/workspace/WorkspaceInitialPage.tsx | 18 +++++++++++++++++- src/pages/workspace/WorkspaceInvitePage.tsx | 5 ++++- 16 files changed, 120 insertions(+), 17 deletions(-) diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx index 7352ab7fec57..375404d588fd 100755 --- a/src/components/MoneyRequestConfirmationList.tsx +++ b/src/components/MoneyRequestConfirmationList.tsx @@ -453,7 +453,18 @@ function MoneyRequestConfirmationList({ // If none of the above conditions are met, display the rate error setFormError(errorKey); - }, [isDistanceRequest, isPolicyExpenseChat, transactionID, mileageRate.rate, mileageRate.unit, customUnitRateID, policy, isMovingTransactionFromTrackExpense, setFormError, clearFormErrors]); + }, [ + isDistanceRequest, + isPolicyExpenseChat, + transactionID, + mileageRate.rate, + mileageRate.unit, + customUnitRateID, + policy, + isMovingTransactionFromTrackExpense, + setFormError, + clearFormErrors, + ]); const routeError = Object.values(transaction?.errorFields?.route ?? {}).at(0); const isFirstUpdatedDistanceAmount = useRef(false); diff --git a/src/components/PopoverWithMeasuredContent/PopoverWithMeasuredContentBase.tsx b/src/components/PopoverWithMeasuredContent/PopoverWithMeasuredContentBase.tsx index c3e24ed936fc..5c66617bc7d0 100644 --- a/src/components/PopoverWithMeasuredContent/PopoverWithMeasuredContentBase.tsx +++ b/src/components/PopoverWithMeasuredContent/PopoverWithMeasuredContentBase.tsx @@ -182,7 +182,16 @@ function PopoverWithMeasuredContentBase({ } return result; - }, [adjustedAnchorPosition.left, adjustedAnchorPosition.top, positionCalculations.horizontalShift, positionCalculations.verticalShift, anchorAlignment.vertical, windowHeight, popoverHeight, shouldMeasureAnchorPositionFromTop]); + }, [ + adjustedAnchorPosition.left, + adjustedAnchorPosition.top, + positionCalculations.horizontalShift, + positionCalculations.verticalShift, + anchorAlignment.vertical, + windowHeight, + popoverHeight, + shouldMeasureAnchorPositionFromTop, + ]); return isContentMeasured ? ( {children}; diff --git a/src/pages/InviteReportParticipantsPage.tsx b/src/pages/InviteReportParticipantsPage.tsx index 2e5d9b8bb8d2..169e37a4a90a 100644 --- a/src/pages/InviteReportParticipantsPage.tsx +++ b/src/pages/InviteReportParticipantsPage.tsx @@ -167,7 +167,17 @@ function InviteReportParticipantsPage({report}: InviteReportParticipantsPageProp countryCode, false, ); - }, [searchTerm, availableOptions.userToInvite, availableOptions.recentReports.length, availableOptions.personalDetails.length, selectedOptionsForDisplay.length, excludedUsers, translate, reportName, countryCode]); + }, [ + searchTerm, + availableOptions.userToInvite, + availableOptions.recentReports.length, + availableOptions.personalDetails.length, + selectedOptionsForDisplay.length, + excludedUsers, + translate, + reportName, + countryCode, + ]); const footerContent = useMemo( () => ( diff --git a/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx b/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx index b06a9b3b2c73..e6bf59c83505 100644 --- a/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx +++ b/src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx @@ -114,7 +114,20 @@ function BaseOnboardingInterestedFeatures({shouldUseNativeStyles}: BaseOnboardin requiresUpdate: true, }, ]; - }, [illustrations.FolderOpen, illustrations.Accounting, illustrations.CompanyCard, illustrations.Workflows, illustrations.InvoiceBlue, illustrations.Rules, illustrations.Car, illustrations.HandCard, illustrations.Tag, illustrations.PerDiem, translate, userReportedIntegration]); + }, [ + illustrations.FolderOpen, + illustrations.Accounting, + illustrations.CompanyCard, + illustrations.Workflows, + illustrations.InvoiceBlue, + illustrations.Rules, + illustrations.Car, + illustrations.HandCard, + illustrations.Tag, + illustrations.PerDiem, + translate, + userReportedIntegration, + ]); const [userToggledFeatures, setUserToggledFeatures] = useState>(new Set()); diff --git a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/AverageReimbursement.tsx b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/AverageReimbursement.tsx index 8cb868439468..309809d2afa0 100644 --- a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/AverageReimbursement.tsx +++ b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/AverageReimbursement.tsx @@ -21,7 +21,10 @@ function AverageReimbursement({onNext, onMove, isEditing}: AverageReimbursementP const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: false}); const currency = policy?.outputCurrency ?? ''; - const tradeVolumeRangeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.TradeVolumeRange), [corpayOnboardingFields?.picklists.TradeVolumeRange]); + const tradeVolumeRangeListOptions = useMemo( + () => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.TradeVolumeRange), + [corpayOnboardingFields?.picklists.TradeVolumeRange], + ); const pushRowFields = useMemo( () => [ diff --git a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/BusinessType.tsx b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/BusinessType.tsx index f50b6e75fd81..da0f00259d5d 100644 --- a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/BusinessType.tsx +++ b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/BusinessType.tsx @@ -25,7 +25,10 @@ function BusinessType({onNext, isEditing, onMove}: BusinessTypeProps) { const isBusinessTypeRequired = country !== CONST.COUNTRY.CA; const incorporationTypeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.ApplicantType), [corpayOnboardingFields?.picklists.ApplicantType]); - const natureOfBusinessListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.NatureOfBusiness), [corpayOnboardingFields?.picklists.NatureOfBusiness]); + const natureOfBusinessListOptions = useMemo( + () => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.NatureOfBusiness), + [corpayOnboardingFields?.picklists.NatureOfBusiness], + ); const businessTypeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.BusinessType), [corpayOnboardingFields?.picklists.BusinessType]); const incorporationTypeDefaultValue = reimbursementAccount?.achData?.corpay?.[APPLICANT_TYPE_ID] ?? ''; diff --git a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/PaymentVolume.tsx b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/PaymentVolume.tsx index 711b78e66466..521d94e5b0ad 100644 --- a/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/PaymentVolume.tsx +++ b/src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/PaymentVolume.tsx @@ -21,7 +21,10 @@ function PaymentVolume({onNext, onMove, isEditing}: PaymentVolumeProps) { const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: false}); const currency = policy?.outputCurrency ?? ''; - const annualVolumeRangeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.AnnualVolumeRange), [corpayOnboardingFields?.picklists.AnnualVolumeRange]); + const annualVolumeRangeListOptions = useMemo( + () => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.AnnualVolumeRange), + [corpayOnboardingFields?.picklists.AnnualVolumeRange], + ); const annualVolumeDefaultValue = reimbursementAccount?.achData?.corpay?.[ANNUAL_VOLUME] ?? ''; diff --git a/src/pages/home/report/PureReportActionItem.tsx b/src/pages/home/report/PureReportActionItem.tsx index 614d7d646f3a..2e033206c2c7 100644 --- a/src/pages/home/report/PureReportActionItem.tsx +++ b/src/pages/home/report/PureReportActionItem.tsx @@ -704,7 +704,8 @@ function PureReportActionItem({ }, [ draftMessage, - action.errors, action.reportActionID, + action.errors, + action.reportActionID, reportID, toggleContextMenuFromActiveReportAction, originalReportID, diff --git a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx index 7332d2f14ce9..1ba94b09ebf2 100644 --- a/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx +++ b/src/pages/home/report/ReportActionCompose/ReportActionCompose.tsx @@ -464,7 +464,13 @@ function ReportActionCompose({ const reportActionComposeHeight = emojiPositionValues.composeBoxMinHeight + chatItemComposeSecondaryRowHeight; const emojiOffsetWithComposeBox = (emojiPositionValues.composeBoxMinHeight - emojiPositionValues.emojiButtonHeight) / 2; return reportActionComposeHeight - emojiOffsetWithComposeBox - CONST.MENU_POSITION_REPORT_ACTION_COMPOSE_BOTTOM; - }, [emojiPositionValues.secondaryRowHeight, emojiPositionValues.secondaryRowMarginTop, emojiPositionValues.secondaryRowMarginBottom, emojiPositionValues.composeBoxMinHeight, emojiPositionValues.emojiButtonHeight]); + }, [ + emojiPositionValues.secondaryRowHeight, + emojiPositionValues.secondaryRowMarginTop, + emojiPositionValues.secondaryRowMarginBottom, + emojiPositionValues.composeBoxMinHeight, + emojiPositionValues.emojiButtonHeight, + ]); const onValueChange = useCallback( (value: string) => { diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/AverageReimbursement.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/AverageReimbursement.tsx index 1d0322f8e62b..189dd5d572a3 100644 --- a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/AverageReimbursement.tsx +++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/AverageReimbursement.tsx @@ -18,7 +18,10 @@ function AverageReimbursements({onNext, onMove, isEditing, currency}: AverageRei const [enableGlobalReimbursementsDraft] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT, {canBeMissing: true}); const [corpayOnboardingFields] = useOnyx(ONYXKEYS.CORPAY_ONBOARDING_FIELDS, {canBeMissing: true}); - const tradeVolumeRangeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.TradeVolumeRange), [corpayOnboardingFields?.picklists.TradeVolumeRange]); + const tradeVolumeRangeListOptions = useMemo( + () => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.TradeVolumeRange), + [corpayOnboardingFields?.picklists.TradeVolumeRange], + ); const pushRowFields = useMemo( () => [ diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/BusinessType.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/BusinessType.tsx index bb4d6aa7445d..b564930a1af7 100644 --- a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/BusinessType.tsx +++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/BusinessType.tsx @@ -17,7 +17,10 @@ function BusinessType({onNext, onMove, isEditing}: SubStepProps) { const [corpayOnboardingFields] = useOnyx(ONYXKEYS.CORPAY_ONBOARDING_FIELDS, {canBeMissing: true}); const incorporationTypeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.ApplicantType), [corpayOnboardingFields?.picklists.ApplicantType]); - const natureOfBusinessListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.NatureOfBusiness), [corpayOnboardingFields?.picklists.NatureOfBusiness]); + const natureOfBusinessListOptions = useMemo( + () => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.NatureOfBusiness), + [corpayOnboardingFields?.picklists.NatureOfBusiness], + ); const pushRowFields = useMemo( () => [ diff --git a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/PaymentVolume.tsx b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/PaymentVolume.tsx index 515009e52502..58d155db1606 100644 --- a/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/PaymentVolume.tsx +++ b/src/pages/settings/Wallet/EnableGlobalReimbursements/BusinessInfo/subSteps/PaymentVolume.tsx @@ -18,7 +18,10 @@ function PaymentVolume({onNext, onMove, isEditing, currency}: PaymentVolumeProps const [enableGlobalReimbursementsDraft] = useOnyx(ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT, {canBeMissing: true}); const [corpayOnboardingFields] = useOnyx(ONYXKEYS.CORPAY_ONBOARDING_FIELDS, {canBeMissing: true}); - const annualVolumeRangeListOptions = useMemo(() => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.AnnualVolumeRange), [corpayOnboardingFields?.picklists.AnnualVolumeRange]); + const annualVolumeRangeListOptions = useMemo( + () => getListOptionsFromCorpayPicklist(corpayOnboardingFields?.picklists.AnnualVolumeRange), + [corpayOnboardingFields?.picklists.AnnualVolumeRange], + ); const pushRowFields = useMemo( () => [ diff --git a/src/pages/workspace/WorkspaceInitialPage.tsx b/src/pages/workspace/WorkspaceInitialPage.tsx index 0ddc3c25e8a8..c4382e664a39 100644 --- a/src/pages/workspace/WorkspaceInitialPage.tsx +++ b/src/pages/workspace/WorkspaceInitialPage.tsx @@ -158,7 +158,23 @@ function WorkspaceInitialPage({policyDraft, policy: policyProp, route}: Workspac [CONST.POLICY.MORE_FEATURES.ARE_PER_DIEM_RATES_ENABLED]: policy?.arePerDiemRatesEnabled, [CONST.POLICY.MORE_FEATURES.ARE_RECEIPT_PARTNERS_ENABLED]: isUberForBusinessEnabled && (policy?.receiptPartners?.enabled ?? false), }), - [policy?.areDistanceRatesEnabled, policy?.areWorkflowsEnabled, policy?.areCategoriesEnabled, policy?.areTagsEnabled, policy?.tax?.trackingEnabled, policy?.areCompanyCardsEnabled, policy?.areConnectionsEnabled, policy?.connections, policy?.areExpensifyCardsEnabled, policy?.areReportFieldsEnabled, policy?.areRulesEnabled, policy?.areInvoicesEnabled, policy?.arePerDiemRatesEnabled, policy?.receiptPartners?.enabled, isUberForBusinessEnabled], + [ + policy?.areDistanceRatesEnabled, + policy?.areWorkflowsEnabled, + policy?.areCategoriesEnabled, + policy?.areTagsEnabled, + policy?.tax?.trackingEnabled, + policy?.areCompanyCardsEnabled, + policy?.areConnectionsEnabled, + policy?.connections, + policy?.areExpensifyCardsEnabled, + policy?.areReportFieldsEnabled, + policy?.areRulesEnabled, + policy?.areInvoicesEnabled, + policy?.arePerDiemRatesEnabled, + policy?.receiptPartners?.enabled, + isUberForBusinessEnabled, + ], ) as PolicyFeatureStates; const fetchPolicyData = useCallback(() => { diff --git a/src/pages/workspace/WorkspaceInvitePage.tsx b/src/pages/workspace/WorkspaceInvitePage.tsx index e11116055eae..1e3e668c79bb 100644 --- a/src/pages/workspace/WorkspaceInvitePage.tsx +++ b/src/pages/workspace/WorkspaceInvitePage.tsx @@ -152,7 +152,10 @@ function WorkspaceInvitePage({route, policy}: WorkspaceInvitePageProps) { Navigation.navigate(ROUTES.WORKSPACE_INVITE_MESSAGE.getRoute(route.params.policyID, Navigation.getActiveRoute())); }, [route.params.policyID, selectedOptions]); - const [policyName, shouldShowAlertPrompt] = useMemo(() => [policy?.name ?? '', !isEmptyObject(policy?.errors) || !!policy?.alertMessage], [policy?.name, policy?.errors, policy?.alertMessage]); + const [policyName, shouldShowAlertPrompt] = useMemo( + () => [policy?.name ?? '', !isEmptyObject(policy?.errors) || !!policy?.alertMessage], + [policy?.name, policy?.errors, policy?.alertMessage], + ); const headerMessage = useMemo(() => { const searchValue = searchTerm.trim().toLowerCase(); From c60e1bcc17c8049f9924e9b1c4274660528a7555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Tue, 25 Nov 2025 23:54:26 +0100 Subject: [PATCH 06/11] fix other linter errors --- src/hooks/useIsAuthenticated.tsx | 2 +- .../AddBankAccount/substeps/PlaidStep.tsx | 4 ++-- .../USD/BankInfo/subSteps/Plaid.tsx | 6 +++--- .../components/BankAccountValidationForm.tsx | 16 ++++++++-------- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/hooks/useIsAuthenticated.tsx b/src/hooks/useIsAuthenticated.tsx index 3c0d6d6a5473..0910afa1ce0e 100644 --- a/src/hooks/useIsAuthenticated.tsx +++ b/src/hooks/useIsAuthenticated.tsx @@ -3,7 +3,7 @@ import ONYXKEYS from '@src/ONYXKEYS'; import useOnyx from './useOnyx'; function useIsAuthenticated() { - const [session] = useOnyx(ONYXKEYS.SESSION); + const [session] = useOnyx(ONYXKEYS.SESSION, {canBeMissing: true}); const isAuthenticated = useMemo(() => !!(session?.authToken ?? null), [session?.authToken]); return isAuthenticated; } diff --git a/src/pages/EnablePayments/AddBankAccount/substeps/PlaidStep.tsx b/src/pages/EnablePayments/AddBankAccount/substeps/PlaidStep.tsx index 5c53fc39841c..74564d93b404 100644 --- a/src/pages/EnablePayments/AddBankAccount/substeps/PlaidStep.tsx +++ b/src/pages/EnablePayments/AddBankAccount/substeps/PlaidStep.tsx @@ -17,8 +17,8 @@ function PlaidStep({onNext}: SubStepProps) { const {translate} = useLocalize(); const styles = useThemeStyles(); const isFocused = useIsFocused(); - const [personalBankAccountDraft] = useOnyx(ONYXKEYS.FORMS.PERSONAL_BANK_ACCOUNT_FORM_DRAFT); - const [plaidData] = useOnyx(ONYXKEYS.PLAID_DATA); + const [personalBankAccountDraft] = useOnyx(ONYXKEYS.FORMS.PERSONAL_BANK_ACCOUNT_FORM_DRAFT, {canBeMissing: true}); + const [plaidData] = useOnyx(ONYXKEYS.PLAID_DATA, {canBeMissing: true}); const selectedPlaidAccountID = personalBankAccountDraft?.[BANK_INFO_STEP_KEYS.PLAID_ACCOUNT_ID] ?? ''; const handleNextPress = useCallback(() => { diff --git a/src/pages/ReimbursementAccount/USD/BankInfo/subSteps/Plaid.tsx b/src/pages/ReimbursementAccount/USD/BankInfo/subSteps/Plaid.tsx index 6badeef0d2d0..bd99dd472295 100644 --- a/src/pages/ReimbursementAccount/USD/BankInfo/subSteps/Plaid.tsx +++ b/src/pages/ReimbursementAccount/USD/BankInfo/subSteps/Plaid.tsx @@ -20,9 +20,9 @@ type PlaidProps = SubStepProps & { const BANK_INFO_STEP_KEYS = INPUT_IDS.BANK_INFO_STEP; function Plaid({onNext, setUSDBankAccountStep}: PlaidProps) { - const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT); - const [reimbursementAccountDraft] = useOnyx(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT); - const [plaidData] = useOnyx(ONYXKEYS.PLAID_DATA); + const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: true}); + const [reimbursementAccountDraft] = useOnyx(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT, {canBeMissing: true}); + const [plaidData] = useOnyx(ONYXKEYS.PLAID_DATA, {canBeMissing: true}); const {translate} = useLocalize(); const styles = useThemeStyles(); diff --git a/src/pages/ReimbursementAccount/USD/ConnectBankAccount/components/BankAccountValidationForm.tsx b/src/pages/ReimbursementAccount/USD/ConnectBankAccount/components/BankAccountValidationForm.tsx index 62176e1ac4ea..3a1fa5693af2 100644 --- a/src/pages/ReimbursementAccount/USD/ConnectBankAccount/components/BankAccountValidationForm.tsx +++ b/src/pages/ReimbursementAccount/USD/ConnectBankAccount/components/BankAccountValidationForm.tsx @@ -9,10 +9,10 @@ import Text from '@components/Text'; import TextInput from '@components/TextInput'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; -import * as CurrencyUtils from '@libs/CurrencyUtils'; +import {validateBankAccount} from '@libs/actions/BankAccounts'; +import {getCurrencyDecimals} from '@libs/CurrencyUtils'; import getPermittedDecimalSeparator from '@libs/getPermittedDecimalSeparator'; -import * as ValidationUtils from '@libs/ValidationUtils'; -import * as BankAccounts from '@userActions/BankAccounts'; +import {isRequiredFulfilled} from '@libs/ValidationUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import INPUT_IDS from '@src/types/form/ReimbursementAccountForm'; @@ -59,19 +59,19 @@ function BankAccountValidationForm({requiresTwoFactorAuth, reimbursementAccount, const {translate, toLocaleDigit} = useLocalize(); const styles = useThemeStyles(); - const policyID = reimbursementAccount?.achData?.policyID ?? '-1'; + const policyID = reimbursementAccount?.achData?.policyID ?? String(CONST.DEFAULT_NUMBER_ID); const decimalSeparator = toLocaleDigit('.'); const permittedDecimalSeparator = getPermittedDecimalSeparator(decimalSeparator); const validate = (values: FormOnyxValues): FormInputErrors => { const errors: FormInputErrors = {}; const amountValues = getAmountValues(values); const outputCurrency = policy?.outputCurrency ?? CONST.CURRENCY.USD; - const amountRegex = RegExp(String.raw`^-?\d{0,8}([${permittedDecimalSeparator}]\d{0,${CurrencyUtils.getCurrencyDecimals(outputCurrency)}})?$`, 'i'); + const amountRegex = RegExp(String.raw`^-?\d{0,8}([${permittedDecimalSeparator}]\d{0,${getCurrencyDecimals(outputCurrency)}})?$`, 'i'); for (const key of Object.keys(amountValues)) { const value = amountValues[key as keyof AmountValues]; const filteredValue = filterInput(value, amountRegex, permittedDecimalSeparator); - if (ValidationUtils.isRequiredFulfilled(filteredValue.toString())) { + if (isRequiredFulfilled(filteredValue.toString())) { continue; } errors[key as keyof AmountValues] = translate('common.error.invalidAmount'); @@ -89,9 +89,9 @@ function BankAccountValidationForm({requiresTwoFactorAuth, reimbursementAccount, const validateCode = [amount1, amount2, amount3].join(','); // Send valid amounts to BankAccountAPI::validateBankAccount in Web-Expensify - const bankAccountID = Number(reimbursementAccount?.achData?.bankAccountID ?? '-1'); + const bankAccountID = Number(reimbursementAccount?.achData?.bankAccountID ?? CONST.DEFAULT_NUMBER_ID); if (bankAccountID) { - BankAccounts.validateBankAccount(bankAccountID, validateCode, policyID); + validateBankAccount(bankAccountID, validateCode, policyID); } }, [reimbursementAccount?.achData?.bankAccountID, policyID, permittedDecimalSeparator], From 9c697c51cbcbee239e87ebf24c439e814af5ce89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Wed, 26 Nov 2025 16:40:33 +0100 Subject: [PATCH 07/11] ignore cSpell in eslint config --- eslint.config.mjs | 1 + 1 file changed, 1 insertion(+) diff --git a/eslint.config.mjs b/eslint.config.mjs index 24c5b7246078..cf4b5ce55c10 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -276,6 +276,7 @@ const config = defineConfig([ 'error', { stableObjectPatterns: [ + // cSpell:ignore tyles '[Ss]tyles?$', // Excludes 'style', 'styles', 'themeStyles', etc. '^theme', // Excludes 'theme', 'themeStyles', 'themeIllustrations', etc. '[Ii]cons?$', // Excludes 'icon', 'icons', 'expensifyIcons', etc. From 9cf6412b2299f6a93cba6213f334d989aeef5537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Thu, 27 Nov 2025 10:27:38 +0100 Subject: [PATCH 08/11] fix linter errors --- src/pages/AddUnreportedExpense.tsx | 17 +++++++++++++++-- .../companyCards/assignCard/AssigneeStep.tsx | 2 +- .../WorkspaceAutoReportingMonthlyOffsetPage.tsx | 2 +- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/pages/AddUnreportedExpense.tsx b/src/pages/AddUnreportedExpense.tsx index 3d5aa3e3ecad..0a1e439c55c6 100644 --- a/src/pages/AddUnreportedExpense.tsx +++ b/src/pages/AddUnreportedExpense.tsx @@ -195,7 +195,20 @@ function AddUnreportedExpense({route}: AddUnreportedExpensePageType) { } }); setErrorMessage(''); - }, [selectedIds, translate, report, isASAPSubmitBetaEnabled, session?.accountID, session?.email, reportToConfirm, policy, reportNextStep, policyCategories, transactionViolations]); + }, [ + selectedIds, + translate, + report, + isASAPSubmitBetaEnabled, + session?.accountID, + session?.email, + transactionViolations, + reportToConfirm, + policy, + reportNextStep, + policyCategories, + selfDMReportID, + ]); const footerContent = useMemo(() => { return ( @@ -225,7 +238,7 @@ function AddUnreportedExpense({route}: AddUnreportedExpensePageType) { return translate('common.noResultsFound'); } return ''; - }, [debouncedSearchValue, unreportedExpenses, translate]); + }, [debouncedSearchValue, unreportedExpenses?.length, translate]); const textInputOptions = useMemo( () => ({ diff --git a/src/pages/workspace/companyCards/assignCard/AssigneeStep.tsx b/src/pages/workspace/companyCards/assignCard/AssigneeStep.tsx index d415f625cb27..fa86c380fcae 100644 --- a/src/pages/workspace/companyCards/assignCard/AssigneeStep.tsx +++ b/src/pages/workspace/companyCards/assignCard/AssigneeStep.tsx @@ -212,7 +212,7 @@ function AssigneeStep({policy, feed, route}: AssigneeStepProps) { return translate('messages.errorMessageInvalidEmail'); } return getHeaderMessage(assignees.length > 0, !!availableOptions.userToInvite, searchValue, countryCode, false); - }, [searchTerm, availableOptions.userToInvite, assignees, countryCode, translate]); + }, [searchTerm, availableOptions.userToInvite, assignees?.length, countryCode, translate]); const textInputOptions = useMemo( () => ({ diff --git a/src/pages/workspace/workflows/WorkspaceAutoReportingMonthlyOffsetPage.tsx b/src/pages/workspace/workflows/WorkspaceAutoReportingMonthlyOffsetPage.tsx index 37ec9755345f..32e6cf1207f4 100644 --- a/src/pages/workspace/workflows/WorkspaceAutoReportingMonthlyOffsetPage.tsx +++ b/src/pages/workspace/workflows/WorkspaceAutoReportingMonthlyOffsetPage.tsx @@ -76,7 +76,7 @@ function WorkspaceAutoReportingMonthlyOffsetPage({policy, route}: WorkspaceAutoR onChangeText: setSearchText, headerMessage: searchText.trim() && !filteredDaysOfMonth.length ? translate('common.noResultsFound') : '', }), - [searchText, filteredDaysOfMonth, setSearchText, translate], + [searchText, filteredDaysOfMonth.length, setSearchText, translate], ); return ( From 5ded4eeaeb203f9570eedeb396c6658868626057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Thu, 27 Nov 2025 11:07:51 +0100 Subject: [PATCH 09/11] fix no-default-id-values --- .../components/BankAccountValidationForm.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/ReimbursementAccount/USD/ConnectBankAccount/components/BankAccountValidationForm.tsx b/src/pages/ReimbursementAccount/USD/ConnectBankAccount/components/BankAccountValidationForm.tsx index 3a1fa5693af2..e8987ea12f8c 100644 --- a/src/pages/ReimbursementAccount/USD/ConnectBankAccount/components/BankAccountValidationForm.tsx +++ b/src/pages/ReimbursementAccount/USD/ConnectBankAccount/components/BankAccountValidationForm.tsx @@ -59,7 +59,7 @@ function BankAccountValidationForm({requiresTwoFactorAuth, reimbursementAccount, const {translate, toLocaleDigit} = useLocalize(); const styles = useThemeStyles(); - const policyID = reimbursementAccount?.achData?.policyID ?? String(CONST.DEFAULT_NUMBER_ID); + const policyID = reimbursementAccount?.achData?.policyID; const decimalSeparator = toLocaleDigit('.'); const permittedDecimalSeparator = getPermittedDecimalSeparator(decimalSeparator); const validate = (values: FormOnyxValues): FormInputErrors => { @@ -90,7 +90,7 @@ function BankAccountValidationForm({requiresTwoFactorAuth, reimbursementAccount, // Send valid amounts to BankAccountAPI::validateBankAccount in Web-Expensify const bankAccountID = Number(reimbursementAccount?.achData?.bankAccountID ?? CONST.DEFAULT_NUMBER_ID); - if (bankAccountID) { + if (bankAccountID && policyID) { validateBankAccount(bankAccountID, validateCode, policyID); } }, From 12c6ec07801a0274104874c97b4da64101f5a488 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= <62747088+kacper-mikolajczak@users.noreply.github.com> Date: Thu, 27 Nov 2025 17:26:46 +0100 Subject: [PATCH 10/11] Update src/pages/InviteReportParticipantsPage.tsx Co-authored-by: Aimane Chnaif <96077027+aimane-chnaif@users.noreply.github.com> --- src/pages/InviteReportParticipantsPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/InviteReportParticipantsPage.tsx b/src/pages/InviteReportParticipantsPage.tsx index 169e37a4a90a..3816b0778446 100644 --- a/src/pages/InviteReportParticipantsPage.tsx +++ b/src/pages/InviteReportParticipantsPage.tsx @@ -111,7 +111,7 @@ function InviteReportParticipantsPage({report}: InviteReportParticipantsPageProp } return sectionsArray; - }, [areOptionsInitialized, selectedOptionsForDisplay, availableOptions.recentReports.length, availableOptions.personalDetails.length, availableOptions.userToInvite, translate]); + }, [areOptionsInitialized, selectedOptionsForDisplay, availableOptions.recentReports, availableOptions.personalDetails, availableOptions.userToInvite, translate]); const handleToggleSelection = useCallback( (option: OptionData) => { From a65d1cbc62d7c4f12ca76b130829af7f9e86092e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kacper=20Miko=C5=82ajczak?= Date: Thu, 27 Nov 2025 19:44:16 +0100 Subject: [PATCH 11/11] fix ts --- src/pages/AddUnreportedExpense.tsx | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/src/pages/AddUnreportedExpense.tsx b/src/pages/AddUnreportedExpense.tsx index a3e897d5e164..5030a57f86cc 100644 --- a/src/pages/AddUnreportedExpense.tsx +++ b/src/pages/AddUnreportedExpense.tsx @@ -193,20 +193,7 @@ function AddUnreportedExpense({route}: AddUnreportedExpensePageType) { } }); setErrorMessage(''); - }, [ - selectedIds, - translate, - report, - isASAPSubmitBetaEnabled, - session?.accountID, - session?.email, - transactionViolations, - reportToConfirm, - policy, - reportNextStep, - policyCategories, - selfDMReportID, - ]); + }, [selectedIds, translate, report, isASAPSubmitBetaEnabled, session?.accountID, session?.email, transactionViolations, reportToConfirm, policy, reportNextStep, policyCategories]); const footerContent = useMemo(() => { return (