@hero-design/rn 8.35.0-alpha.4 → 8.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +1 -0
- package/.turbo/turbo-build.log +2 -2
- package/.turbo/turbo-publish:npm.log +0 -9
- package/es/index.js +539 -637
- package/jest.config.js +1 -1
- package/lib/index.js +549 -647
- package/package.json +9 -9
- package/src/components/Attachment/__tests__/__snapshots__/index.spec.tsx.snap +1 -1
- package/src/components/Badge/__tests__/__snapshots__/Badge.spec.tsx.snap +3 -3
- package/src/components/Badge/__tests__/__snapshots__/Status.spec.tsx.snap +1 -1
- package/src/components/Button/LoadingIndicator/__tests__/__snapshots__/StyledLoadingIndicator.spec.tsx.snap +2 -2
- package/src/components/Button/LoadingIndicator/__tests__/__snapshots__/index.spec.tsx.snap +6 -6
- package/src/components/Button/UtilityButton/__tests__/__snapshots__/index.spec.tsx.snap +2 -2
- package/src/components/Button/__tests__/__snapshots__/Button.spec.tsx.snap +4 -4
- package/src/components/Button/__tests__/__snapshots__/StyledButton.spec.tsx.snap +6 -6
- package/src/components/Calendar/__tests__/index.spec.tsx +29 -0
- package/src/components/Calendar/index.tsx +10 -1
- package/src/components/Carousel/__tests__/__snapshots__/index.spec.tsx.snap +75 -74
- package/src/components/Carousel/index.tsx +1 -1
- package/src/components/DatePicker/DatePickerCalendar.tsx +23 -14
- package/src/components/FAB/ActionGroup/__tests__/__snapshots__/index.spec.tsx.snap +1 -1
- package/src/components/FAB/__tests__/__snapshots__/StyledFAB.spec.tsx.snap +1 -1
- package/src/components/FAB/index.tsx +0 -4
- package/src/components/Icon/__tests__/__snapshots__/index.spec.tsx.snap +1 -1
- package/src/components/PinInput/__tests__/__snapshots__/PinCell.spec.tsx.snap +4 -4
- package/src/components/PinInput/__tests__/__snapshots__/index.spec.tsx.snap +12 -12
- package/src/components/Portal/PortalHost.tsx +24 -0
- package/src/components/Portal/PortalProvider.tsx +29 -0
- package/src/components/Portal/__tests__/PortalHost.spec.tsx +50 -0
- package/src/components/Portal/__tests__/PortalProvider.spec.tsx +24 -0
- package/src/components/Portal/__tests__/index.spec.tsx +29 -0
- package/src/components/Portal/__tests__/reducer.spec.tsx +110 -0
- package/src/components/Portal/constants.ts +10 -0
- package/src/components/Portal/contexts.ts +14 -0
- package/src/components/Portal/index.tsx +42 -0
- package/src/components/Portal/reducer.ts +106 -0
- package/src/components/Portal/types.tsx +31 -0
- package/src/components/Portal/usePortal.ts +50 -0
- package/src/components/Portal/usePortalState.ts +11 -0
- package/src/components/Progress/StyledProgressBar.tsx +1 -0
- package/src/components/Progress/__tests__/__snapshots__/index.spec.js.snap +46 -44
- package/src/components/RichTextEditor/__tests__/__snapshots__/RichTextEditor.spec.tsx.snap +6 -6
- package/src/components/SectionHeading/__tests__/__snapshots__/index.spec.tsx.snap +1 -1
- package/src/components/Skeleton/__tests__/__snapshots__/index.spec.tsx.snap +7 -7
- package/src/components/Swipeable/__tests__/__snapshots__/index.spec.tsx.snap +5 -0
- package/src/components/Swipeable/index.tsx +6 -1
- package/src/components/Switch/SelectorSwitch/StyledSelectorSwitch.tsx +4 -7
- package/src/components/Switch/SelectorSwitch/__tests__/__snapshots__/Option.spec.tsx.snap +3 -3
- package/src/components/Switch/SelectorSwitch/__tests__/__snapshots__/index.spec.tsx.snap +9 -9
- package/src/components/Switch/SelectorSwitch/index.tsx +7 -15
- package/src/components/Tabs/__tests__/__snapshots__/ScrollableTabs.spec.tsx.snap +21 -21
- package/src/components/Tabs/__tests__/__snapshots__/ScrollableTabsHeader.spec.tsx.snap +6 -6
- package/src/components/Tabs/__tests__/__snapshots__/TabWithBadge.spec.tsx.snap +2 -2
- package/src/components/Tabs/__tests__/__snapshots__/index.spec.tsx.snap +9 -9
- package/src/components/Tag/StyledTag.tsx +6 -35
- package/src/components/Tag/__tests__/Tag.spec.tsx +13 -13
- package/src/components/Tag/__tests__/__snapshots__/Tag.spec.tsx.snap +40 -79
- package/src/components/Tag/index.tsx +8 -6
- package/src/components/TextInput/__tests__/__snapshots__/StyledTextInput.spec.tsx.snap +7 -7
- package/src/components/TextInput/__tests__/__snapshots__/index.spec.tsx.snap +20 -20
- package/src/components/Toolbar/__tests__/__snapshots__/ToolbarItem.spec.tsx.snap +1 -1
- package/src/components/Typography/Body/__tests__/__snapshots__/StyledBody.tsx.snap +1 -1
- package/src/components/Typography/Body/__tests__/__snapshots__/index.spec.tsx.snap +2 -2
- package/src/components/Typography/Caption/__tests__/__snapshots__/StyledCaption.spec.tsx.snap +1 -1
- package/src/components/Typography/Caption/__tests__/__snapshots__/index.spec.tsx.snap +2 -2
- package/src/components/Typography/Label/__tests__/__snapshots__/StyledLabel.tsx.snap +1 -1
- package/src/components/Typography/Label/__tests__/__snapshots__/index.spec.tsx.snap +2 -2
- package/src/components/Typography/Text/__tests__/__snapshots__/StyledText.spec.tsx.snap +1 -1
- package/src/components/Typography/Title/__tests__/__snapshots__/StyledTitle.tsx.snap +3 -3
- package/src/components/Typography/Title/__tests__/__snapshots__/index.spec.tsx.snap +4 -4
- package/src/index.ts +2 -2
- package/src/theme/__tests__/__snapshots__/index.spec.ts.snap +49 -46
- package/src/theme/components/button.ts +1 -1
- package/src/theme/components/progress.ts +2 -2
- package/src/theme/components/swipeable.ts +5 -1
- package/src/theme/components/switch.ts +4 -4
- package/src/theme/components/tabs.ts +1 -1
- package/src/theme/components/tag.ts +2 -2
- package/src/theme/components/typography.ts +2 -2
- package/src/theme/global/colors/__tests__/__snapshots__/eBens.spec.ts.snap +7 -7
- package/src/theme/global/colors/__tests__/__snapshots__/global.spec.ts.snap +5 -5
- package/src/theme/global/colors/__tests__/__snapshots__/jobs.spec.ts.snap +6 -6
- package/src/theme/global/colors/__tests__/__snapshots__/swag.spec.ts.snap +6 -6
- package/src/theme/global/colors/__tests__/__snapshots__/wallet.spec.ts.snap +7 -7
- package/src/theme/global/colors/__tests__/__snapshots__/work.spec.ts.snap +5 -5
- package/src/theme/global/colors/eBens.ts +2 -2
- package/src/theme/global/colors/global.ts +5 -5
- package/src/theme/global/colors/jobs.ts +1 -1
- package/src/theme/global/colors/swag.ts +1 -1
- package/src/theme/global/colors/wallet.ts +2 -2
- package/types/components/Accordion/AccordionItem.d.ts +0 -0
- package/types/components/Accordion/StyledAccordion.d.ts +0 -0
- package/types/components/Accordion/index.d.ts +0 -0
- package/types/components/Alert/StyledAlert.d.ts +0 -0
- package/types/components/Alert/index.d.ts +0 -0
- package/types/components/Attachment/StyledAttachment.d.ts +0 -0
- package/types/components/Attachment/index.d.ts +0 -0
- package/types/components/Avatar/Avatar.d.ts +0 -0
- package/types/components/Avatar/AvatarStack/StyledAvatarStack.d.ts +0 -0
- package/types/components/Avatar/AvatarStack/index.d.ts +0 -0
- package/types/components/Avatar/AvatarStack/utils.d.ts +0 -0
- package/types/components/Avatar/StyledAvatar.d.ts +0 -0
- package/types/components/Avatar/index.d.ts +0 -0
- package/types/components/Badge/Status.d.ts +0 -0
- package/types/components/Badge/StyledBadge.d.ts +0 -0
- package/types/components/Badge/index.d.ts +0 -0
- package/types/components/BottomNavigation/StyledBottomNavigation.d.ts +0 -0
- package/types/components/BottomNavigation/index.d.ts +0 -0
- package/types/components/BottomSheet/BottomSheetContext.d.ts +0 -0
- package/types/components/BottomSheet/Footer.d.ts +0 -0
- package/types/components/BottomSheet/Header.d.ts +0 -0
- package/types/components/BottomSheet/ScrollView.d.ts +0 -0
- package/types/components/BottomSheet/StyledBottomSheet.d.ts +0 -0
- package/types/components/BottomSheet/index.d.ts +0 -0
- package/types/components/Box/StyledBox.d.ts +0 -0
- package/types/components/Box/config.d.ts +0 -0
- package/types/components/Box/index.d.ts +0 -0
- package/types/components/Box/types.d.ts +0 -0
- package/types/components/Button/Button.d.ts +0 -0
- package/types/components/Button/IconButton.d.ts +0 -0
- package/types/components/Button/LoadingIndicator/StyledLoadingIndicator.d.ts +0 -0
- package/types/components/Button/LoadingIndicator/index.d.ts +0 -0
- package/types/components/Button/StyledButton.d.ts +0 -0
- package/types/components/Button/UtilityButton/StyledUtilityButton.d.ts +0 -0
- package/types/components/Button/UtilityButton/index.d.ts +0 -0
- package/types/components/Button/index.d.ts +0 -0
- package/types/components/Calendar/CalendarRowItem.d.ts +0 -0
- package/types/components/Calendar/StyledCalendar.d.ts +0 -0
- package/types/components/Calendar/helpers.d.ts +0 -0
- package/types/components/Calendar/index.d.ts +2 -1
- package/types/components/Card/DataCard/StyledDataCard.d.ts +0 -0
- package/types/components/Card/DataCard/index.d.ts +0 -0
- package/types/components/Card/StyledCard.d.ts +0 -0
- package/types/components/Card/index.d.ts +0 -0
- package/types/components/Carousel/CardCarousel.d.ts +0 -0
- package/types/components/Carousel/CarouselItem.d.ts +0 -0
- package/types/components/Carousel/StyledCardCarousel.d.ts +0 -0
- package/types/components/Carousel/StyledCarousel.d.ts +0 -0
- package/types/components/Carousel/contants.d.ts +0 -0
- package/types/components/Carousel/index.d.ts +0 -0
- package/types/components/Carousel/types.d.ts +0 -0
- package/types/components/Checkbox/StyledCheckbox.d.ts +0 -0
- package/types/components/Checkbox/index.d.ts +0 -0
- package/types/components/Collapse/StyledCollapse.d.ts +0 -0
- package/types/components/Collapse/index.d.ts +0 -0
- package/types/components/ContentNavigator/StyledContentNavigator.d.ts +0 -0
- package/types/components/ContentNavigator/index.d.ts +0 -0
- package/types/components/DatePicker/DatePickerAndroid.d.ts +0 -0
- package/types/components/DatePicker/DatePickerCalendar.d.ts +0 -0
- package/types/components/DatePicker/DatePickerIOS.d.ts +0 -0
- package/types/components/DatePicker/StyledDatePicker.d.ts +0 -0
- package/types/components/DatePicker/index.d.ts +0 -0
- package/types/components/DatePicker/types.d.ts +0 -0
- package/types/components/Divider/StyledDivider.d.ts +0 -0
- package/types/components/Divider/index.d.ts +0 -0
- package/types/components/Drawer/DragableDrawer/helpers.d.ts +0 -0
- package/types/components/Drawer/DragableDrawer/index.d.ts +0 -0
- package/types/components/Drawer/StyledDrawer.d.ts +0 -0
- package/types/components/Drawer/index.d.ts +0 -0
- package/types/components/Empty/StyledEmpty.d.ts +0 -0
- package/types/components/Empty/index.d.ts +0 -0
- package/types/components/Error/StyledError.d.ts +0 -0
- package/types/components/Error/index.d.ts +0 -0
- package/types/components/FAB/ActionGroup/ActionItem.d.ts +0 -0
- package/types/components/FAB/ActionGroup/StyledActionGroup.d.ts +0 -0
- package/types/components/FAB/ActionGroup/StyledActionItem.d.ts +0 -0
- package/types/components/FAB/ActionGroup/index.d.ts +0 -0
- package/types/components/FAB/AnimatedFABIcon.d.ts +0 -0
- package/types/components/FAB/FAB.d.ts +0 -0
- package/types/components/FAB/StyledFAB.d.ts +0 -0
- package/types/components/FAB/index.d.ts +0 -3
- package/types/components/Icon/AnimatedIcon.d.ts +0 -0
- package/types/components/Icon/HeroIcon/index.d.ts +0 -0
- package/types/components/Icon/IconList.d.ts +0 -0
- package/types/components/Icon/index.d.ts +0 -0
- package/types/components/Icon/utils.d.ts +0 -0
- package/types/components/Image/index.d.ts +0 -0
- package/types/components/List/BasicListItem.d.ts +0 -0
- package/types/components/List/ListItem.d.ts +0 -0
- package/types/components/List/StyledBasicListItem.d.ts +0 -0
- package/types/components/List/StyledListItem.d.ts +0 -0
- package/types/components/List/index.d.ts +0 -0
- package/types/components/PageControl/StyledPageControl.d.ts +0 -0
- package/types/components/PageControl/index.d.ts +0 -0
- package/types/components/PinInput/PinCell.d.ts +0 -0
- package/types/components/PinInput/StyledPinInput.d.ts +0 -0
- package/types/components/PinInput/index.d.ts +0 -0
- package/types/components/Portal/PortalHost.d.ts +5 -0
- package/types/components/Portal/PortalProvider.d.ts +7 -0
- package/types/components/Portal/constants.d.ts +8 -0
- package/types/components/Portal/contexts.d.ts +9 -0
- package/types/components/Portal/index.d.ts +13 -0
- package/types/components/Portal/reducer.d.ts +5 -0
- package/types/components/Portal/types.d.ts +22 -0
- package/types/components/Portal/usePortal.d.ts +8 -0
- package/types/components/Portal/usePortalState.d.ts +1 -0
- package/types/components/Progress/ProgressBar.d.ts +0 -0
- package/types/components/Progress/ProgressCircle.d.ts +0 -0
- package/types/components/Progress/StyledProgressBar.d.ts +0 -0
- package/types/components/Progress/StyledProgressCircle.d.ts +0 -0
- package/types/components/Progress/__tests__/index.spec.d.ts +0 -0
- package/types/components/Progress/constants.d.ts +0 -0
- package/types/components/Progress/index.d.ts +0 -0
- package/types/components/Progress/types.d.ts +0 -0
- package/types/components/Radio/Radio.d.ts +0 -0
- package/types/components/Radio/RadioGroup.d.ts +0 -0
- package/types/components/Radio/StyledRadio.d.ts +0 -0
- package/types/components/Radio/index.d.ts +0 -0
- package/types/components/Radio/types.d.ts +0 -0
- package/types/components/RefreshControl/index.d.ts +0 -0
- package/types/components/RichTextEditor/EditorEvent.d.ts +0 -0
- package/types/components/RichTextEditor/EditorToolbar.d.ts +0 -0
- package/types/components/RichTextEditor/MentionList.d.ts +0 -0
- package/types/components/RichTextEditor/RichTextEditor.d.ts +0 -0
- package/types/components/RichTextEditor/StyledRichTextEditor.d.ts +0 -0
- package/types/components/RichTextEditor/StyledToolbar.d.ts +0 -0
- package/types/components/RichTextEditor/__mocks__/heroEditorApp.d.ts +0 -0
- package/types/components/RichTextEditor/constants.d.ts +0 -0
- package/types/components/RichTextEditor/heroEditorApp.d.ts +0 -0
- package/types/components/RichTextEditor/index.d.ts +0 -0
- package/types/components/RichTextEditor/types.d.ts +0 -0
- package/types/components/RichTextEditor/utils/events.d.ts +0 -0
- package/types/components/RichTextEditor/utils/rnWebView.d.ts +0 -0
- package/types/components/SectionHeading/StyledHeading.d.ts +0 -0
- package/types/components/SectionHeading/index.d.ts +0 -0
- package/types/components/Select/BaseOptionList.d.ts +0 -0
- package/types/components/Select/Footer.d.ts +0 -0
- package/types/components/Select/MultiSelect/Option.d.ts +0 -0
- package/types/components/Select/MultiSelect/OptionList.d.ts +0 -0
- package/types/components/Select/MultiSelect/index.d.ts +0 -0
- package/types/components/Select/SingleSelect/Option.d.ts +0 -0
- package/types/components/Select/SingleSelect/OptionList.d.ts +0 -0
- package/types/components/Select/SingleSelect/StyledSingleSelect.d.ts +0 -0
- package/types/components/Select/SingleSelect/index.d.ts +0 -0
- package/types/components/Select/StyledSelect.d.ts +0 -0
- package/types/components/Select/helpers.d.ts +0 -0
- package/types/components/Select/index.d.ts +0 -0
- package/types/components/Select/types.d.ts +0 -0
- package/types/components/Skeleton/StyledSkeleton.d.ts +0 -0
- package/types/components/Skeleton/index.d.ts +0 -0
- package/types/components/Slider/index.d.ts +0 -0
- package/types/components/Spinner/AnimatedSpinner.d.ts +0 -0
- package/types/components/Spinner/StyledSpinner.d.ts +0 -0
- package/types/components/Spinner/index.d.ts +0 -0
- package/types/components/Success/StyledSuccess.d.ts +0 -0
- package/types/components/Success/index.d.ts +0 -0
- package/types/components/Swipeable/StyledSwipeable.d.ts +0 -0
- package/types/components/Swipeable/SwipeableAction.d.ts +0 -0
- package/types/components/Swipeable/index.d.ts +1 -1
- package/types/components/Switch/SelectorSwitch/Option.d.ts +0 -0
- package/types/components/Switch/SelectorSwitch/StyledSelectorSwitch.d.ts +0 -0
- package/types/components/Switch/SelectorSwitch/index.d.ts +0 -0
- package/types/components/Switch/StyledSwitch.d.ts +0 -0
- package/types/components/Switch/index.d.ts +0 -0
- package/types/components/Tabs/ActiveTabIndicator.d.ts +0 -0
- package/types/components/Tabs/SceneView.d.ts +0 -0
- package/types/components/Tabs/ScrollableTabs.d.ts +0 -0
- package/types/components/Tabs/ScrollableTabsHeader.d.ts +0 -0
- package/types/components/Tabs/StyledScrollableTabs.d.ts +0 -0
- package/types/components/Tabs/StyledTabs.d.ts +0 -0
- package/types/components/Tabs/TabWithBadge.d.ts +0 -0
- package/types/components/Tabs/index.d.ts +0 -0
- package/types/components/Tabs/useIsFocused.d.ts +0 -0
- package/types/components/Tabs/utils.d.ts +0 -0
- package/types/components/Tag/StyledTag.d.ts +1 -4
- package/types/components/Tag/index.d.ts +1 -0
- package/types/components/TextInput/StyledTextInput.d.ts +0 -0
- package/types/components/TextInput/index.d.ts +0 -0
- package/types/components/TimePicker/StyledTimePicker.d.ts +0 -0
- package/types/components/TimePicker/TimePickerAndroid.d.ts +0 -0
- package/types/components/TimePicker/TimePickerIOS.d.ts +0 -0
- package/types/components/TimePicker/index.d.ts +0 -0
- package/types/components/TimePicker/types.d.ts +0 -0
- package/types/components/Toast/StyledToast.d.ts +0 -0
- package/types/components/Toast/Toast.d.ts +0 -0
- package/types/components/Toast/ToastContainer.d.ts +0 -0
- package/types/components/Toast/ToastContext.d.ts +0 -0
- package/types/components/Toast/ToastProvider.d.ts +0 -0
- package/types/components/Toast/index.d.ts +0 -0
- package/types/components/Toast/types.d.ts +0 -0
- package/types/components/Toolbar/StyledToolbar.d.ts +0 -0
- package/types/components/Toolbar/ToolbarGroup.d.ts +0 -0
- package/types/components/Toolbar/ToolbarItem.d.ts +0 -0
- package/types/components/Toolbar/index.d.ts +0 -0
- package/types/components/Typography/Text/StyledText.d.ts +0 -0
- package/types/components/Typography/Text/index.d.ts +0 -0
- package/types/components/Typography/index.d.ts +0 -0
- package/types/index.d.ts +2 -2
- package/types/testHelpers/renderWithTheme.d.ts +0 -0
- package/types/theme/ThemeProvider.d.ts +0 -0
- package/types/theme/ThemeSwitcher.d.ts +0 -0
- package/types/theme/components/accordion.d.ts +0 -0
- package/types/theme/components/alert.d.ts +0 -0
- package/types/theme/components/attachment.d.ts +0 -0
- package/types/theme/components/avatar.d.ts +0 -0
- package/types/theme/components/badge.d.ts +0 -0
- package/types/theme/components/bottomNavigation.d.ts +0 -0
- package/types/theme/components/bottomSheet.d.ts +0 -0
- package/types/theme/components/button.d.ts +0 -0
- package/types/theme/components/calendar.d.ts +0 -0
- package/types/theme/components/card.d.ts +0 -0
- package/types/theme/components/cardCarousel.d.ts +0 -0
- package/types/theme/components/carousel.d.ts +0 -0
- package/types/theme/components/checkbox.d.ts +0 -0
- package/types/theme/components/contentNavigator.d.ts +0 -0
- package/types/theme/components/datePicker.d.ts +0 -0
- package/types/theme/components/divider.d.ts +0 -0
- package/types/theme/components/drawer.d.ts +0 -0
- package/types/theme/components/empty.d.ts +0 -0
- package/types/theme/components/error.d.ts +0 -0
- package/types/theme/components/fab.d.ts +0 -0
- package/types/theme/components/icon.d.ts +0 -0
- package/types/theme/components/image.d.ts +0 -0
- package/types/theme/components/list.d.ts +0 -0
- package/types/theme/components/pageControl.d.ts +0 -0
- package/types/theme/components/pinInput.d.ts +0 -0
- package/types/theme/components/progress.d.ts +0 -0
- package/types/theme/components/radio.d.ts +0 -0
- package/types/theme/components/refreshControl.d.ts +0 -0
- package/types/theme/components/richTextEditor.d.ts +0 -0
- package/types/theme/components/sectionHeading.d.ts +0 -0
- package/types/theme/components/select.d.ts +0 -0
- package/types/theme/components/skeleton.d.ts +0 -0
- package/types/theme/components/slider.d.ts +0 -0
- package/types/theme/components/spinner.d.ts +0 -0
- package/types/theme/components/success.d.ts +0 -0
- package/types/theme/components/swipeable.d.ts +3 -0
- package/types/theme/components/switch.d.ts +1 -1
- package/types/theme/components/tabs.d.ts +0 -0
- package/types/theme/components/tag.d.ts +1 -1
- package/types/theme/components/textInput.d.ts +0 -0
- package/types/theme/components/timePicker.d.ts +0 -0
- package/types/theme/components/toast.d.ts +0 -0
- package/types/theme/components/toolbar.d.ts +0 -0
- package/types/theme/components/typography.d.ts +0 -0
- package/types/theme/getTheme.d.ts +0 -0
- package/types/theme/global/borders.d.ts +0 -0
- package/types/theme/global/colors/eBens.d.ts +0 -0
- package/types/theme/global/colors/global.d.ts +0 -0
- package/types/theme/global/colors/globalDark.d.ts +0 -0
- package/types/theme/global/colors/jobs.d.ts +0 -0
- package/types/theme/global/colors/swag.d.ts +0 -0
- package/types/theme/global/colors/swagDark.d.ts +0 -0
- package/types/theme/global/colors/types.d.ts +0 -0
- package/types/theme/global/colors/wallet.d.ts +0 -0
- package/types/theme/global/colors/work.d.ts +0 -0
- package/types/theme/global/index.d.ts +0 -0
- package/types/theme/global/scale.d.ts +0 -0
- package/types/theme/global/sizes.d.ts +0 -0
- package/types/theme/global/space.d.ts +0 -0
- package/types/theme/global/typography.d.ts +0 -0
- package/types/theme/index.d.ts +0 -0
- package/types/types.d.ts +0 -0
- package/types/utils/functions.d.ts +0 -0
- package/types/utils/helpers.d.ts +0 -0
- package/types/utils/hooks.d.ts +0 -0
- package/types/utils/scale.d.ts +0 -0
- package/.tool-versions +0 -1
- package/.turbo/turbo-build:types.log +0 -9
- package/.turbo/turbo-lint.log +0 -163
- package/.turbo/turbo-test.log +0 -725
- package/.turbo/turbo-type-check.log +0 -1
- package/types/components/FAB/ActionGroup/FABModal.d.ts +0 -21
- package/types/components/FAB/ActionGroup/FABModalContentWrapper.d.ts +0 -18
- package/types/components/FAB/ActionGroup/FABProvider.d.ts +0 -5
- package/types/components/FAB/ActionGroup/ModalPresenter/ModalPresenter.d.ts +0 -34
- package/types/components/FAB/ActionGroup/ModalPresenter/index.d.ts +0 -3
- package/types/components/Tabs/ScrollableTabsV2/SceneView.d.ts +0 -10
- package/types/components/Tabs/ScrollableTabsV2/ScrollableTabsV2.d.ts +0 -9
- package/types/components/Tabs/ScrollableTabsV2/index.d.ts +0 -4
|
@@ -102,7 +102,7 @@ exports[`PinCell renders correctly when focused is false, state is error 1`] = `
|
|
|
102
102
|
Array [
|
|
103
103
|
Object {
|
|
104
104
|
"alignItems": "center",
|
|
105
|
-
"borderColor": "#
|
|
105
|
+
"borderColor": "#cb300a",
|
|
106
106
|
"borderRadius": 8,
|
|
107
107
|
"borderWidth": 1,
|
|
108
108
|
"height": 48,
|
|
@@ -128,7 +128,7 @@ exports[`PinCell renders correctly when focused is false, state is error 1`] = `
|
|
|
128
128
|
},
|
|
129
129
|
Array [
|
|
130
130
|
Object {
|
|
131
|
-
"color": "#
|
|
131
|
+
"color": "#cb300a",
|
|
132
132
|
},
|
|
133
133
|
undefined,
|
|
134
134
|
],
|
|
@@ -198,7 +198,7 @@ exports[`PinCell renders correctly when focused is true, state is error 1`] = `
|
|
|
198
198
|
Array [
|
|
199
199
|
Object {
|
|
200
200
|
"alignItems": "center",
|
|
201
|
-
"borderColor": "#
|
|
201
|
+
"borderColor": "#cb300a",
|
|
202
202
|
"borderRadius": 8,
|
|
203
203
|
"borderWidth": 2,
|
|
204
204
|
"height": 48,
|
|
@@ -224,7 +224,7 @@ exports[`PinCell renders correctly when focused is true, state is error 1`] = `
|
|
|
224
224
|
},
|
|
225
225
|
Array [
|
|
226
226
|
Object {
|
|
227
|
-
"color": "#
|
|
227
|
+
"color": "#cb300a",
|
|
228
228
|
},
|
|
229
229
|
undefined,
|
|
230
230
|
],
|
|
@@ -822,7 +822,7 @@ exports[`rendering renders correctly when there is error 1`] = `
|
|
|
822
822
|
Array [
|
|
823
823
|
Object {
|
|
824
824
|
"alignItems": "center",
|
|
825
|
-
"borderColor": "#
|
|
825
|
+
"borderColor": "#cb300a",
|
|
826
826
|
"borderRadius": 8,
|
|
827
827
|
"borderWidth": 1,
|
|
828
828
|
"height": 48,
|
|
@@ -839,8 +839,8 @@ exports[`rendering renders correctly when there is error 1`] = `
|
|
|
839
839
|
style={
|
|
840
840
|
Array [
|
|
841
841
|
Object {
|
|
842
|
-
"backgroundColor": "#
|
|
843
|
-
"borderColor": "#
|
|
842
|
+
"backgroundColor": "#cb300a",
|
|
843
|
+
"borderColor": "#cb300a",
|
|
844
844
|
"borderRadius": 999,
|
|
845
845
|
"borderWidth": 1,
|
|
846
846
|
"height": 16,
|
|
@@ -868,7 +868,7 @@ exports[`rendering renders correctly when there is error 1`] = `
|
|
|
868
868
|
Array [
|
|
869
869
|
Object {
|
|
870
870
|
"alignItems": "center",
|
|
871
|
-
"borderColor": "#
|
|
871
|
+
"borderColor": "#cb300a",
|
|
872
872
|
"borderRadius": 8,
|
|
873
873
|
"borderWidth": 1,
|
|
874
874
|
"height": 48,
|
|
@@ -885,8 +885,8 @@ exports[`rendering renders correctly when there is error 1`] = `
|
|
|
885
885
|
style={
|
|
886
886
|
Array [
|
|
887
887
|
Object {
|
|
888
|
-
"backgroundColor": "#
|
|
889
|
-
"borderColor": "#
|
|
888
|
+
"backgroundColor": "#cb300a",
|
|
889
|
+
"borderColor": "#cb300a",
|
|
890
890
|
"borderRadius": 999,
|
|
891
891
|
"borderWidth": 1,
|
|
892
892
|
"height": 16,
|
|
@@ -914,7 +914,7 @@ exports[`rendering renders correctly when there is error 1`] = `
|
|
|
914
914
|
Array [
|
|
915
915
|
Object {
|
|
916
916
|
"alignItems": "center",
|
|
917
|
-
"borderColor": "#
|
|
917
|
+
"borderColor": "#cb300a",
|
|
918
918
|
"borderRadius": 8,
|
|
919
919
|
"borderWidth": 1,
|
|
920
920
|
"height": 48,
|
|
@@ -931,7 +931,7 @@ exports[`rendering renders correctly when there is error 1`] = `
|
|
|
931
931
|
style={
|
|
932
932
|
Array [
|
|
933
933
|
Object {
|
|
934
|
-
"borderColor": "#
|
|
934
|
+
"borderColor": "#cb300a",
|
|
935
935
|
"borderRadius": 999,
|
|
936
936
|
"borderWidth": 1,
|
|
937
937
|
"height": 16,
|
|
@@ -959,7 +959,7 @@ exports[`rendering renders correctly when there is error 1`] = `
|
|
|
959
959
|
Array [
|
|
960
960
|
Object {
|
|
961
961
|
"alignItems": "center",
|
|
962
|
-
"borderColor": "#
|
|
962
|
+
"borderColor": "#cb300a",
|
|
963
963
|
"borderRadius": 8,
|
|
964
964
|
"borderWidth": 1,
|
|
965
965
|
"height": 48,
|
|
@@ -976,7 +976,7 @@ exports[`rendering renders correctly when there is error 1`] = `
|
|
|
976
976
|
style={
|
|
977
977
|
Array [
|
|
978
978
|
Object {
|
|
979
|
-
"borderColor": "#
|
|
979
|
+
"borderColor": "#cb300a",
|
|
980
980
|
"borderRadius": 999,
|
|
981
981
|
"borderWidth": 1,
|
|
982
982
|
"height": 16,
|
|
@@ -1007,7 +1007,7 @@ exports[`rendering renders correctly when there is error 1`] = `
|
|
|
1007
1007
|
style={
|
|
1008
1008
|
Array [
|
|
1009
1009
|
Object {
|
|
1010
|
-
"color": "#
|
|
1010
|
+
"color": "#cb300a",
|
|
1011
1011
|
"fontSize": 16,
|
|
1012
1012
|
},
|
|
1013
1013
|
undefined,
|
|
@@ -1030,7 +1030,7 @@ exports[`rendering renders correctly when there is error 1`] = `
|
|
|
1030
1030
|
},
|
|
1031
1031
|
Array [
|
|
1032
1032
|
Object {
|
|
1033
|
-
"color": "#
|
|
1033
|
+
"color": "#cb300a",
|
|
1034
1034
|
"paddingLeft": 4,
|
|
1035
1035
|
},
|
|
1036
1036
|
undefined,
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React, { memo, useEffect } from 'react';
|
|
2
|
+
import { usePortal } from './usePortal';
|
|
3
|
+
import { usePortalState } from './usePortalState';
|
|
4
|
+
import { PortalType } from './contexts';
|
|
5
|
+
|
|
6
|
+
export interface PortalHostProps {
|
|
7
|
+
name: string;
|
|
8
|
+
}
|
|
9
|
+
const PortalHostComponent = ({ name }: PortalHostProps) => {
|
|
10
|
+
const state = usePortalState(name);
|
|
11
|
+
const { registerHost, deregisterHost } = usePortal(name);
|
|
12
|
+
|
|
13
|
+
useEffect(() => {
|
|
14
|
+
registerHost();
|
|
15
|
+
return () => {
|
|
16
|
+
deregisterHost();
|
|
17
|
+
};
|
|
18
|
+
}, []);
|
|
19
|
+
|
|
20
|
+
return <>{state.map((item: PortalType) => item.node)}</>;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export const PortalHost = memo(PortalHostComponent);
|
|
24
|
+
PortalHost.displayName = 'PortalHost';
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React, { memo, useReducer } from 'react';
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
import { PortalHost } from './PortalHost';
|
|
4
|
+
import { reducer } from './reducer';
|
|
5
|
+
import { INITIAL_STATE } from './constants';
|
|
6
|
+
import { PortalDispatchContext, PortalStateContext } from './contexts';
|
|
7
|
+
|
|
8
|
+
export interface PortalProviderProps {
|
|
9
|
+
rootHostName?: string;
|
|
10
|
+
children: ReactNode | ReactNode[];
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const PortalProviderComponent = ({
|
|
14
|
+
rootHostName = 'root',
|
|
15
|
+
children,
|
|
16
|
+
}: PortalProviderProps) => {
|
|
17
|
+
const [state, dispatch] = useReducer(reducer, INITIAL_STATE);
|
|
18
|
+
return (
|
|
19
|
+
<PortalDispatchContext.Provider value={dispatch}>
|
|
20
|
+
<PortalStateContext.Provider value={state}>
|
|
21
|
+
{children}
|
|
22
|
+
<PortalHost name={rootHostName} />
|
|
23
|
+
</PortalStateContext.Provider>
|
|
24
|
+
</PortalDispatchContext.Provider>
|
|
25
|
+
);
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const PortalProvider = memo(PortalProviderComponent);
|
|
29
|
+
PortalProvider.displayName = 'PortalProvider';
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import React, { useContext } from 'react';
|
|
2
|
+
import { waitFor } from '@testing-library/react-native';
|
|
3
|
+
import { PortalHost } from '../PortalHost';
|
|
4
|
+
import { PortalProvider } from '../PortalProvider';
|
|
5
|
+
import Typography from '../../Typography';
|
|
6
|
+
import renderWithTheme from '../../../testHelpers/renderWithTheme';
|
|
7
|
+
import { PortalStateContext } from '../contexts';
|
|
8
|
+
import theme, { ThemeProvider } from '../../../theme';
|
|
9
|
+
|
|
10
|
+
/*
|
|
11
|
+
* This component is used to test the PortalHost hook
|
|
12
|
+
*/
|
|
13
|
+
const TestComponent = () => {
|
|
14
|
+
const state = useContext(PortalStateContext);
|
|
15
|
+
|
|
16
|
+
const text = 'host' in state! ? 'registered' : 'unregistered';
|
|
17
|
+
return <Typography.Body>{text}</Typography.Body>;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
describe('PortalHost', () => {
|
|
21
|
+
it('should register portal when mount', async () => {
|
|
22
|
+
const { getByText } = renderWithTheme(
|
|
23
|
+
<PortalProvider>
|
|
24
|
+
<PortalHost name="host" />
|
|
25
|
+
<TestComponent />
|
|
26
|
+
</PortalProvider>
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
expect(getByText('registered')).toBeDefined();
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('should unregister portal when unmount', async () => {
|
|
33
|
+
const { getByText, rerender } = renderWithTheme(
|
|
34
|
+
<PortalProvider>
|
|
35
|
+
<PortalHost name="host" />
|
|
36
|
+
<TestComponent />
|
|
37
|
+
</PortalProvider>
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
rerender(
|
|
41
|
+
<ThemeProvider theme={theme}>
|
|
42
|
+
<PortalProvider>
|
|
43
|
+
<TestComponent />
|
|
44
|
+
</PortalProvider>
|
|
45
|
+
</ThemeProvider>
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
await waitFor(() => expect(getByText('unregistered')).toBeDefined());
|
|
49
|
+
});
|
|
50
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React, { useContext } from 'react';
|
|
2
|
+
import { PortalStateContext } from '../contexts';
|
|
3
|
+
import Typography from '../../Typography';
|
|
4
|
+
import renderWithTheme from '../../../testHelpers/renderWithTheme';
|
|
5
|
+
import { PortalProvider } from '../PortalProvider';
|
|
6
|
+
|
|
7
|
+
const TestComponent = () => {
|
|
8
|
+
const state = useContext(PortalStateContext);
|
|
9
|
+
|
|
10
|
+
const text = 'root' in state! ? 'registered' : 'unregistered';
|
|
11
|
+
return <Typography.Body>{text}</Typography.Body>;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
describe('PortalProvider', () => {
|
|
15
|
+
it('should register root portal when mount', async () => {
|
|
16
|
+
const { getByText } = renderWithTheme(
|
|
17
|
+
<PortalProvider>
|
|
18
|
+
<TestComponent />
|
|
19
|
+
</PortalProvider>
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
expect(getByText('registered')).toBeDefined();
|
|
23
|
+
});
|
|
24
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { View } from 'react-native';
|
|
3
|
+
import { waitFor, within } from '@testing-library/react-native';
|
|
4
|
+
import renderWithTheme from '../../../testHelpers/renderWithTheme';
|
|
5
|
+
import { PortalHost } from '../PortalHost';
|
|
6
|
+
import { PortalProvider } from '../PortalProvider';
|
|
7
|
+
import Typography from '../../Typography';
|
|
8
|
+
import Portal from '..';
|
|
9
|
+
|
|
10
|
+
describe('Portal', () => {
|
|
11
|
+
it('should render Typography inside Portal.Host', async () => {
|
|
12
|
+
const { getByTestId } = renderWithTheme(
|
|
13
|
+
<PortalProvider>
|
|
14
|
+
<View testID="portal-wrapper">
|
|
15
|
+
<PortalHost name="host" />
|
|
16
|
+
</View>
|
|
17
|
+
<Portal hostName="host">
|
|
18
|
+
<Typography.Body>portal</Typography.Body>;
|
|
19
|
+
</Portal>
|
|
20
|
+
</PortalProvider>
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
await waitFor(() =>
|
|
24
|
+
expect(
|
|
25
|
+
within(getByTestId('portal-wrapper')).getByText('portal')
|
|
26
|
+
).toBeDefined()
|
|
27
|
+
);
|
|
28
|
+
});
|
|
29
|
+
});
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import Typography from '../../Typography';
|
|
3
|
+
import { ACTIONS, INITIAL_STATE } from '../constants';
|
|
4
|
+
import { reducer } from '../reducer';
|
|
5
|
+
|
|
6
|
+
describe('reducers', () => {
|
|
7
|
+
describe('registerHost', () => {
|
|
8
|
+
it('should return correct state', () => {
|
|
9
|
+
const newState = reducer(INITIAL_STATE, {
|
|
10
|
+
type: ACTIONS.REGISTER_HOST,
|
|
11
|
+
hostName: 'host',
|
|
12
|
+
});
|
|
13
|
+
expect(newState).toEqual({
|
|
14
|
+
host: [],
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
describe('deregisterHost', () => {
|
|
20
|
+
it('should return correct state', () => {
|
|
21
|
+
const newState = reducer(
|
|
22
|
+
{
|
|
23
|
+
removedHost: [],
|
|
24
|
+
host: [],
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
type: ACTIONS.DEREGISTER_HOST,
|
|
28
|
+
hostName: 'removedHost',
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
expect(newState).toEqual({
|
|
32
|
+
host: [],
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
describe('addUpdatePortal', () => {
|
|
38
|
+
it('should return correct state', () => {
|
|
39
|
+
const newState = reducer(
|
|
40
|
+
{
|
|
41
|
+
host: [],
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
type: ACTIONS.ADD_UPDATE_PORTAL,
|
|
45
|
+
hostName: 'host',
|
|
46
|
+
portalName: 'portal',
|
|
47
|
+
node: <Typography.Body>Portal</Typography.Body>,
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
expect(newState).toEqual({
|
|
51
|
+
host: [
|
|
52
|
+
{
|
|
53
|
+
name: 'portal',
|
|
54
|
+
node: <Typography.Body>Portal</Typography.Body>,
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('should new portal when the portal is existing', () => {
|
|
61
|
+
const newState = reducer(
|
|
62
|
+
{
|
|
63
|
+
host: [
|
|
64
|
+
{
|
|
65
|
+
name: 'portal',
|
|
66
|
+
node: <Typography.Body>Old Portal</Typography.Body>,
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
type: ACTIONS.ADD_UPDATE_PORTAL,
|
|
72
|
+
hostName: 'host',
|
|
73
|
+
portalName: 'portal',
|
|
74
|
+
node: <Typography.Body>New Portal</Typography.Body>,
|
|
75
|
+
}
|
|
76
|
+
);
|
|
77
|
+
expect(newState).toEqual({
|
|
78
|
+
host: [
|
|
79
|
+
{
|
|
80
|
+
name: 'portal',
|
|
81
|
+
node: <Typography.Body>New Portal</Typography.Body>,
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
describe('removePortal', () => {
|
|
89
|
+
it('should return correct state', () => {
|
|
90
|
+
const newState = reducer(
|
|
91
|
+
{
|
|
92
|
+
host: [
|
|
93
|
+
{
|
|
94
|
+
name: 'portal',
|
|
95
|
+
node: <Typography.Body>Portal</Typography.Body>,
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
type: ACTIONS.REMOVE_PORTAL,
|
|
101
|
+
hostName: 'host',
|
|
102
|
+
portalName: 'portal',
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
expect(newState).toEqual({
|
|
106
|
+
host: [],
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React, { createContext } from 'react';
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
import { ActionTypes } from './types';
|
|
4
|
+
|
|
5
|
+
export interface PortalType {
|
|
6
|
+
name: string;
|
|
7
|
+
node: ReactNode;
|
|
8
|
+
}
|
|
9
|
+
export const PortalStateContext = createContext<Record<
|
|
10
|
+
string,
|
|
11
|
+
Array<PortalType>
|
|
12
|
+
> | null>(null);
|
|
13
|
+
export const PortalDispatchContext =
|
|
14
|
+
createContext<React.Dispatch<ActionTypes> | null>(null);
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ReactNode, memo, useLayoutEffect, useMemo } from 'react';
|
|
2
|
+
// Fix issue no crypto in react-native
|
|
3
|
+
// https://stackoverflow.com/a/66852908
|
|
4
|
+
import { customAlphabet } from 'nanoid/non-secure';
|
|
5
|
+
import { usePortal } from './usePortal';
|
|
6
|
+
import { PortalProvider } from './PortalProvider';
|
|
7
|
+
import { PortalHost } from './PortalHost';
|
|
8
|
+
|
|
9
|
+
const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyz0123456789', 10);
|
|
10
|
+
|
|
11
|
+
export interface PortalProps {
|
|
12
|
+
name?: string;
|
|
13
|
+
hostName?: string;
|
|
14
|
+
children?: ReactNode | ReactNode[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const PortalComponent = ({ name, hostName, children }: PortalProps) => {
|
|
18
|
+
const { addPortal: addUpdatePortal, removePortal } = usePortal(hostName);
|
|
19
|
+
|
|
20
|
+
const nameOrRandom = useMemo(() => name || nanoid(), [name]);
|
|
21
|
+
|
|
22
|
+
useLayoutEffect(() => {
|
|
23
|
+
addUpdatePortal(nameOrRandom, children);
|
|
24
|
+
return () => {
|
|
25
|
+
removePortal(nameOrRandom);
|
|
26
|
+
};
|
|
27
|
+
}, [addUpdatePortal]);
|
|
28
|
+
|
|
29
|
+
useLayoutEffect(() => {
|
|
30
|
+
addUpdatePortal(nameOrRandom, children);
|
|
31
|
+
}, [children]);
|
|
32
|
+
|
|
33
|
+
return null;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const Portal = memo(PortalComponent);
|
|
37
|
+
Portal.displayName = 'Portal';
|
|
38
|
+
|
|
39
|
+
export default Object.assign(Portal, {
|
|
40
|
+
Provider: PortalProvider,
|
|
41
|
+
Host: PortalHost,
|
|
42
|
+
});
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { omit } from '../../utils/helpers';
|
|
2
|
+
import { ACTIONS } from './constants';
|
|
3
|
+
import { PortalType } from './contexts';
|
|
4
|
+
import type {
|
|
5
|
+
ActionTypes,
|
|
6
|
+
AddUpdatePortalAction,
|
|
7
|
+
RemovePortalAction,
|
|
8
|
+
} from './types';
|
|
9
|
+
|
|
10
|
+
type State = Record<string, Array<PortalType>>;
|
|
11
|
+
|
|
12
|
+
const registerHostIfNotExist = (state: State, hostName: string): State => {
|
|
13
|
+
if (!(hostName in state)) {
|
|
14
|
+
return {
|
|
15
|
+
...state,
|
|
16
|
+
[hostName]: [],
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
return { ...state };
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const deregisterHost = (state: State, hostName: string): State => {
|
|
23
|
+
return { ...omit([hostName], state) };
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const addUpdatePortal = (
|
|
27
|
+
state: Record<string, Array<PortalType>>,
|
|
28
|
+
hostName: string,
|
|
29
|
+
portalName: string,
|
|
30
|
+
node: React.ReactNode
|
|
31
|
+
) => {
|
|
32
|
+
const newState = registerHostIfNotExist(state, hostName);
|
|
33
|
+
|
|
34
|
+
const index = newState[hostName].findIndex(
|
|
35
|
+
(item) => item.name === portalName
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
if (index !== -1) {
|
|
39
|
+
return {
|
|
40
|
+
...newState,
|
|
41
|
+
[hostName]: newState[hostName].map((item, i) => {
|
|
42
|
+
if (index === i) {
|
|
43
|
+
return {
|
|
44
|
+
...item,
|
|
45
|
+
node,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return item;
|
|
49
|
+
}),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
...newState,
|
|
55
|
+
[hostName]: [
|
|
56
|
+
...newState[hostName],
|
|
57
|
+
{
|
|
58
|
+
name: portalName,
|
|
59
|
+
node,
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const removePortal = (
|
|
66
|
+
state: Record<string, Array<PortalType>>,
|
|
67
|
+
hostName: string,
|
|
68
|
+
portalName: string
|
|
69
|
+
) => {
|
|
70
|
+
if (!(hostName in state)) {
|
|
71
|
+
return { ...state };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
...state,
|
|
76
|
+
[hostName]: state[hostName].filter((item) => item.name !== portalName),
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
export const reducer = (
|
|
81
|
+
state: Record<string, Array<PortalType>>,
|
|
82
|
+
action: ActionTypes
|
|
83
|
+
) => {
|
|
84
|
+
const { type } = action;
|
|
85
|
+
switch (type) {
|
|
86
|
+
case ACTIONS.REGISTER_HOST:
|
|
87
|
+
return registerHostIfNotExist(state, action.hostName);
|
|
88
|
+
case ACTIONS.DEREGISTER_HOST:
|
|
89
|
+
return deregisterHost(state, action.hostName);
|
|
90
|
+
case ACTIONS.ADD_UPDATE_PORTAL:
|
|
91
|
+
return addUpdatePortal(
|
|
92
|
+
state,
|
|
93
|
+
action.hostName,
|
|
94
|
+
(action as AddUpdatePortalAction).portalName,
|
|
95
|
+
(action as AddUpdatePortalAction).node
|
|
96
|
+
);
|
|
97
|
+
case ACTIONS.REMOVE_PORTAL:
|
|
98
|
+
return removePortal(
|
|
99
|
+
state,
|
|
100
|
+
action.hostName,
|
|
101
|
+
(action as RemovePortalAction).portalName
|
|
102
|
+
);
|
|
103
|
+
default:
|
|
104
|
+
return { ...state };
|
|
105
|
+
}
|
|
106
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { ACTIONS } from './constants';
|
|
3
|
+
|
|
4
|
+
export interface AddUpdatePortalAction {
|
|
5
|
+
type: ACTIONS;
|
|
6
|
+
hostName: string;
|
|
7
|
+
portalName: string;
|
|
8
|
+
node: ReactNode;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface RemovePortalAction {
|
|
12
|
+
type: ACTIONS;
|
|
13
|
+
hostName: string;
|
|
14
|
+
portalName: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface RegisterHostAction {
|
|
18
|
+
type: ACTIONS;
|
|
19
|
+
hostName: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface UnregisterHostAction {
|
|
23
|
+
type: ACTIONS;
|
|
24
|
+
hostName: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export type ActionTypes =
|
|
28
|
+
| AddUpdatePortalAction
|
|
29
|
+
| RemovePortalAction
|
|
30
|
+
| RegisterHostAction
|
|
31
|
+
| UnregisterHostAction;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { ReactNode, useCallback, useContext } from 'react';
|
|
2
|
+
import { ACTIONS } from './constants';
|
|
3
|
+
import { PortalDispatchContext } from './contexts';
|
|
4
|
+
|
|
5
|
+
export const usePortal = (hostName = 'root') => {
|
|
6
|
+
const dispatch = useContext(PortalDispatchContext);
|
|
7
|
+
|
|
8
|
+
if (dispatch === null) {
|
|
9
|
+
throw new Error("You must add 'PortalProvider' to the root component.");
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const registerHost = useCallback(() => {
|
|
13
|
+
dispatch({
|
|
14
|
+
type: ACTIONS.REGISTER_HOST,
|
|
15
|
+
hostName,
|
|
16
|
+
});
|
|
17
|
+
}, []);
|
|
18
|
+
|
|
19
|
+
const deregisterHost = useCallback(() => {
|
|
20
|
+
dispatch({
|
|
21
|
+
type: ACTIONS.DEREGISTER_HOST,
|
|
22
|
+
hostName,
|
|
23
|
+
});
|
|
24
|
+
}, []);
|
|
25
|
+
|
|
26
|
+
const addUpdatePortal = useCallback((name: string, node: ReactNode) => {
|
|
27
|
+
dispatch({
|
|
28
|
+
type: ACTIONS.ADD_UPDATE_PORTAL,
|
|
29
|
+
hostName,
|
|
30
|
+
portalName: name,
|
|
31
|
+
node,
|
|
32
|
+
});
|
|
33
|
+
}, []);
|
|
34
|
+
|
|
35
|
+
const removePortal = useCallback((name: string) => {
|
|
36
|
+
dispatch({
|
|
37
|
+
type: ACTIONS.REMOVE_PORTAL,
|
|
38
|
+
hostName,
|
|
39
|
+
portalName: name,
|
|
40
|
+
});
|
|
41
|
+
}, []);
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
registerHost,
|
|
45
|
+
deregisterHost,
|
|
46
|
+
addPortal: addUpdatePortal,
|
|
47
|
+
updatePortal: addUpdatePortal,
|
|
48
|
+
removePortal,
|
|
49
|
+
};
|
|
50
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { useContext } from 'react';
|
|
2
|
+
import { PortalStateContext } from './contexts';
|
|
3
|
+
|
|
4
|
+
export const usePortalState = (hostName: string) => {
|
|
5
|
+
const state = useContext(PortalStateContext);
|
|
6
|
+
if (state === null) {
|
|
7
|
+
throw new Error("You must add 'PortalProvider' to the root component.");
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
return state[hostName] || [];
|
|
11
|
+
};
|