diff --git a/config/eslint/eslint.config.mjs b/config/eslint/eslint.config.mjs index 952e455df900..b75bb4e6ac9c 100644 --- a/config/eslint/eslint.config.mjs +++ b/config/eslint/eslint.config.mjs @@ -45,6 +45,16 @@ const localRulesDir = path.resolve(projectRoot, 'eslint-plugin-local-rules'); rulesdir.RULES_DIR = [expensifyRulesDir, localRulesDir]; const restrictedImportPaths = [ + { + name: '@components/Button', + importNames: ['default'], + message: 'The legacy Button is deprecated. Please use the composed Button from `@components/ButtonComposed` instead. Importing the `ButtonProps` type from here is still allowed.', + }, + { + name: '@src/components/Button', + importNames: ['default'], + message: 'The legacy Button is deprecated. Please use the composed Button from `@components/ButtonComposed` instead. Importing the `ButtonProps` type from here is still allowed.', + }, { name: 'react-native', importNames: [ diff --git a/config/eslint/eslint.seatbelt.tsv b/config/eslint/eslint.seatbelt.tsv index 9e03682a2921..abb57fcf797c 100644 --- a/config/eslint/eslint.seatbelt.tsv +++ b/config/eslint/eslint.seatbelt.tsv @@ -85,6 +85,7 @@ "../../src/components/AnimatedFlatListWithCellRenderer.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/AnimatedFlatListWithCellRenderer.tsx" "react-hooks/refs" 2 "../../src/components/AnimatedSubmitButton/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/AnimatedSubmitButton/index.tsx" "no-restricted-imports" 1 "../../src/components/AnimatedSubmitButton/index.tsx" "react-hooks/refs" 6 "../../src/components/AnimatedSubmitButton/index.tsx" "react-hooks/set-state-in-effect" 1 "../../src/components/AttachmentPicker/index.native.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -93,16 +94,20 @@ "../../src/components/AttachmentPreview.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/Attachments/AttachmentCarousel/AttachmentCarouselView/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/Attachments/AttachmentCarousel/AttachmentCarouselView/index.tsx" "react-hooks/refs" 3 +"../../src/components/Attachments/AttachmentCarousel/CarouselButtons.tsx" "no-restricted-imports" 1 +"../../src/components/Attachments/AttachmentCarousel/CarouselItem.tsx" "no-restricted-imports" 1 "../../src/components/Attachments/AttachmentCarousel/Pager/index.tsx" "react-hooks/set-state-in-effect" 1 "../../src/components/Attachments/AttachmentCarousel/index.tsx" "react-hooks/set-state-in-effect" 1 "../../src/components/Attachments/AttachmentCarousel/useCarouselArrows.ts" "no-restricted-syntax" 1 "../../src/components/Attachments/AttachmentView/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 4 +"../../src/components/Attachments/AttachmentView/index.tsx" "no-restricted-imports" 1 "../../src/components/AutoCompleteSuggestions/AutoCompleteSuggestionsPortal/TransparentOverlay/TransparentOverlay.tsx" "no-restricted-syntax" 1 "../../src/components/AutoCompleteSuggestions/AutoCompleteSuggestionsPortal/TransparentOverlay/TransparentOverlay.tsx" "react-hooks/refs" 1 "../../src/components/AutoCompleteSuggestions/index.tsx" "react-hooks/set-state-in-effect" 1 "../../src/components/AutoSubmitModal.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/Avatar.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/AvatarButtonWithIcon.tsx" "react-hooks/static-components" 1 +"../../src/components/AvatarCropModal/AvatarCropModal.tsx" "no-restricted-imports" 1 "../../src/components/AvatarCropModal/ImageCropView.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/AvatarCropModal/Slider.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/AvatarSelector.tsx" "no-restricted-syntax" 2 @@ -112,6 +117,7 @@ "../../src/components/Button/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/Button/validateSubmitShortcut/index.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/ButtonComposed/Button.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/components/ButtonWithDropdownMenu/index.tsx" "no-restricted-imports" 1 "../../src/components/ButtonWithDropdownMenu/index.tsx" "react-hooks/preserve-manual-memoization" 1 "../../src/components/ButtonWithDropdownMenu/index.tsx" "react-hooks/refs" 3 "../../src/components/ButtonWithDropdownMenu/index.tsx" "react-hooks/set-state-in-effect" 1 @@ -150,7 +156,10 @@ "../../src/components/DialogLabelContext.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/DisplayNames/DisplayNamesWithTooltip.tsx" "react-hooks/refs" 6 "../../src/components/DistanceRequest/DistanceRequestFooter.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/DistanceRequest/DistanceRequestFooter.tsx" "no-restricted-imports" 1 "../../src/components/DistanceRequest/DistanceRequestRenderItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/Domain/CopyableTextField.tsx" "no-restricted-imports" 1 +"../../src/components/Domain/FormHelpMessageRowWithRetryButton.tsx" "no-restricted-imports" 1 "../../src/components/DragAndDrop/NoDropZone/index.tsx" "react-hooks/refs" 1 "../../src/components/DragAndDrop/Provider/index.tsx" "react-hooks/refs" 6 "../../src/components/DraggableList/SortableItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -165,6 +174,7 @@ "../../src/components/EmojiPicker/EmojiSkinToneList.tsx" "react-hooks/set-state-in-effect" 2 "../../src/components/EmojiSuggestions.tsx" "no-restricted-syntax" 1 "../../src/components/EmptySelectionListContent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/EmptyStateComponent/index.tsx" "no-restricted-imports" 1 "../../src/components/EnvironmentBadge.tsx" "no-restricted-syntax" 1 "../../src/components/ExplanationModal.tsx" "no-restricted-syntax" 1 "../../src/components/FeedbackSurvey.tsx" "react-hooks/set-state-in-effect" 1 @@ -174,6 +184,7 @@ "../../src/components/FlatList/FlatList/index.tsx" "react-hooks/refs" 1 "../../src/components/FlatList/hooks/useFlatListHandle.ts" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/components/FlatList/hooks/useFlatListScrollKey.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/FloatingGPSButton/index.native.tsx" "no-restricted-imports" 1 "../../src/components/FocusModeNotification.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 "../../src/components/FocusTrap/FocusTrapContainerElement/index.web.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/FocusTrap/FocusTrapForScreen/index.web.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -185,6 +196,7 @@ "../../src/components/FullscreenLoadingIndicator.tsx" "@typescript-eslint/no-deprecated/StyleSheet.absoluteFillObject" 1 "../../src/components/GPSInProgressModal/index.native.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 "../../src/components/GPSTripStateChecker/index.native.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 +"../../src/components/GrowlNotification/GrowlNotificationContent.tsx" "no-restricted-imports" 1 "../../src/components/HTMLEngineProvider/BaseHTMLEngineProvider.tsx" "@typescript-eslint/no-unsafe-type-assertion" 5 "../../src/components/HTMLEngineProvider/HTMLRenderers/AccountManagerLinkRenderer.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/HTMLEngineProvider/HTMLRenderers/AnchorRenderer.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -234,8 +246,11 @@ "../../src/components/MagicCodeInput.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/MagicCodeInput.tsx" "react-hooks/refs" 1 "../../src/components/MagicCodeInput.tsx" "react-hooks/set-state-in-effect" 3 +"../../src/components/MapView/GPSMapView.tsx" "no-restricted-imports" 1 +"../../src/components/MapView/MapView.tsx" "no-restricted-imports" 1 "../../src/components/MapView/MapView.tsx" "react-hooks/set-state-in-effect" 1 "../../src/components/MapView/MapView.web.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/components/MapView/MapViewImpl.web.tsx" "no-restricted-imports" 1 "../../src/components/MapView/MapViewImpl.web.tsx" "react-hooks/set-state-in-effect" 1 "../../src/components/MapView/ToggleDistanceUnitButton/index.android.tsx" "no-restricted-syntax" 1 "../../src/components/MenuItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 @@ -245,16 +260,25 @@ "../../src/components/Modal/ReanimatedModal/Container/index.web.tsx" "react-hooks/refs" 1 "../../src/components/Modal/ReanimatedModal/index.tsx" "@typescript-eslint/no-deprecated/InteractionManager.clearInteractionHandle" 1 "../../src/components/Modal/ReanimatedModal/index.tsx" "@typescript-eslint/no-deprecated/InteractionManager.createInteractionHandle" 1 +"../../src/components/MoneyReportHeaderActions/MoneyReportHeaderSecondaryActions.tsx" "no-restricted-imports" 1 "../../src/components/MoneyReportHeaderActions/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/components/MoneyReportHeaderPrimaryAction/ApprovePrimaryAction.tsx" "no-restricted-imports" 1 +"../../src/components/MoneyReportHeaderPrimaryAction/ExportPrimaryAction.tsx" "no-restricted-imports" 1 +"../../src/components/MoneyReportHeaderPrimaryAction/MarkAsCashPrimaryAction.tsx" "no-restricted-imports" 1 +"../../src/components/MoneyReportHeaderPrimaryAction/MarkAsResolvedPrimaryAction.tsx" "no-restricted-imports" 1 +"../../src/components/MoneyReportHeaderPrimaryAction/RemoveHoldPrimaryAction.tsx" "no-restricted-imports" 1 +"../../src/components/MoneyReportHeaderPrimaryAction/ReviewDuplicatesPrimaryAction.tsx" "no-restricted-imports" 1 "../../src/components/MoneyRequestAmountInput.tsx" "react-hooks/immutability" 2 "../../src/components/MoneyRequestConfirmationList.tsx" "react-hooks/set-state-in-effect" 2 "../../src/components/MoneyRequestConfirmationList/ConfirmationFooterContent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/MoneyRequestConfirmationList/ConfirmationFooterContent.tsx" "no-restricted-imports" 1 "../../src/components/MoneyRequestConfirmationList/hooks/useDistanceRequestState.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/MoneyRequestConfirmationList/hooks/useTransactionReportForConfirmation.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/MoneyRequestConfirmationList/sections/AmountField.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/MoneyRequestConfirmationList/sections/AttendeeField.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/MoneyRequestConfirmationList/sections/TaxFields.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/MoneyRequestConfirmationList/sections/selectors.ts" "@typescript-eslint/no-unsafe-type-assertion" 3 +"../../src/components/MoneyRequestConfirmationListFooter/ConfirmationFieldList.tsx" "no-restricted-imports" 1 "../../src/components/MoneyRequestConfirmationListFooter/ConfirmationReceiptThumbnail.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/MoneyRequestConfirmationListFooter/hooks/useReceiptThumbnailSource.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/MoneyRequestConfirmationListFooter/sections/DistanceMapSection.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -263,6 +287,7 @@ "../../src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx" "react-hooks/refs" 3 "../../src/components/MoneyRequestReportView/MoneyRequestReportActionsList.tsx" "react-hooks/set-state-in-effect" 3 "../../src/components/MoneyRequestReportView/MoneyRequestReportTransactionList.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/components/MoneyRequestReportView/MoneyRequestReportTransactionList.tsx" "no-restricted-imports" 1 "../../src/components/MoneyRequestReportView/MoneyRequestReportTransactionsNavigation.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/MoneyRequestReportView/MoneyRequestViewReportFields.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/MultiGestureCanvas/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -276,19 +301,23 @@ "../../src/components/MultifactorAuthentication/Context/usePromptContent.ts" "react-hooks/refs" 10 "../../src/components/MultifactorAuthentication/ValidateCodeResendButton.tsx" "no-restricted-syntax" 1 "../../src/components/MultifactorAuthentication/components/Modals/createCancelConfirmModal.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 +"../../src/components/MultifactorAuthentication/components/OutcomeScreen/OutcomeScreenBase.tsx" "no-restricted-imports" 1 "../../src/components/MultifactorAuthentication/config/scenarios/ChangePIN.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/MultifactorAuthentication/config/scenarios/DefaultUserInterface.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/Navigation/DebugTabView.tsx" "no-restricted-imports" 1 "../../src/components/Navigation/NavigationTabBar/SearchTabButton.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/Navigation/QuickCreationActionsBar/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 -"../../src/components/Navigation/QuickCreationActionsBar/index.tsx" "no-restricted-imports" 1 +"../../src/components/Navigation/QuickCreationActionsBar/index.tsx" "no-restricted-imports" 2 "../../src/components/Navigation/TopLevelNavigationTabBar/index.tsx" "react-hooks/set-state-in-effect" 1 "../../src/components/NumberWithSymbolForm.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/NumberWithSymbolForm.tsx" "react-hooks/set-state-in-effect" 2 "../../src/components/OfflineWithFeedback.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/components/OpenAppFailureModal/BaseOpenAppFailureModal.tsx" "no-restricted-imports" 1 "../../src/components/OptionListContextProvider.tsx" "react-hooks/refs" 2 "../../src/components/OptionListContextProvider.tsx" "react-hooks/set-state-in-effect" 3 "../../src/components/OptionRow.tsx" "@typescript-eslint/no-unsafe-type-assertion" 4 "../../src/components/OptionRow.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/components/PDFView/PDFPasswordForm.tsx" "no-restricted-imports" 1 "../../src/components/PDFView/index.native.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/PDFView/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/PDFView/index.tsx" "react-hooks/set-state-in-effect" 1 @@ -316,13 +345,20 @@ "../../src/components/ReportActionAvatars/ReportActionAvatar.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/ReportActionAvatars/useReportPreviewSenderID.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/ReportActionItem/ActionableItemButtons.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/ReportActionItem/ActionableItemButtons.tsx" "no-restricted-imports" 1 +"../../src/components/ReportActionItem/ChronosOOOListActions.tsx" "no-restricted-imports" 1 "../../src/components/ReportActionItem/IssueCardMessage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/components/ReportActionItem/IssueCardMessage.tsx" "no-restricted-imports" 1 "../../src/components/ReportActionItem/MoneyReportView.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/ReportActionItem/MoneyRequestReceiptView.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/ReportActionItem/MoneyRequestReceiptView.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/components/ReportActionItem/MoneyRequestReportPreview/ApproveActionButton.tsx" "no-restricted-imports" 1 "../../src/components/ReportActionItem/MoneyRequestReportPreview/MoneyRequestReportPreviewContent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/ReportActionItem/MoneyRequestReportPreview/ReportPreviewActionButton.tsx" "no-restricted-imports" 1 "../../src/components/ReportActionItem/TaskPreview.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/ReportActionItem/TaskView.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/ReportActionItem/TransactionPreview/TransactionPreviewContent.tsx" "no-restricted-imports" 1 +"../../src/components/ReportActionItem/TripRoomPreview.tsx" "no-restricted-imports" 1 "../../src/components/ReportActionItem/receiptHoverUtils/index.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/RoomHeaderAvatars.tsx" "no-restricted-syntax" 2 "../../src/components/Rule/RuleBooleanBase.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -330,13 +366,20 @@ "../../src/components/SAMLLoadingIndicator.tsx" "@typescript-eslint/no-deprecated/StyleSheet.absoluteFillObject" 1 "../../src/components/ScreenShareRequestModal.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 "../../src/components/ScreenWrapper/ScreenWrapperContainer.tsx" "react-hooks/refs" 2 +"../../src/components/Search/FilterComponents/AdvancedFilters/AmountFilterContent.tsx" "no-restricted-imports" 1 +"../../src/components/Search/FilterComponents/AdvancedFilters/DateFilterContent.tsx" "no-restricted-imports" 1 +"../../src/components/Search/FilterComponents/AdvancedFilters/ReportFieldFilterContent.tsx" "no-restricted-imports" 1 +"../../src/components/Search/FilterComponents/AdvancedFilters/TextInputFilterContent.tsx" "no-restricted-imports" 1 +"../../src/components/Search/FilterComponents/DateFilterBase.tsx" "no-restricted-imports" 1 "../../src/components/Search/FilterComponents/DateFilterBase.tsx" "react-hooks/set-state-in-effect" 1 "../../src/components/Search/FilterComponents/DatePresetFilterBase.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/Search/FilterComponents/ReportField/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/Search/FilterComponents/TypeSelector.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/Search/FilterComponents/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/Search/FilterDropdowns/ActionButtons.tsx" "no-restricted-imports" 1 "../../src/components/Search/FilterDropdowns/CardSelectPopup.tsx" "react-hooks/set-state-in-effect" 1 "../../src/components/Search/FilterDropdowns/CommonPopup.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/Search/FilterDropdowns/DropdownButton.tsx" "no-restricted-imports" 1 "../../src/components/Search/FilterDropdowns/SortByPopup.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/Search/FilterDropdowns/UserSelectPopup.tsx" "react-hooks/set-state-in-effect" 1 "../../src/components/Search/SearchAutocompleteInput.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 @@ -344,9 +387,12 @@ "../../src/components/Search/SearchBulkActionsButton.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/Search/SearchContextDefinitions.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/Search/SearchDatePresetFilterBasePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/Search/SearchFilterPageFooterButtons.tsx" "no-restricted-imports" 1 "../../src/components/Search/SearchFiltersAmountBase.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/Search/SearchFiltersCurrencyBase.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/Search/SearchFiltersParticipantsSelector.tsx" "@typescript-eslint/no-unsafe-type-assertion" 4 +"../../src/components/Search/SearchList/ListItem/ActionCell/DeferredActionCell.tsx" "no-restricted-imports" 1 +"../../src/components/Search/SearchList/ListItem/ActionCell/index.tsx" "no-restricted-imports" 1 "../../src/components/Search/SearchList/ListItem/BaseListItemHeader.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/Search/SearchList/ListItem/CardListItemHeader.tsx" "@typescript-eslint/no-unsafe-type-assertion" 4 "../../src/components/Search/SearchList/ListItem/ChatListItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -357,7 +403,9 @@ "../../src/components/Search/SearchList/ListItem/MemberListItemHeader.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/Search/SearchList/ListItem/ReportListItemHeader.tsx" "@typescript-eslint/no-unsafe-type-assertion" 4 "../../src/components/Search/SearchList/ListItem/TaskListItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/Search/SearchList/ListItem/TaskListItemRow.tsx" "no-restricted-imports" 1 "../../src/components/Search/SearchList/ListItem/TransactionGroupListExpanded.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 +"../../src/components/Search/SearchList/ListItem/TransactionGroupListExpanded.tsx" "no-restricted-imports" 1 "../../src/components/Search/SearchList/ListItem/TransactionGroupListItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 19 "../../src/components/Search/SearchList/ListItem/TransactionListItem/TransactionListItemNarrow.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/Search/SearchList/ListItem/TransactionListItem/TransactionListItemWide.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -366,7 +414,10 @@ "../../src/components/Search/SearchList/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 7 "../../src/components/Search/SearchMultipleSelectionPicker.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/Search/SearchPageHeader/SearchActionsBarCreateButton.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/Search/SearchPageHeader/SearchActionsBarCreateButton.tsx" "no-restricted-imports" 1 +"../../src/components/Search/SearchPageHeader/SearchAdvancedFiltersButton.tsx" "no-restricted-imports" 1 "../../src/components/Search/SearchPageHeader/SearchFilterBar.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 +"../../src/components/Search/SearchPageHeader/SearchSaveButton.tsx" "no-restricted-imports" 1 "../../src/components/Search/SearchPageHeader/useSearchFiltersBar.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/Search/SearchPageHeader/useSearchPageInput.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/Search/SearchPageHeader/useSearchPageInput.tsx" "react-hooks/set-state-in-effect" 2 @@ -391,9 +442,11 @@ "../../src/components/SelectionList/ListItem/SplitListItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/SelectionList/SelectionListWithSections/BaseSelectionListWithSections.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/SelectionList/components/Footer.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/SelectionList/components/Footer.tsx" "no-restricted-imports" 1 "../../src/components/SelectionList/hooks/useFlattenedSections.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/SelectionList/utils/getListboxRole/index.web.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/SettlementButton/AnimatedSettlementButton.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/SettlementButton/AnimatedSettlementButton.tsx" "no-restricted-imports" 1 "../../src/components/SettlementButton/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 11 "../../src/components/SettlementButton/index.tsx" "no-restricted-imports" 1 "../../src/components/SidePanel/SidePanelOverlay.tsx" "no-restricted-syntax" 1 @@ -401,14 +454,19 @@ "../../src/components/SignInButtons/IconButton.tsx" "no-restricted-syntax" 1 "../../src/components/SingleOptionSelector.tsx" "no-restricted-syntax" 1 "../../src/components/SkeletonViewContentLoader/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/SoftKillTestToolRow/index.native.tsx" "no-restricted-imports" 1 +"../../src/components/SpendRules/SpendRuleRestrictionTypeToggle.tsx" "no-restricted-imports" 1 +"../../src/components/SpendRules/SpendRuleRestrictionTypeToggleRevamp.tsx" "no-restricted-imports" 1 "../../src/components/StatePicker/StateSelectorModal.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/StatePicker/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/StatusBadge.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/SubStepForms/AddressStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/SubStepForms/AgreementsFullStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 8 +"../../src/components/SubStepForms/ConfirmationStep.tsx" "no-restricted-imports" 1 "../../src/components/SubStepForms/CountryFullStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/SubStepForms/DateOfBirthStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/SubStepForms/DocusignFullStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 +"../../src/components/SubStepForms/DocusignFullStep.tsx" "no-restricted-imports" 1 "../../src/components/SubStepForms/FullNameStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 4 "../../src/components/SubStepForms/PushRowFieldsStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/SubStepForms/RegistrationNumberStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 @@ -420,8 +478,12 @@ "../../src/components/Table/TableFilterButtons/buildFilterItems.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/Table/middlewares/filtering.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/components/Tables/WorkspaceCompanyCardsTable/WorkspaceCompanyCardsTableRow.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/Tables/WorkspaceCompanyCardsTable/WorkspaceCompanyCardsTableRow.tsx" "no-restricted-imports" 1 +"../../src/components/Tables/WorkspaceCompanyCardsTable/index.tsx" "no-restricted-imports" 1 "../../src/components/TagPicker/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/TaxPicker.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/TestCrash/index.native.tsx" "no-restricted-imports" 1 +"../../src/components/TestDrive/TestDriveBanner.tsx" "no-restricted-imports" 1 "../../src/components/TextInput/BaseTextInput/implementation/index.native.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/TextInput/BaseTextInput/implementation/index.native.tsx" "react-hooks/refs" 2 "../../src/components/TextInput/BaseTextInput/implementation/index.native.tsx" "react-hooks/static-components" 1 @@ -442,6 +504,7 @@ "../../src/components/ThreeDotsMenu/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/ThreeDotsMenu/index.tsx" "react-hooks/set-state-in-effect" 1 "../../src/components/TimePicker/TimePicker.tsx" "@typescript-eslint/no-unsafe-type-assertion" 6 +"../../src/components/TimePicker/TimePicker.tsx" "no-restricted-imports" 1 "../../src/components/TimePicker/TimePicker.tsx" "react-hooks/set-state-in-effect" 1 "../../src/components/Tooltip/BaseGenericTooltip/index.native.tsx" "react-hooks/refs" 2 "../../src/components/Tooltip/BaseGenericTooltip/index.tsx" "react-hooks/immutability" 1 @@ -454,6 +517,7 @@ "../../src/components/TransactionItemRow/DataCells/MerchantCell.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/components/UpdateAppModal.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 "../../src/components/UploadFile.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/components/ValidateCodeActionModal/ValidateCodeForm/BaseValidateCodeForm.tsx" "no-restricted-imports" 1 "../../src/components/VideoPlayer/BaseVideoPlayer.tsx" "@typescript-eslint/no-unsafe-type-assertion" 7 "../../src/components/VideoPlayer/BaseVideoPlayer.tsx" "no-restricted-syntax" 1 "../../src/components/VideoPlayer/BaseVideoPlayer.tsx" "react-hooks/refs" 13 @@ -963,10 +1027,20 @@ "../../src/pages/Debug/ConstantSelector.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/Debug/DateTimeSelector.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/Debug/DebugDetails.tsx" "@typescript-eslint/no-unsafe-type-assertion" 9 +"../../src/pages/Debug/DebugDetails.tsx" "no-restricted-imports" 1 +"../../src/pages/Debug/DebugJSON.tsx" "no-restricted-imports" 1 +"../../src/pages/Debug/DebugTagPicker.tsx" "no-restricted-imports" 1 +"../../src/pages/Debug/Report/DebugReportActions.tsx" "no-restricted-imports" 1 +"../../src/pages/Debug/Report/DebugReportPage.tsx" "no-restricted-imports" 1 "../../src/pages/Debug/ReportAction/DebugReportActionCreatePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 +"../../src/pages/Debug/ReportAction/DebugReportActionCreatePage.tsx" "no-restricted-imports" 1 +"../../src/pages/Debug/ReportAction/DebugReportActionPage.tsx" "no-restricted-imports" 1 "../../src/pages/Debug/ReportAction/DebugReportActionPreview.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/Debug/Transaction/DebugTransactionPage.tsx" "no-restricted-imports" 1 +"../../src/pages/Debug/Transaction/DebugTransactionViolations.tsx" "no-restricted-imports" 1 "../../src/pages/Debug/Transaction/DebugTransactionViolations.tsx" "no-restricted-syntax" 1 "../../src/pages/Debug/TransactionViolation/DebugTransactionViolationCreatePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 4 +"../../src/pages/Debug/TransactionViolation/DebugTransactionViolationCreatePage.tsx" "no-restricted-imports" 1 "../../src/pages/Debug/TransactionViolation/DebugTransactionViolationPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/DynamicEditReportFieldPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/DynamicReportChangeApproverPage.tsx" "react-hooks/set-state-in-effect" 1 @@ -974,8 +1048,12 @@ "../../src/pages/DynamicReportDetailsPage.tsx" "react-hooks/preserve-manual-memoization" 4 "../../src/pages/DynamicReportParticipantDetailsPage.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 "../../src/pages/DynamicReportParticipantDetailsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/DynamicReportParticipantDetailsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/DynamicReportParticipantsPage.tsx" "no-restricted-imports" 1 "../../src/pages/DynamicRoomMemberDetailsPage.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 "../../src/pages/DynamicRoomMemberDetailsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/DynamicRoomMemberDetailsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/DynamicRoomMembersPage.tsx" "no-restricted-imports" 1 "../../src/pages/DynamicRoomMembersPage.tsx" "react-hooks/preserve-manual-memoization" 1 "../../src/pages/DynamicRoomMembersPage.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/EnablePayments/AddBankAccount/AddBankAccount.tsx" "@typescript-eslint/no-deprecated/useSubStep" 1 @@ -984,37 +1062,56 @@ "../../src/pages/EnablePayments/FeesAndTerms/FeesAndTerms.tsx" "rulesdir/no-default-id-values" 1 "../../src/pages/EnablePayments/FeesAndTerms/substeps/TermsStep.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/EnablePayments/PersonalInfo/PersonalInfo.tsx" "@typescript-eslint/no-deprecated/useSubStep" 1 +"../../src/pages/EnablePayments/Wallet/AddBankAccount/SetupMethod.tsx" "no-restricted-imports" 1 +"../../src/pages/EnablePayments/Wallet/AddBankAccount/substeps/ConfirmationStep.tsx" "no-restricted-imports" 1 +"../../src/pages/EnablePayments/Wallet/FeesAndTerms/substeps/FeesStep.tsx" "no-restricted-imports" 1 "../../src/pages/EnablePayments/Wallet/PersonalInfo/substeps/DateOfBirthStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/pages/EnablePayments/Wallet/utils/getSubstepValues.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/EnablePayments/shared/IdologyQuestions.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/ErrorPage/GenericErrorPage.tsx" "no-restricted-imports" 1 +"../../src/pages/ErrorPage/UpdateRequiredView.tsx" "no-restricted-imports" 1 "../../src/pages/MissingPersonalDetails/MissingPersonalDetailsContent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/MissingPersonalDetails/MissingPersonalDetailsMagicCodePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/MissingPersonalDetails/subPages/Address.tsx" "@typescript-eslint/no-unsafe-type-assertion" 5 "../../src/pages/MissingPersonalDetails/subPages/Address.tsx" "react-hooks/refs" 4 +"../../src/pages/MissingPersonalDetails/subPages/PIN.tsx" "no-restricted-imports" 1 +"../../src/pages/MultifactorAuthentication/AuthorizeTransactionPage/AuthorizeTransactionActions.tsx" "no-restricted-imports" 1 +"../../src/pages/MultifactorAuthentication/PromptPage.tsx" "no-restricted-imports" 1 "../../src/pages/MultifactorAuthentication/RevokePage.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 -"../../src/pages/OnboardingAccounting/BaseOnboardingAccounting.tsx" "no-restricted-imports" 1 +"../../src/pages/MultifactorAuthentication/RevokePage.tsx" "no-restricted-imports" 1 +"../../src/pages/MultifactorAuthentication/ValidateCodePage.tsx" "no-restricted-imports" 1 +"../../src/pages/NewChatPage/index.tsx" "no-restricted-imports" 1 +"../../src/pages/OnboardingAccounting/BaseOnboardingAccounting.tsx" "no-restricted-imports" 2 +"../../src/pages/OnboardingEmployees/BaseOnboardingEmployees.tsx" "no-restricted-imports" 1 "../../src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 -"../../src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx" "no-restricted-imports" 1 +"../../src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx" "no-restricted-imports" 2 "../../src/pages/OnboardingInterestedFeatures/BaseOnboardingInterestedFeatures.tsx" "react-hooks/preserve-manual-memoization" 2 +"../../src/pages/OnboardingPersonalTrackGoal/BaseOnboardingPersonalTrackGoal.tsx" "no-restricted-imports" 1 "../../src/pages/OnboardingPrivateDomain/BaseOnboardingPrivateDomain.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/OnboardingWorkEmail/BaseOnboardingWorkEmail.tsx" "no-restricted-imports" 1 "../../src/pages/OnboardingWorkspaceConfirmation/BaseOnboardingWorkspaceConfirmation.tsx" "no-restricted-imports" 1 "../../src/pages/OnboardingWorkspaceCurrency/BaseOnboardingWorkspaceCurrency.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/OnboardingWorkspaceOptional/BaseOnboardingWorkspaceOptional.tsx" "no-restricted-imports" 1 +"../../src/pages/OnboardingWorkspaces/BaseOnboardingWorkspaces.tsx" "no-restricted-imports" 1 "../../src/pages/ProfilePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/ReimbursementAccount/AddressFormFields.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/ReimbursementAccount/EnterSignerInfo/index.tsx" "@typescript-eslint/no-deprecated/useSubStep" 1 "../../src/pages/ReimbursementAccount/EnterSignerInfo/subSteps/Address.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/ReimbursementAccount/EnterSignerInfo/subSteps/UploadDocuments.tsx" "no-restricted-imports" 1 "../../src/pages/ReimbursementAccount/NonUSD/BankInfo/subSteps/AccountHolderDetails.tsx" "@typescript-eslint/no-unsafe-type-assertion" 7 "../../src/pages/ReimbursementAccount/NonUSD/BankInfo/subSteps/BankAccountDetails.tsx" "@typescript-eslint/no-unsafe-type-assertion" 7 "../../src/pages/ReimbursementAccount/NonUSD/BankInfo/subSteps/Confirmation.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/ReimbursementAccount/NonUSD/BeneficialOwnerInfo/BeneficialOwnerDetailsFormSubSteps/Address.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/ReimbursementAccount/NonUSD/BeneficialOwnerInfo/BeneficialOwnerDetailsFormSubSteps/Confirmation.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/ReimbursementAccount/NonUSD/BeneficialOwnerInfo/BeneficialOwnerDetailsFormSubSteps/Nationality.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/ReimbursementAccount/NonUSD/BeneficialOwnerInfo/BeneficialOwnersList.tsx" "no-restricted-imports" 1 "../../src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/Confirmation.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/ContactInformation.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/IncorporationLocation.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/ReimbursementAccount/NonUSD/BusinessInfo/subSteps/Website.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/ReimbursementAccount/NonUSD/SignerInfo/HangTight.tsx" "no-restricted-imports" 1 "../../src/pages/ReimbursementAccount/NonUSD/SignerInfo/subSteps/Address.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/ReimbursementAccount/NonUSD/SignerInfo/subSteps/UploadDocuments.tsx" "no-restricted-imports" 1 "../../src/pages/ReimbursementAccount/NonUSD/utils/getBankInfoStepValues.ts" "@typescript-eslint/no-unsafe-type-assertion" 11 "../../src/pages/ReimbursementAccount/NonUSD/utils/getInitialSubStepForBankInfoStep.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/ReimbursementAccount/NonUSD/utils/getInitialSubStepForBusinessInfoStep.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 @@ -1025,57 +1122,95 @@ "../../src/pages/ReimbursementAccount/ReimbursementAccountPage.tsx" "react-hooks/set-state-in-effect" 4 "../../src/pages/ReimbursementAccount/USD/BankInfo/BankInfo.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/ReimbursementAccount/USD/BeneficialOwnerInfo/subSteps/BeneficialOwnerDetailsFormSubSteps/LegalNameUBO.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/ReimbursementAccount/USD/BeneficialOwnerInfo/subSteps/CompanyOwnersListUBO.tsx" "no-restricted-imports" 1 "../../src/pages/ReimbursementAccount/USD/BusinessInfo/subSteps/ConfirmationBusiness.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/ReimbursementAccount/USD/BusinessInfo/subSteps/IndustryCode/IndustryCodeSelector.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/ReimbursementAccount/USD/BusinessInfo/subSteps/TypeBusiness/BusinessTypePicker/BusinessTypeSelectorModal.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/ReimbursementAccount/USD/BusinessInfo/subSteps/TypeBusiness/BusinessTypePicker/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/ReimbursementAccount/USD/BusinessInfo/subSteps/WebsiteBusiness.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/ReimbursementAccount/USD/ConnectBankAccount/components/BankAccountValidationForm.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/ReimbursementAccount/USD/KYBDocuments/index.tsx" "no-restricted-imports" 1 "../../src/pages/ReimbursementAccount/USD/USDVerifiedBankAccountFlowPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/pages/ReimbursementAccount/utils/getSubStepValues.ts" "@typescript-eslint/no-unsafe-type-assertion" 4 "../../src/pages/ReportDescriptionPage.tsx" "no-restricted-imports" 1 "../../src/pages/ReportDescriptionPage.tsx" "no-restricted-syntax" 1 +"../../src/pages/RequireTwoFactorAuthenticationOverlay.tsx" "no-restricted-imports" 1 +"../../src/pages/RestrictedAction/Workspace/WorkspaceAdminRestrictedAction.tsx" "no-restricted-imports" 1 +"../../src/pages/RestrictedAction/Workspace/WorkspaceOwnerRestrictedAction/index.native.tsx" "no-restricted-imports" 1 +"../../src/pages/RestrictedAction/Workspace/WorkspaceOwnerRestrictedAction/index.tsx" "no-restricted-imports" 1 +"../../src/pages/RestrictedAction/Workspace/WorkspaceUserRestrictedAction.tsx" "no-restricted-imports" 1 +"../../src/pages/ScheduleCall/ScheduleCallConfirmationPage.tsx" "no-restricted-imports" 1 +"../../src/pages/ScheduleCall/ScheduleCallPage.tsx" "no-restricted-imports" 1 "../../src/pages/ScheduleCall/ScheduleCallPage.tsx" "react-hooks/preserve-manual-memoization" 1 "../../src/pages/Search/AdvancedSearchFilters.tsx" "@typescript-eslint/no-unsafe-type-assertion" 17 "../../src/pages/Search/EmptySearchView.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/Search/SavedSearchRenamePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/Search/SearchAdvancedFiltersContentPage/CommonFilterContentPageWrapper.tsx" "no-restricted-imports" 1 +"../../src/pages/Search/SearchAdvancedFiltersContentPage/DateFilterContentPageWrapper.tsx" "no-restricted-imports" 1 +"../../src/pages/Search/SearchAdvancedFiltersContentPage/ReportFieldFilterContentPageWrapper.tsx" "no-restricted-imports" 1 +"../../src/pages/Search/SearchAdvancedFiltersPage/SearchAdvancedFiltersBase.tsx" "no-restricted-imports" 1 "../../src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersCardPage.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersReportFieldPage/ReportFieldDate.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersReportFieldPage/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersWorkspacePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/Search/SearchChangeApproverPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/Search/SearchEditMultiple/SearchEditMultiplePage.tsx" "no-restricted-imports" 1 "../../src/pages/Search/SearchEditMultiple/SearchEditMultipleTagPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/Search/SearchEditMultiple/SearchEditMultipleUtils.ts" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/pages/Search/SearchMoneyRequestReportPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/Search/SearchPage.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/Search/SearchSavePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/pages/Search/SearchTransactionsChangeReport.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/Share/ShareButton.tsx" "no-restricted-imports" 1 "../../src/pages/Share/ShareRootPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/Share/ShareTab.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/ShareCodePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/TeachersUnite/ImTeacherUpdateEmailPage.tsx" "no-restricted-imports" 1 "../../src/pages/TeachersUnite/SaveTheWorldPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/TransactionDuplicate/Confirmation.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 -"../../src/pages/TransactionDuplicate/Confirmation.tsx" "no-restricted-imports" 1 +"../../src/pages/TransactionDuplicate/Confirmation.tsx" "no-restricted-imports" 2 "../../src/pages/TransactionDuplicate/Confirmation.tsx" "react-hooks/refs" 12 "../../src/pages/TransactionDuplicate/DuplicateTransactionItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/TransactionDuplicate/Review.tsx" "no-restricted-imports" 1 "../../src/pages/TransactionMerge/ConfirmationPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/TransactionMerge/ConfirmationPage.tsx" "no-restricted-imports" 1 "../../src/pages/TransactionMerge/DetailsReviewPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/TransactionMerge/DetailsReviewPage.tsx" "no-restricted-imports" 1 "../../src/pages/TransactionMerge/MergeTransactionItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/TransactionMerge/MergeTransactionsListContent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/TransactionMerge/ReceiptReviewPage.tsx" "no-restricted-imports" 1 +"../../src/pages/TransactionMerge/TransactionMergeReceipts.tsx" "no-restricted-imports" 1 +"../../src/pages/Travel/DynamicDomainPermissionInfoPage.tsx" "no-restricted-imports" 1 +"../../src/pages/Travel/DynamicDomainSelectorPage.tsx" "no-restricted-imports" 1 +"../../src/pages/Travel/DynamicPublicDomainErrorPage.tsx" "no-restricted-imports" 1 "../../src/pages/Travel/DynamicTravelTerms.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/Travel/DynamicTravelUpgrade.tsx" "no-restricted-imports" 1 +"../../src/pages/Travel/ManageTrips.tsx" "no-restricted-imports" 1 "../../src/pages/Travel/TravelUpgrade.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/Travel/WorkspaceConfirmationForTravelPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/UnreportedExpenseListItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/ValidateLoginPage/index.web.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/domain/Admins/DomainAdminsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/domain/BaseDomainRequireTwoFactorAuthPage.tsx" "no-restricted-imports" 1 +"../../src/pages/domain/DomainAccessRestrictedPage.tsx" "no-restricted-imports" 1 +"../../src/pages/domain/DomainsListPage.tsx" "no-restricted-imports" 1 +"../../src/pages/domain/Groups/DomainGroupsPage.tsx" "no-restricted-imports" 1 "../../src/pages/domain/Groups/PreferredWorkspaceToggle.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 +"../../src/pages/domain/Members/DomainMemberDetailsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/domain/Members/DomainMembersPage.tsx" "no-restricted-imports" 1 +"../../src/pages/domain/Members/MoveUserBetweenGroupsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/domain/Members/MoveUsersBetweenGroupsPage.tsx" "no-restricted-imports" 1 "../../src/pages/domain/Saml/SamlLoginSectionContent.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 +"../../src/pages/domain/Saml/ScimTokenContent.tsx" "no-restricted-imports" 1 +"../../src/pages/home/FreeTrialSection/index.tsx" "no-restricted-imports" 1 "../../src/pages/home/GettingStartedSection/hooks/useGettingStartedItems.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/home/GettingStartedSection/hooks/useGettingStartedItems.ts" "no-restricted-imports" 1 +"../../src/pages/home/SpendOverTimeSection/SpendOverTimeSectionContent.tsx" "no-restricted-imports" 1 "../../src/pages/home/SpendOverTimeSection/useSpendOverTimeData.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/home/TimeSensitiveSection/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/home/TimeSensitiveSection/items/FixCompanyCardConnection.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/home/YourSpendSection/useYourSpendData.ts" "no-restricted-imports" 1 +"../../src/pages/inbox/HeaderView.tsx" "no-restricted-imports" 1 "../../src/pages/inbox/ReactionListWrapper.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/inbox/ReportHeader.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/inbox/ReportNavigateAwayHandler.tsx" "react-hooks/exhaustive-deps" 1 @@ -1088,6 +1223,8 @@ "../../src/pages/inbox/report/ContextMenu/PopoverReportActionContextMenu.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 "../../src/pages/inbox/report/ContextMenu/PopoverReportActionContextMenu.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/inbox/report/ContextMenu/PopoverReportActionContextMenu.tsx" "react-hooks/refs" 30 +"../../src/pages/inbox/report/EnableNotificationsBanner.tsx" "no-restricted-imports" 1 +"../../src/pages/inbox/report/FloatingMessageCounter.tsx" "no-restricted-imports" 1 "../../src/pages/inbox/report/ListBoundaryLoader.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/inbox/report/ReactionList/HeaderReactionList.tsx" "no-restricted-syntax" 1 "../../src/pages/inbox/report/ReportActionCompose/AttachmentPickerWithMenuItems.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -1101,17 +1238,21 @@ "../../src/pages/inbox/report/ReportActionCompose/useReceiptDrop.ts" "@typescript-eslint/no-unsafe-type-assertion" 5 "../../src/pages/inbox/report/ReportActionItem.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/pages/inbox/report/ReportActionItem.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/inbox/report/ReportActionItemMessage.tsx" "no-restricted-imports" 1 "../../src/pages/inbox/report/ReportActionItemMessageEdit.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/inbox/report/ReportActionItemMessageEdit.tsx" "no-restricted-syntax" 1 "../../src/pages/inbox/report/ReportActionItemMessageEdit.tsx" "react-hooks/preserve-manual-memoization" 1 "../../src/pages/inbox/report/ReportActionItemMessageEdit.tsx" "react-hooks/refs" 5 "../../src/pages/inbox/report/ReportActionItemMessageEdit.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/inbox/report/ReportActionsList.tsx" "react-hooks/refs" 1 +"../../src/pages/inbox/report/ShowPreviousMessagesButton.tsx" "no-restricted-imports" 1 "../../src/pages/inbox/report/TripSummary.tsx" "rulesdir/no-default-id-values" 1 "../../src/pages/inbox/report/WhisperBanner.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/inbox/report/actionContents/ActionContentRouter.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/inbox/report/actionContents/ChatMessageContent.tsx" "no-restricted-imports" 1 "../../src/pages/inbox/report/actionContents/JoinRequestContent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/inbox/report/actionContents/ReimbursementDeQueuedContent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/inbox/report/actionContents/ReimbursementQueuedContent.tsx" "no-restricted-imports" 1 "../../src/pages/inbox/report/shouldUseEmojiPickerSelection/index.web.ts" "no-restricted-syntax" 1 "../../src/pages/inbox/report/withReportAndPrivateNotesOrNotFound.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/inbox/report/withReportOrNotFound.tsx" "react-hooks/refs" 3 @@ -1123,14 +1264,21 @@ "../../src/pages/inbox/sidebar/FABPopoverContent/menuItems/TravelMenuItem.tsx" "no-restricted-imports" 1 "../../src/pages/inbox/sidebar/FABPopoverContent/useScanActions.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/inbox/sidebar/SidebarLinksData.tsx" "react-hooks/refs" 1 +"../../src/pages/inbox/sidebar/SignInButton.tsx" "no-restricted-imports" 1 +"../../src/pages/iou/MoneyRequestAmountForm.tsx" "no-restricted-imports" 1 "../../src/pages/iou/MoneyRequestAmountForm.tsx" "react-hooks/set-state-in-effect" 3 +"../../src/pages/iou/SplitExpenseEditPage.tsx" "no-restricted-imports" 1 "../../src/pages/iou/SplitExpensePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/iou/SplitExpensePage.tsx" "no-restricted-imports" 1 "../../src/pages/iou/SplitExpensePage.tsx" "react-hooks/set-state-in-effect" 3 "../../src/pages/iou/SplitList/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/iou/request/MoneyRequestAttendeeSelector.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 -"../../src/pages/iou/request/MoneyRequestAttendeeSelector.tsx" "no-restricted-imports" 1 +"../../src/pages/iou/request/MoneyRequestAttendeeSelector.tsx" "no-restricted-imports" 2 "../../src/pages/iou/request/ParticipantSearchResults.tsx" "@typescript-eslint/no-unsafe-type-assertion" 4 +"../../src/pages/iou/request/ParticipantSelectorFooter.tsx" "no-restricted-imports" 1 "../../src/pages/iou/request/step/DistanceManualTabContent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/iou/request/step/DistanceManualTabContent.tsx" "no-restricted-imports" 1 +"../../src/pages/iou/request/step/DistanceMapTabContent.tsx" "no-restricted-imports" 1 "../../src/pages/iou/request/step/DynamicIOURequestStepCategoryPage.tsx" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 1 "../../src/pages/iou/request/step/DynamicIOURequestStepUpgradePage.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 "../../src/pages/iou/request/step/DynamicIOURequestStepUpgradePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 @@ -1138,19 +1286,33 @@ "../../src/pages/iou/request/step/IOURequestEditReportCommon.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 "../../src/pages/iou/request/step/IOURequestEditReportCommon.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/iou/request/step/IOURequestStepAmount.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/iou/request/step/IOURequestStepCategory.tsx" "no-restricted-imports" 1 "../../src/pages/iou/request/step/IOURequestStepConfirmation.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/pages/iou/request/step/IOURequestStepConfirmation.tsx" "react-hooks/preserve-manual-memoization" 1 +"../../src/pages/iou/request/step/IOURequestStepDestination.tsx" "no-restricted-imports" 1 "../../src/pages/iou/request/step/IOURequestStepDistance.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/iou/request/step/IOURequestStepDistanceGPS/BackgroundLocationPermissionsFlow/index.android.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 3 "../../src/pages/iou/request/step/IOURequestStepDistanceGPS/BackgroundLocationPermissionsFlow/index.ios.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 2 "../../src/pages/iou/request/step/IOURequestStepDistanceGPS/GPSButtons/index.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 3 +"../../src/pages/iou/request/step/IOURequestStepDistanceGPS/GPSButtons/index.tsx" "no-restricted-imports" 1 +"../../src/pages/iou/request/step/IOURequestStepDistanceGPS/index.tsx" "no-restricted-imports" 1 +"../../src/pages/iou/request/step/IOURequestStepDistanceManual.tsx" "no-restricted-imports" 1 "../../src/pages/iou/request/step/IOURequestStepDistanceMap.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/iou/request/step/IOURequestStepDistanceOdometer.tsx" "no-restricted-imports" 1 +"../../src/pages/iou/request/step/IOURequestStepHours.tsx" "no-restricted-imports" 1 +"../../src/pages/iou/request/step/IOURequestStepOdometerImage/index.native.tsx" "no-restricted-imports" 1 "../../src/pages/iou/request/step/IOURequestStepOdometerImage/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/iou/request/step/IOURequestStepOdometerImage/index.tsx" "no-restricted-imports" 1 "../../src/pages/iou/request/step/IOURequestStepReport.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/iou/request/step/IOURequestStepScan/ReceiptView/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/iou/request/step/IOURequestStepScan/ReceiptView/index.tsx" "no-restricted-imports" 1 "../../src/pages/iou/request/step/IOURequestStepScan/ReceiptView/index.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/iou/request/step/IOURequestStepScan/components/Camera/CameraCapture.tsx" "no-restricted-imports" 1 +"../../src/pages/iou/request/step/IOURequestStepScan/components/Camera/FileUpload.tsx" "no-restricted-imports" 1 +"../../src/pages/iou/request/step/IOURequestStepScan/components/CameraPermissionPrompt.tsx" "no-restricted-imports" 1 "../../src/pages/iou/request/step/IOURequestStepScan/components/MobileWebCameraView.tsx" "react-hooks/immutability" 1 "../../src/pages/iou/request/step/IOURequestStepScan/components/NavigationAwareCamera/WebCamera.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/iou/request/step/IOURequestStepScan/components/ReceiptPreviews/index.tsx" "no-restricted-imports" 1 "../../src/pages/iou/request/step/IOURequestStepScan/components/ScanEditReceipt.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/iou/request/step/IOURequestStepScan/hooks/useMobileReceiptScan.ts" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 1 "../../src/pages/iou/request/step/IOURequestStepScan/hooks/useScanRouteParams.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 @@ -1158,33 +1320,47 @@ "../../src/pages/iou/request/step/IOURequestStepScan/utils/getFileSource.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/iou/request/step/IOURequestStepSubrate.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/iou/request/step/IOURequestStepSubrate.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/iou/request/step/IOURequestStepTag.tsx" "no-restricted-imports" 1 "../../src/pages/iou/request/step/IOURequestStepUpgrade.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 "../../src/pages/iou/request/step/IOURequestStepUpgrade.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/iou/request/step/IOURequestStepWaypoint.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/iou/request/step/IOURequestStepWaypoint.tsx" "no-restricted-imports" 1 "../../src/pages/iou/request/step/StepScreenWrapper.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/iou/request/step/withFullTransactionOrNotFound.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/iou/request/step/withWritableReportOrNotFound.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/media/AttachmentModalScreen/AttachmentModalBaseContent/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 +"../../src/pages/media/AttachmentModalScreen/AttachmentModalBaseContent/index.tsx" "no-restricted-imports" 1 "../../src/pages/media/AttachmentModalScreen/AttachmentModalBaseContent/index.tsx" "react-hooks/set-state-in-effect" 3 "../../src/pages/media/AttachmentModalScreen/AttachmentModalContext.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/media/AttachmentModalScreen/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 16 "../../src/pages/media/AttachmentModalScreen/routes/TransactionReceiptModalContent.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 "../../src/pages/media/AttachmentModalScreen/routes/TransactionReceiptModalContent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 7 +"../../src/pages/media/AttachmentModalScreen/routes/TransactionReceiptModalContent.tsx" "no-restricted-imports" 1 "../../src/pages/media/AttachmentModalScreen/routes/TransactionReceiptModalContent.tsx" "react-hooks/set-state-in-effect" 2 "../../src/pages/media/AttachmentModalScreen/routes/hooks/useReportAttachmentModalType.ts" "react-hooks/set-state-in-effect" 1 "../../src/pages/settings/AboutPage/AboutPage.tsx" "react-hooks/refs" 1 +"../../src/pages/settings/Agents/AgentsListRow.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Agents/AgentsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/settings/Agents/AgentsPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Agents/Fields/EditAgentAvatarPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/settings/Agents/Fields/EditAgentAvatarPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Agents/Fields/EditPromptPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/settings/Copilot/CopilotPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/settings/ExitSurvey/DynamicExitSurveyConfirmPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/ExitSurvey/DynamicExitSurveyReasonPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/PaymentCard/ChangeCurrency/index.tsx" "no-restricted-syntax" 1 "../../src/pages/settings/Profile/AgentAIPromptSection.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/settings/Profile/AgentAIPromptSection.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Profile/Avatar/AvatarCapture/index.native.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/settings/Profile/Avatar/AvatarCapture/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/settings/Profile/Avatar/AvatarPreview.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Profile/Avatar/EditUserAvatarContent.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Profile/Contacts/ContactMethodDetailsPage.tsx" "react-hooks/refs" 3 "../../src/pages/settings/Profile/Contacts/ContactMethodDetailsPage.tsx" "react-hooks/set-state-in-effect" 3 +"../../src/pages/settings/Profile/Contacts/ContactMethodsPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Profile/CustomStatus/StatusClearAfterPage.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/settings/Profile/CustomStatus/StatusPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Profile/CustomStatus/StatusPage.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/settings/Profile/PersonalDetails/DynamicCountrySelectionPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/settings/Profile/PersonalDetails/PersonalAddressPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 @@ -1192,75 +1368,122 @@ "../../src/pages/settings/Profile/PersonalDetails/PrivatePersonalDetailsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 8 "../../src/pages/settings/Profile/PersonalDetails/StateSelectionPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/settings/Profile/ProfilePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/settings/Profile/ProfilePage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Profile/PronounsPage.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/settings/Profile/TimezoneInitialPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/settings/Profile/TimezoneSelectPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/settings/Report/ReportDetailsColumnsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/pages/settings/Rules/ExpenseRulesPage.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 +"../../src/pages/settings/Rules/ExpenseRulesPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Security/AddDelegate/ConfirmDelegateMagicCodePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/settings/Security/AddDelegate/ConfirmDelegatePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/settings/Security/AddDelegate/ConfirmDelegatePage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Security/AddDelegate/UpdateDelegateRole/UpdateDelegateMagicCodePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/settings/Security/DeviceManagementPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Security/LockAccount/LockAccountPageBase.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Security/TwoFactorAuth/DisablePage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Security/TwoFactorAuth/DisabledPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Security/TwoFactorAuth/DynamicTwoFactorAuthPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Security/TwoFactorAuth/DynamicVerifyPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Security/TwoFactorAuth/ReplaceDeviceVerifyNewPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Security/TwoFactorAuth/ReplaceDeviceVerifyOldPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Security/TwoFactorAuth/VerifyPage.tsx" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 1 +"../../src/pages/settings/Subscription/CancelSubscriptionPage/index.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Subscription/CardAuthenticationModal/index.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/settings/Subscription/CardSection/BillingBanner/EarlyDiscountBanner.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Subscription/CardSection/CardSectionButton/index.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Subscription/CardSection/CardSectionDataEmpty/index.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Subscription/FreeTrial.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Subscription/PaymentCard/ChangeBillingCurrency/index.tsx" "no-restricted-syntax" 1 "../../src/pages/settings/Subscription/PaymentCard/DynamicPaymentCardCurrencySelectorPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/settings/Subscription/SubscriptionPlan/ComparePlansModal.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/settings/Subscription/SubscriptionPlan/SaveWithExpensifyButton/index.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Subscription/SubscriptionPlan/SubscriptionPlanCardActionButton.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Subscription/SubscriptionPlan/index.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Subscription/SubscriptionSize/subPages/Confirmation.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Wallet/ActivatePhysicalCardPageBase.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/BankAccountPurposePage/substeps/CountrySelection.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/settings/Wallet/CardDetailsActionButtons.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/ChooseTransferAccountPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/settings/Wallet/CountrySelectionList.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/settings/Wallet/EnableGlobalReimbursements/EnableGlobalReimbursementsAgreementsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/settings/Wallet/EnableGlobalReimbursements/EnableGlobalReimbursementsBusinessPage/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/settings/Wallet/ExpensifyCardPage/ChangePINPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/ExpensifyCardPage/index.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 2 +"../../src/pages/settings/Wallet/ExpensifyCardPage/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/settings/Wallet/ExpensifyCardPage/index.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Wallet/ImportTransactionsPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/InternationalDepositAccount/PersonalInfo/PersonalInfo.tsx" "@typescript-eslint/no-deprecated/useSubStep" 1 "../../src/pages/settings/Wallet/InternationalDepositAccount/PersonalInfo/substeps/AddressStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 6 "../../src/pages/settings/Wallet/InternationalDepositAccount/PersonalInfo/substeps/AddressStep.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/settings/Wallet/InternationalDepositAccount/subPages/Confirmation.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/settings/Wallet/InternationalDepositAccount/utils.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/settings/Wallet/PaymentMethodList.tsx" "@typescript-eslint/no-unsafe-type-assertion" 7 +"../../src/pages/settings/Wallet/PaymentMethodListItem.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/PersonalCardDetailsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/settings/Wallet/PersonalCardDetailsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Wallet/PersonalCardEditTransactionStartDatePage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/PersonalCards/FixPersonalCardConnectionPage/index.native.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/settings/Wallet/PersonalCards/FixPersonalCardConnectionPage/useFixPersonalCardConnection.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/settings/Wallet/PersonalCards/PersonalCardWarning.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/PersonalCards/steps/PlaidConnectionStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 4 "../../src/pages/settings/Wallet/PersonalCards/steps/SelectCountryStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/settings/Wallet/PersonalCards/steps/SelectCountryStep.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/settings/Wallet/PersonalCards/upgrade/PersonalCardUpgradePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/settings/Wallet/PersonalCards/upgrade/UpgradeIntro.tsx" "no-restricted-imports" 1 +"../../src/pages/settings/Wallet/ReportVirtualCardFraudConfirmationPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/ShareBankAccount/ShareBankAccount.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/settings/Wallet/TravelCVVPage/TravelCVVPage.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/UnshareBankAccount/UnshareBankAccount.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 2 +"../../src/pages/settings/Wallet/UnshareBankAccount/UnshareBankAccount.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/UnshareBankAccount/UnshareBankAccount.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/settings/Wallet/UpdatePersonalBankAccountPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/settings/Wallet/WalletPage/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/settings/Wallet/WalletPage/index.tsx" "no-restricted-imports" 1 "../../src/pages/settings/Wallet/WalletPage/index.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/signin/ChooseSSOOrMagicCode.tsx" "no-restricted-imports" 1 "../../src/pages/signin/LoginForm/BaseLoginForm.tsx" "@typescript-eslint/no-deprecated/InteractionManager.runAfterInteractions" 1 "../../src/pages/signin/SAMLSignInPage/index.native.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/signin/SMSDeliveryFailurePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/signin/SMSDeliveryFailurePage.tsx" "no-restricted-imports" 1 "../../src/pages/signin/SignInPage.tsx" "react-hooks/refs" 2 "../../src/pages/signin/SignInPage.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/signin/SignInPageLayout/BackgroundImage/index.native.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/signin/SignInPageLayout/FooterRow/index.native.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/signin/SignUpWelcomeForm.tsx" "no-restricted-imports" 1 +"../../src/pages/signin/UnlinkLoginForm.tsx" "no-restricted-imports" 1 +"../../src/pages/signin/ValidateCodeForm/BaseValidateCodeForm.tsx" "no-restricted-imports" 1 "../../src/pages/signin/ValidateCodeForm/BaseValidateCodeForm.tsx" "react-hooks/set-state-in-effect" 4 "../../src/pages/tasks/TaskShareDestinationSelectorModal.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/wallet/WalletStatementPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/DynamicWorkspaceConfirmationPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/workspace/DynamicWorkspaceOverviewPlanTypePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/workspace/DynamicWorkspaceOverviewPlanTypePage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/DynamicWorkspaceOverviewPlanTypePage.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/workspace/WorkspaceInitialPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/workspace/WorkspaceMembersPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 -"../../src/pages/workspace/WorkspaceMembersPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/WorkspaceMembersPage.tsx" "no-restricted-imports" 2 "../../src/pages/workspace/WorkspaceMembersPage.tsx" "react-hooks/refs" 1 "../../src/pages/workspace/WorkspaceNewRoomPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 +"../../src/pages/workspace/WorkspaceNewRoomPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/WorkspaceNewRoomPage.tsx" "react-hooks/set-state-in-effect" 3 "../../src/pages/workspace/WorkspaceOverviewCurrencyPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/WorkspaceOverviewPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/workspace/WorkspaceOverviewPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/WorkspaceOverviewSharePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/WorkspaceResetBankAccountModal.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 "../../src/pages/workspace/WorkspaceResetBankAccountModal.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/workspace/WorkspacesListPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/accounting/AccountingContext/default.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/accounting/ClaimOfferPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/workspace/accounting/ClaimOfferPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/accounting/PolicyAccountingPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/workspace/accounting/PolicyAccountingPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/accounting/PolicyAccountingPage.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/workspace/accounting/certinia/import/CertiniaDimensionMappingPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/accounting/certinia/prerequisites/CertiniaPrerequisitesStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 +"../../src/pages/workspace/accounting/certinia/prerequisites/CertiniaPrerequisitesStep.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/accounting/intacct/DynamicSageIntacctPrerequisitesPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/accounting/intacct/advanced/DynamicSageIntacctAccountingMethodPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/accounting/intacct/export/DynamicSageIntacctNonReimbursableExpensesDestinationPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/accounting/intacct/export/SageIntacctDatePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -1269,7 +1492,9 @@ "../../src/pages/workspace/accounting/intacct/import/SageIntacctAddUserDimensionPage.tsx" "rulesdir/no-default-id-values" 1 "../../src/pages/workspace/accounting/intacct/import/SageIntacctMappingsTypePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/accounting/intacct/import/SageIntacctToggleMappingsPage.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/workspace/accounting/intacct/import/SageIntacctUserDimensionsPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/accounting/netsuite/NetSuiteTokenInput/subPages/NetSuiteTokenSetupContent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/workspace/accounting/netsuite/NetSuiteTokenInput/subPages/NetSuiteTokenSetupContent.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/accounting/netsuite/advanced/DynamicNetSuiteAccountingMethodPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/accounting/netsuite/advanced/NetSuiteCustomFormIDPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/accounting/netsuite/advanced/NetSuiteExpenseReportApprovalLevelSelectPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -1283,16 +1508,21 @@ "../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldEdit.tsx" "@typescript-eslint/no-unsafe-type-assertion" 12 "../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldNew/NetSuiteImportAddCustomSegmentContent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldNew/subPages/ChooseSegmentTypeStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldNew/subPages/ConfirmCustomListStep.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldNew/subPages/ConfirmCustomSegmentList.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldNew/subPages/ConfirmCustomSegmentList.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldNew/subPages/CustomListMappingStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldNew/subPages/CustomSegmentMappingStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldView.tsx" "@typescript-eslint/no-unsafe-type-assertion" 7 "../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomersOrProjectSelectPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomersOrProjectsPage.tsx" "no-restricted-syntax" 2 "../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomersOrProjectsPage.tsx" "rulesdir/no-default-id-values" 1 "../../src/pages/workspace/accounting/netsuite/import/NetSuiteImportMappingPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/workspace/accounting/qbd/QuickBooksDesktopSetupFlowSyncPage.tsx" "rulesdir/no-default-id-values" 2 +"../../src/pages/workspace/accounting/qbd/QuickBooksDesktopSetupPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/accounting/qbd/QuickBooksDesktopSetupPage.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/workspace/accounting/qbd/RequireQuickBooksDesktopPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/accounting/qbd/advanced/QuickbooksDesktopAccountingMethodPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/accounting/qbd/export/DynamicQuickbooksDesktopCompanyCardExpenseAccountSelectCardPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/accounting/qbd/export/DynamicQuickbooksDesktopOutOfPocketExpenseEntitySelectPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -1342,53 +1572,93 @@ "../../src/pages/workspace/accounting/xero/import/XeroCustomerConfigurationPage.tsx" "no-restricted-syntax" 3 "../../src/pages/workspace/accounting/xero/import/XeroCustomerConfigurationPage.tsx" "rulesdir/no-default-id-values" 1 "../../src/pages/workspace/categories/CategorySettingsPage.tsx" "react-hooks/preserve-manual-memoization" 1 +"../../src/pages/workspace/categories/WorkspaceCategoriesPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/categories/WorkspaceCategoriesPage.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/workspace/companyCards/BankConnection/index.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/workspace/companyCards/DynamicWorkspaceCompanyCardDetailsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardAddWorkEmailPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardEditTransactionStartDatePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/workspace/companyCards/WorkspaceCompanyCardEditTransactionStartDatePage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/companyCards/WorkspaceCompanyCardExpensifyCardPromotionBanner.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardFeedSelectorPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardsErrorConfirmation.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/companyCards/WorkspaceCompanyCardsSettingsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/companyCards/WorkspaceVerifyWorkAccountPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/workspace/companyCards/WorkspaceVerifyWorkAccountPage.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/workspace/companyCards/addNew/CardInstructionsStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/workspace/companyCards/addNew/CardInstructionsStep.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/addNew/DynamicAddNewCardPage.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 +"../../src/pages/workspace/companyCards/addNew/ImportFromFileStep.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/companyCards/addNew/PlaidConnectionStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 6 "../../src/pages/workspace/companyCards/addNew/SelectCountryStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/workspace/companyCards/assignCard/ConfirmationStep.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/companyCards/assignCard/TransactionStartDateStep.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/copyPolicySettings/CopyPolicySettingsConfirmPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/distanceRates/PolicyCommuterExclusionsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/distanceRates/PolicyDistanceRatesPage.tsx" "react-hooks/preserve-manual-memoization" 1 +"../../src/pages/workspace/downgrade/DowngradeIntro.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/downgrade/PayAndDowngradePage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/duplicate/WorkspaceDuplicateSelectFeaturesForm.tsx" "react-hooks/preserve-manual-memoization" 2 "../../src/pages/workspace/duplicate/WorkspaceDuplicateSelectFeaturesForm.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/workspace/expensifyCard/DynamicExpensifyCardLimitTypePage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/expensifyCard/DynamicWorkspaceSettlementAccountPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 +"../../src/pages/workspace/expensifyCard/WorkspaceCardsListLabel.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/expensifyCard/WorkspaceEditCardLimitPage.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 "../../src/pages/workspace/expensifyCard/WorkspaceEditCardLimitTypePage.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 1 "../../src/pages/workspace/expensifyCard/WorkspaceExpensifyCardBankAccounts.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/workspace/expensifyCard/WorkspaceExpensifyCardListPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/expensifyCard/issueNew/LimitTypeStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/expensifyCard/issueNew/spendRules/SetSpendRulesStep.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/workspace/hr/HRApprovalModePageBase.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/hr/HRProviderCard.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/workspace/hr/HRProviderCard.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/hr/merge/MergeHRGroupsPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/hr/utils.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/invoices/WorkspaceInvoiceVBASection.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/workspace/members/ImportMembersPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/members/ImportMembersPage.tsx" "no-restricted-syntax" 1 "../../src/pages/workspace/members/ImportMembersPage.tsx" "rulesdir/no-default-id-values" 1 +"../../src/pages/workspace/members/ImportedMembersConfirmationPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/members/ImportedMembersConfirmationPage.tsx" "react-hooks/refs" 7 "../../src/pages/workspace/members/WorkspaceInviteMessageComponent.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/members/WorkspaceInviteMessageComponent.tsx" "react-hooks/set-state-in-effect" 1 "../../src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 4 +"../../src/pages/workspace/members/WorkspaceMemberDetailsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/members/WorkspaceOwnerChangeCheck.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/members/WorkspaceOwnerChangeCheck.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/workspace/members/WorkspaceOwnerChangeErrorPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/members/WorkspaceOwnerChangeErrorPage.tsx" "react-hooks/refs" 2 "../../src/pages/workspace/members/WorkspaceOwnerChangeSuccessPage.tsx" "react-hooks/refs" 2 "../../src/pages/workspace/members/WorkspaceOwnerPaymentCardForm.tsx" "react-hooks/set-state-in-effect" 2 "../../src/pages/workspace/receiptPartners/EditInviteReceiptPartnerPolicyPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/workspace/receiptPartners/WorkspaceReceiptPartnersPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/reports/ReportFieldsListValuesPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/reports/TypeSelector/index.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/workspace/rooms/WorkspaceRoomsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/rules/AgentRules/EditAgentRulePage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/rules/MerchantRules/MerchantRulePageBase.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/rules/PolicyRulesPageRevamp.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/rules/RulesProhibitedDefaultPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/rules/RulesRequireFieldsPage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/rules/SpendRules/SpendRulePageBase.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/tags/ImportMultiLevelTagsSettingsPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/tags/WorkspaceTagsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 +"../../src/pages/workspace/tags/WorkspaceTagsPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/tags/WorkspaceTagsPage.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/workspace/taxes/WorkspaceCreateTaxValuePage.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/taxes/WorkspaceTaxesPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/taxes/WorkspaceTaxesPage.tsx" "react-hooks/set-state-in-effect" 1 +"../../src/pages/workspace/travel/GetStartedTravel.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/travel/ReviewingRequest.tsx" "no-restricted-imports" 1 +"../../src/pages/workspace/travel/WorkspaceTravelInvoicingExportPage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/travel/WorkspaceTravelInvoicingSection.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 3 +"../../src/pages/workspace/travel/WorkspaceTravelInvoicingSection.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/travel/WorkspaceTravelInvoicingSettlementAccountPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/pages/workspace/upgrade/GenericFeaturesView.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/upgrade/UpgradeIntro.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../src/pages/workspace/upgrade/UpgradeIntro.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/upgrade/WorkspaceUpgradePage.tsx" "no-restricted-imports" 1 "../../src/pages/workspace/withPolicy.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/pages/workspace/withPolicyAndFullscreenLoading.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -1396,6 +1666,7 @@ "../../src/pages/workspace/workflows/WorkspaceAutoReportingMonthlyOffsetPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx" "@typescript-eslint/no-unsafe-type-assertion" 3 "../../src/pages/workspace/workflows/WorkspaceWorkflowsPayerPage.tsx" "@typescript-eslint/no-deprecated/ConfirmModal" 2 +"../../src/pages/workspace/workflows/approvals/WorkspaceWorkflowsApprovalsApprovalLimitPage.tsx" "no-restricted-imports" 1 "../../src/polyfills/requestIdleCallback.ts" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../src/selectors/AdvancedSearchFiltersForm.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/selectors/Domain.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -1405,11 +1676,14 @@ "../../src/setup/moduleInitPolyfill.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/setup/telemetry/index.web.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/stories/AddressSearch.stories.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 +"../../src/stories/Button.stories.tsx" "no-restricted-imports" 1 "../../src/stories/ButtonWithDropdownMenu.stories.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/stories/DragAndDrop.stories.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/stories/EReceipt.stories.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/stories/Form.stories.tsx" "@typescript-eslint/no-unsafe-type-assertion" 10 +"../../src/stories/NumberWithSymbolForm.stories.tsx" "no-restricted-imports" 1 "../../src/stories/ReportActionItemImages.stories.tsx" "no-restricted-syntax" 1 +"../../src/stories/SelectionListWithSections.stories.tsx" "no-restricted-imports" 1 "../../src/stories/TextInput.stories.tsx" "react-hooks/set-state-in-effect" 1 "../../src/styles/index.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../src/styles/theme/utils.ts" "@typescript-eslint/no-unsafe-type-assertion" 1 @@ -1649,6 +1923,7 @@ "../../tests/ui/WorkspaceWorkflowsPayerRowTest.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../tests/ui/YearListItemHeaderTest.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 "../../tests/ui/components/BaseReportActionContextMenuTest.tsx" "@typescript-eslint/no-unsafe-type-assertion" 2 +"../../tests/ui/components/Button.tsx" "no-restricted-imports" 1 "../../tests/ui/components/CompactMenuContextTest.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 "../../tests/ui/components/ComposedButton.tsx" "@typescript-eslint/no-unsafe-type-assertion" 4 "../../tests/ui/components/DisplayNames.test.tsx" "@typescript-eslint/no-unsafe-type-assertion" 1 diff --git a/src/components/ButtonComposed/Button.tsx b/src/components/ButtonComposed/Button.tsx index 63ad3613b8b5..072f5afaf908 100644 --- a/src/components/ButtonComposed/Button.tsx +++ b/src/components/ButtonComposed/Button.tsx @@ -65,8 +65,11 @@ function Button({ isHovered, variant, size, + onPress, + isDisabled, + isLoading, }), - [isHovered, variant, size], + [isHovered, variant, size, onPress, isDisabled, isLoading], ); const buttonVariantStyles = useMemo(() => { diff --git a/src/components/ButtonComposed/composed/ButtonWithIcons.tsx b/src/components/ButtonComposed/composed/ButtonWithIcons.tsx index f6fd31e0fa17..eef09d57454b 100644 --- a/src/components/ButtonComposed/composed/ButtonWithIcons.tsx +++ b/src/components/ButtonComposed/composed/ButtonWithIcons.tsx @@ -14,6 +14,8 @@ import React from 'react'; type ButtonWithIconsProps = BaseButtonProps & ButtonKeyboardShortcutProps & { + /** Whether pressing Enter triggers onPress — when true, the Enter-key shortcut is mounted. */ + pressOnEnter?: boolean; // Icon Left Props iconLeft?: IconAsset; iconLeftFill?: string; @@ -108,13 +110,9 @@ function ButtonWithIcons({ > {!!pressOnEnter && ( )} {!!iconLeft && ( diff --git a/src/components/ButtonComposed/context/ButtonContext.ts b/src/components/ButtonComposed/context/ButtonContext.ts index 1d1e00599a26..2800e481ef9a 100644 --- a/src/components/ButtonComposed/context/ButtonContext.ts +++ b/src/components/ButtonComposed/context/ButtonContext.ts @@ -9,6 +9,9 @@ const defaultButtonContextValue: ButtonContextValue = { isHovered: false, variant: undefined, size: CONST.BUTTON_SIZE.MEDIUM, + onPress: () => {}, + isDisabled: false, + isLoading: false, }; const ButtonContext = createContext(defaultButtonContextValue); diff --git a/src/components/ButtonComposed/context/types.ts b/src/components/ButtonComposed/context/types.ts index 16ff6865e855..f8c840d7ec7e 100644 --- a/src/components/ButtonComposed/context/types.ts +++ b/src/components/ButtonComposed/context/types.ts @@ -2,9 +2,10 @@ import type {ButtonVariant} from '@styles/utils/types'; import type CONST from '@src/CONST'; +import type {GestureResponderEvent} from 'react-native'; import type {ValueOf} from 'type-fest'; -/** Values published by the parent `Button` for its child primitives (Text/Icon/...) to consume via `useButtonContext`. */ +/** Values published by the parent `Button` for its child primitives (Text/Icon/KeyboardShortcut/...) to consume via `useButtonContext`. */ type ButtonContextValue = { /** Button size — primitives use it to pick matching paddings/icon dimensions/font sizes. */ size: ValueOf; @@ -14,6 +15,15 @@ type ButtonContextValue = { /** True while the cursor is over the Button — primitives swap to hover-state colors/styles when set. */ isHovered: boolean; + + /** The Button's press handler — `ButtonKeyboardShortcut` fires it when Enter is pressed. */ + onPress: (event?: GestureResponderEvent | KeyboardEvent) => void | Promise; + + /** Whether the Button is disabled — `ButtonKeyboardShortcut` uses it to block the Enter shortcut. */ + isDisabled: boolean; + + /** Whether the Button is loading — `ButtonKeyboardShortcut` uses it to block the Enter shortcut. */ + isLoading: boolean; }; export type {ButtonContextValue, ButtonVariant}; diff --git a/src/components/ButtonComposed/primitives/ButtonKeyboardShortcut.tsx b/src/components/ButtonComposed/primitives/ButtonKeyboardShortcut.tsx index a1877e35ee10..9277f1bc68f9 100644 --- a/src/components/ButtonComposed/primitives/ButtonKeyboardShortcut.tsx +++ b/src/components/ButtonComposed/primitives/ButtonKeyboardShortcut.tsx @@ -1,4 +1,5 @@ import validateSubmitShortcut from '@components/Button/validateSubmitShortcut'; +import {useButtonContext} from '@components/ButtonComposed/context'; import type {ButtonKeyboardShortcutProps} from '@components/ButtonComposed/types'; import useActiveElementRole from '@hooks/useActiveElementRole'; @@ -14,25 +15,20 @@ import {useCallback, useMemo} from 'react'; const accessibilityRoles: string[] = Object.values(CONST.ROLE); /** - * Registers an Enter-key keyboard shortcut that triggers the button's onPress handler. + * Registers an Enter-key keyboard shortcut that triggers the parent Button's onPress handler. * Renders nothing to the DOM — it is a pure-behavior primitive intended to be composed * alongside ButtonText, ButtonIconLeft, etc. as a child of Button. * * Usage: - * */ -function ButtonKeyboardShortcut({ - isDisabled = false, - isLoading = false, - onPress = () => {}, - pressOnEnter, - allowBubble, - enterKeyEventListenerPriority, - isPressOnEnterActive = false, -}: ButtonKeyboardShortcutProps) { +function ButtonKeyboardShortcut({allowBubble, enterKeyEventListenerPriority, isPressOnEnterActive = false}: ButtonKeyboardShortcutProps) { + // The press handler and disabled/loading state come from the parent Button context. + const {onPress, isDisabled, isLoading} = useButtonContext(); + const isFocused = useIsFocused(); const activeElementRole = useActiveElementRole(); @@ -50,12 +46,12 @@ function ButtonKeyboardShortcut({ const config = useMemo( () => ({ - isActive: pressOnEnter && !shouldDisableEnterShortcut && (isFocused || isPressOnEnterActive), + isActive: !shouldDisableEnterShortcut && (isFocused || isPressOnEnterActive), shouldBubble: allowBubble, priority: enterKeyEventListenerPriority, shouldPreventDefault: false, }), - [pressOnEnter, shouldDisableEnterShortcut, isFocused, isPressOnEnterActive, allowBubble, enterKeyEventListenerPriority], + [shouldDisableEnterShortcut, isFocused, isPressOnEnterActive, allowBubble, enterKeyEventListenerPriority], ); useKeyboardShortcut(CONST.KEYBOARD_SHORTCUTS.ENTER, keyboardShortcutCallback, config); diff --git a/src/components/ButtonComposed/types.ts b/src/components/ButtonComposed/types.ts index a4fcaf3b43ee..8e00716d2a7c 100644 --- a/src/components/ButtonComposed/types.ts +++ b/src/components/ButtonComposed/types.ts @@ -55,14 +55,9 @@ type ButtonBehaviorProps = { }; /** - * Props for the ButtonKeyboardShortcut primitive. - * Groups all Enter-key shortcut configuration in one place so the parent Button - * does not need to know about keyboard-shortcut internals. + * Props for the ButtonKeyboardShortcut primitive — the Enter-key shortcut configuration. */ type ButtonKeyboardShortcutProps = { - /** Call the onPress function when Enter key is pressed */ - pressOnEnter?: boolean; - /** The priority to assign the enter key event listener. 0 is the highest priority. */ enterKeyEventListenerPriority?: number; @@ -71,15 +66,6 @@ type ButtonKeyboardShortcutProps = { /** Should the press event bubble across multiple instances when Enter key triggers it. */ allowBubble?: boolean; - - /** Whether the button is disabled — used by validateSubmitShortcut to block the callback */ - isDisabled?: boolean; - - /** Whether the button is loading — used by validateSubmitShortcut to block the callback */ - isLoading?: boolean; - - /** The callback to fire when Enter is pressed and the shortcut is active */ - onPress?: (event?: GestureResponderEvent | KeyboardEvent) => void | Promise; }; type ButtonStyleProps = { diff --git a/tests/ui/components/ButtonKeyboardShortcut.tsx b/tests/ui/components/ButtonKeyboardShortcut.tsx index a006873710a4..3b312364cb98 100644 --- a/tests/ui/components/ButtonKeyboardShortcut.tsx +++ b/tests/ui/components/ButtonKeyboardShortcut.tsx @@ -1,7 +1,8 @@ import {render} from '@testing-library/react-native'; +import Button from '@src/components/ButtonComposed/Button'; import ButtonKeyboardShortcut from '@src/components/ButtonComposed/primitives/ButtonKeyboardShortcut'; -import type {ButtonKeyboardShortcutProps} from '@src/components/ButtonComposed/types'; +import type {ButtonKeyboardShortcutProps, ButtonProps} from '@src/components/ButtonComposed/types'; import {NavigationContainer} from '@react-navigation/native'; import React from 'react'; @@ -29,19 +30,24 @@ jest.mock('@hooks/useKeyboardShortcut', () => // ────────────────────────────────────────────────────────────────────────────── /** - * Renders ButtonKeyboardShortcut inside a NavigationContainer. + * Renders ButtonKeyboardShortcut inside a real Button (which owns ButtonContext) and a NavigationContainer. * NavigationContainer is required because the component calls useIsFocused(). * isPressOnEnterActive=true is the default here so the shortcut is active * even without a focused screen, keeping individual tests simple. + * `buttonProps` set the parent Button's onPress/isDisabled/isLoading, which the primitive reads from context. */ -const renderShortcut = (props: Partial = {}) => +const renderShortcut = (props: Partial = {}, buttonProps: Omit, 'children'> = {}) => render( - + , ); @@ -58,38 +64,22 @@ describe('ButtonKeyboardShortcut', () => { // ── Registration ─────────────────────────────────────────────────────────── describe('registration', () => { - it('registers an Enter listener when pressOnEnter is true', () => { - // Given a ButtonKeyboardShortcut with pressOnEnter enabled - renderShortcut({pressOnEnter: true}); + it('registers an Enter listener when mounted and active', () => { + // Given a mounted ButtonKeyboardShortcut (active via isPressOnEnterActive) + renderShortcut(); // Then useKeyboardShortcut was called and the callback was captured expect(enterKeyCallback).toBeDefined(); }); - - it('does not register an Enter listener when pressOnEnter is false', () => { - // Given a ButtonKeyboardShortcut with pressOnEnter disabled - renderShortcut({pressOnEnter: false}); - - // Then no callback was registered (mock guards on config.isActive) - expect(enterKeyCallback).toBeUndefined(); - }); - - it('does not register an Enter listener when pressOnEnter is omitted', () => { - // Given a ButtonKeyboardShortcut without pressOnEnter - renderShortcut({pressOnEnter: undefined}); - - // Then no callback was registered - expect(enterKeyCallback).toBeUndefined(); - }); }); // ── onPress invocation ───────────────────────────────────────────────────── describe('onPress invocation', () => { - it('calls onPress when Enter is triggered and the button is enabled', () => { - // Given an active shortcut with an onPress handler + it('calls the context onPress when Enter is triggered and the button is enabled', () => { + // Given an active shortcut whose parent Button provides an onPress handler const onPress = jest.fn(); - renderShortcut({onPress}); + renderShortcut({}, {onPress}); // When the Enter key fires enterKeyCallback?.(new KeyboardEvent('keydown', {key: 'Enter', bubbles: true})); @@ -98,10 +88,10 @@ describe('ButtonKeyboardShortcut', () => { expect(onPress).toHaveBeenCalledTimes(1); }); - it('blocks onPress when isDisabled is true', () => { - // Given a shortcut where the button is disabled + it('blocks onPress when the context isDisabled is true', () => { + // Given a shortcut whose parent Button is disabled const onPress = jest.fn(); - renderShortcut({onPress, isDisabled: true}); + renderShortcut({}, {onPress, isDisabled: true}); // When the Enter key fires enterKeyCallback?.(new KeyboardEvent('keydown', {key: 'Enter', bubbles: true})); @@ -110,10 +100,10 @@ describe('ButtonKeyboardShortcut', () => { expect(onPress).not.toHaveBeenCalled(); }); - it('blocks onPress when isLoading is true', () => { - // Given a shortcut where the button is loading + it('blocks onPress when the context isLoading is true', () => { + // Given a shortcut whose parent Button is loading const onPress = jest.fn(); - renderShortcut({onPress, isLoading: true}); + renderShortcut({}, {onPress, isLoading: true}); // When the Enter key fires enterKeyCallback?.(new KeyboardEvent('keydown', {key: 'Enter', bubbles: true})); @@ -161,8 +151,12 @@ describe('ButtonKeyboardShortcut', () => { // ── Rendering ────────────────────────────────────────────────────────────── it('renders nothing to the DOM', () => { - // Given a rendered ButtonKeyboardShortcut - const {toJSON} = renderShortcut(); + // Given the primitive rendered in isolation (default context), so no parent Button markup interferes + const {toJSON} = render( + + + , + ); // Then it contributes no nodes to the render tree expect(toJSON()).toBeNull(); diff --git a/tests/ui/components/ComposedButton.tsx b/tests/ui/components/ComposedButton.tsx index f60e0062cb33..071c40bf808a 100644 --- a/tests/ui/components/ComposedButton.tsx +++ b/tests/ui/components/ComposedButton.tsx @@ -29,12 +29,14 @@ const LABEL = 'test-button'; * assertions can verify exactly what Button propagates to its children. */ function ContextReadout() { - const {variant, size, isHovered} = useButtonContext(); + const {variant, size, isHovered, isDisabled, isLoading} = useButtonContext(); return ( {variant ?? 'none'} {size} {String(isHovered)} + {String(isDisabled)} + {String(isLoading)} ); } @@ -93,7 +95,9 @@ describe('ButtonComposed — Button', () => { renderButton(); // Then the pressable element carries the theme's default button background - expect(screen.getByLabelText(LABEL)).toHaveStyle({backgroundColor: colors.productDark400}); + expect(screen.getByLabelText(LABEL)).toHaveStyle({ + backgroundColor: colors.productDark400, + }); }); it('applies innerStyles to the pressable element', () => { @@ -111,7 +115,7 @@ describe('ButtonComposed — Button', () => { // that every prop the context exposes reaches children correctly. describe('ButtonContext', () => { - it('provides sensible defaults: size=medium, no variant, not loading, not hovered', () => { + it('provides sensible defaults: size=medium, no variant, not loading, not disabled, not hovered', () => { // Given a Button with no extra props renderButton(); @@ -119,6 +123,18 @@ describe('ButtonComposed — Button', () => { expect(screen.getByTestId('ctx-size')).toHaveTextContent(CONST.BUTTON_SIZE.MEDIUM); expect(screen.getByTestId('ctx-variant')).toHaveTextContent('none'); expect(screen.getByTestId('ctx-isHovered')).toHaveTextContent('false'); + expect(screen.getByTestId('ctx-isDisabled')).toHaveTextContent('false'); + expect(screen.getByTestId('ctx-isLoading')).toHaveTextContent('false'); + }); + + it('propagates isDisabled to children via context', () => { + renderButton({isDisabled: true}); + expect(screen.getByTestId('ctx-isDisabled')).toHaveTextContent('true'); + }); + + it('propagates isLoading to children via context', () => { + renderButton({isLoading: true}); + expect(screen.getByTestId('ctx-isLoading')).toHaveTextContent('true'); }); it.each(['success', 'danger'] as const)('propagates variant="%s" to children via context', (variant) => { @@ -281,7 +297,9 @@ describe('ButtonComposed — Button', () => { {variant: 'danger' as const, expectedBg: colors.red}, ])('variant="$variant" applies the correct background color', ({variant, expectedBg}) => { renderButton({variant}); - expect(screen.getByLabelText(LABEL)).toHaveStyle({backgroundColor: expectedBg}); + expect(screen.getByLabelText(LABEL)).toHaveStyle({ + backgroundColor: expectedBg, + }); }); // The transparent-background invariant for link-style buttons now lives in the @@ -291,7 +309,9 @@ describe('ButtonComposed — Button', () => { it('no variant uses the default button background', () => { // Implicit check that nothing accidentally overrides the base background. renderButton(); - expect(screen.getByLabelText(LABEL)).toHaveStyle({backgroundColor: colors.productDark400}); + expect(screen.getByLabelText(LABEL)).toHaveStyle({ + backgroundColor: colors.productDark400, + }); }); }); @@ -303,12 +323,27 @@ describe('ButtonComposed — Button', () => { describe('size styles', () => { // getButtonSizeStyle returns the base buttonSmall/Medium/Large styles with paddingHorizontal lower by 4px it.each([ - {size: CONST.BUTTON_SIZE.SMALL, minHeight: variables.componentSizeSmall, paddingHorizontal: 8}, - {size: CONST.BUTTON_SIZE.MEDIUM, minHeight: variables.componentSizeNormal, paddingHorizontal: 12}, - {size: CONST.BUTTON_SIZE.LARGE, minHeight: variables.componentSizeLarge, paddingHorizontal: 16}, + { + size: CONST.BUTTON_SIZE.SMALL, + minHeight: variables.componentSizeSmall, + paddingHorizontal: 8, + }, + { + size: CONST.BUTTON_SIZE.MEDIUM, + minHeight: variables.componentSizeNormal, + paddingHorizontal: 12, + }, + { + size: CONST.BUTTON_SIZE.LARGE, + minHeight: variables.componentSizeLarge, + paddingHorizontal: 16, + }, ])('size="$size" applies minHeight=$minHeight and paddingHorizontal=$paddingHorizontal', ({size, minHeight, paddingHorizontal}) => { renderButton({size}); - expect(screen.getByLabelText(LABEL)).toHaveStyle({minHeight, paddingHorizontal}); + expect(screen.getByLabelText(LABEL)).toHaveStyle({ + minHeight, + paddingHorizontal, + }); }); }); @@ -333,7 +368,12 @@ describe('ButtonComposed — Button', () => { { label: 'all', removeBorderRadius: 'all' as const, - expectedStyle: {borderTopRightRadius: 0, borderBottomRightRadius: 0, borderTopLeftRadius: 0, borderBottomLeftRadius: 0}, + expectedStyle: { + borderTopRightRadius: 0, + borderBottomRightRadius: 0, + borderTopLeftRadius: 0, + borderBottomLeftRadius: 0, + }, }, ])('removeBorderRadius="$label" zeros out the correct corners', ({removeBorderRadius, expectedStyle}) => { renderButton({removeBorderRadius}); @@ -355,7 +395,9 @@ describe('ButtonComposed — Button', () => { fireEvent(getButton(), 'hoverIn'); // Then the button shows the hover background - expect(screen.getByLabelText(LABEL)).toHaveStyle({backgroundColor: colors.productDark500}); + expect(screen.getByLabelText(LABEL)).toHaveStyle({ + backgroundColor: colors.productDark500, + }); }); it.each([ @@ -366,7 +408,9 @@ describe('ButtonComposed — Button', () => { // success stays green and danger stays red even when highlighted. renderButton({variant}); fireEvent(getButton(), 'hoverIn'); - expect(screen.getByLabelText(LABEL)).toHaveStyle({backgroundColor: expectedHoverBg}); + expect(screen.getByLabelText(LABEL)).toHaveStyle({ + backgroundColor: expectedHoverBg, + }); }); }); @@ -386,7 +430,9 @@ describe('ButtonComposed — Button', () => { renderButton({accessibilityState: {selected: true}}); // Then the state is forwarded verbatim to the pressable element - expect(getButton().props.accessibilityState).toMatchObject({selected: true}); + expect(getButton().props.accessibilityState).toMatchObject({ + selected: true, + }); }); it('forwards testID to the underlying pressable', () => { @@ -454,7 +500,9 @@ describe('ButtonComposed — Button', () => { renderButton({onLayout}); // When a layout event fires - fireEvent(getButton(), 'layout', {nativeEvent: {layout: {width: 200, height: 48, x: 0, y: 0}}}); + fireEvent(getButton(), 'layout', { + nativeEvent: {layout: {width: 200, height: 48, x: 0, y: 0}}, + }); // Then onLayout is called expect(onLayout).toHaveBeenCalledTimes(1); @@ -515,7 +563,9 @@ describe('ButtonComposed — Button', () => { it('applies contentContainerStyle to the content wrapper', () => { // Given a Button with a custom contentContainerStyle - const renderResult = renderButton({contentContainerStyle: {paddingTop: 8}}); + const renderResult = renderButton({ + contentContainerStyle: {paddingTop: 8}, + }); // contentContainerStyle is applied to the flexRow View wrapping all children. // We find it by scanning host Views for the custom padding. @@ -529,7 +579,9 @@ describe('ButtonComposed — Button', () => { const renderResult = renderButton({blendOpacity: true}); const overlayView = renderResult.UNSAFE_getAllByType(View).find((v) => { - const flat = StyleSheet.flatten(v.props.style ?? []) as {position?: string}; + const flat = StyleSheet.flatten(v.props.style ?? []) as { + position?: string; + }; return flat?.position === 'absolute'; }); @@ -543,7 +595,13 @@ describe('ButtonComposed — Button', () => { right?: number; bottom?: number; }; - expect(overlayStyle).toMatchObject({position: 'absolute', top: 0, left: 0, right: 0, bottom: 0}); + expect(overlayStyle).toMatchObject({ + position: 'absolute', + top: 0, + left: 0, + right: 0, + bottom: 0, + }); }); }); });