react-native-platform-components 1.3.0 → 1.5.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/PlatformComponents.podspec +1 -1
- package/README.md +47 -51
- package/android/src/main/java/com/platformcomponents/PCButtonGroupView.kt +664 -0
- package/android/src/main/java/com/platformcomponents/PCButtonGroupViewManager.kt +241 -0
- package/android/src/main/java/com/platformcomponents/PCButtonSupport.kt +159 -0
- package/android/src/main/java/com/platformcomponents/PCButtonView.kt +527 -0
- package/android/src/main/java/com/platformcomponents/PCButtonViewManager.kt +204 -0
- package/android/src/main/java/com/platformcomponents/PCContextMenuView.kt +41 -151
- package/android/src/main/java/com/platformcomponents/PCContextMenuViewManager.kt +7 -63
- package/android/src/main/java/com/platformcomponents/PCDatePickerView.kt +310 -115
- package/android/src/main/java/com/platformcomponents/PCDatePickerViewManager.kt +23 -3
- package/android/src/main/java/com/platformcomponents/PCExpressive.kt +112 -0
- package/android/src/main/java/com/platformcomponents/PCFloatingActionButtonView.kt +485 -0
- package/android/src/main/java/com/platformcomponents/PCFloatingActionButtonViewManager.kt +109 -0
- package/android/src/main/java/com/platformcomponents/PCFloatingToolbarView.kt +247 -0
- package/android/src/main/java/com/platformcomponents/PCFloatingToolbarViewManager.kt +73 -0
- package/android/src/main/java/com/platformcomponents/PCHaptics.kt +46 -0
- package/android/src/main/java/com/platformcomponents/PCImageLoader.kt +42 -7
- package/android/src/main/java/com/platformcomponents/PCLiquidGlassContainerView.kt +32 -0
- package/android/src/main/java/com/platformcomponents/PCLiquidGlassContainerViewManager.kt +31 -0
- package/android/src/main/java/com/platformcomponents/PCLiquidGlassView.kt +32 -6
- package/android/src/main/java/com/platformcomponents/PCLiquidGlassViewManager.kt +4 -0
- package/android/src/main/java/com/platformcomponents/PCMenuSupport.kt +280 -0
- package/android/src/main/java/com/platformcomponents/PCNavigationBarSupport.kt +332 -0
- package/android/src/main/java/com/platformcomponents/PCNavigationRailView.kt +448 -0
- package/android/src/main/java/com/platformcomponents/PCNavigationRailViewManager.kt +176 -0
- package/android/src/main/java/com/platformcomponents/PCSegmentedControlView.kt +35 -17
- package/android/src/main/java/com/platformcomponents/PCSegmentedControlViewManager.kt +20 -3
- package/android/src/main/java/com/platformcomponents/PCSelectionMenuView.kt +371 -39
- package/android/src/main/java/com/platformcomponents/PCSelectionMenuViewManager.kt +18 -4
- package/android/src/main/java/com/platformcomponents/PCTabBarView.kt +397 -0
- package/android/src/main/java/com/platformcomponents/PCTabBarViewManager.kt +182 -0
- package/android/src/main/java/com/platformcomponents/PCTextFieldView.kt +1393 -0
- package/android/src/main/java/com/platformcomponents/PCTextFieldViewManager.kt +354 -0
- package/android/src/main/java/com/platformcomponents/PCThemeSupport.kt +37 -0
- package/android/src/main/java/com/platformcomponents/PlatformComponentsPackage.kt +8 -0
- package/android/src/main/res/drawable/pc_ic_search.xml +12 -0
- package/android/src/main/res/values/attrs.xml +13 -0
- package/android/src/main/res/values/ids.xml +5 -0
- package/android/src/main/res/values/styles.xml +207 -0
- package/ios/PCButton.h +10 -0
- package/ios/PCButton.mm +311 -0
- package/ios/PCButtonGroup.h +10 -0
- package/ios/PCButtonGroup.mm +323 -0
- package/ios/PCButtonGroupView.swift +473 -0
- package/ios/PCButtonSupport.swift +312 -0
- package/ios/PCButtonView.swift +438 -0
- package/ios/PCConstants.swift +23 -2
- package/ios/PCContextMenu.mm +28 -110
- package/ios/PCContextMenu.swift +106 -167
- package/ios/PCDatePicker.mm +21 -9
- package/ios/PCDatePickerView.swift +94 -20
- package/ios/PCFloatingActionButton.h +10 -0
- package/ios/PCFloatingActionButton.mm +177 -0
- package/ios/PCFloatingActionButtonView.swift +426 -0
- package/ios/PCFloatingToolbar.h +10 -0
- package/ios/PCFloatingToolbar.mm +103 -0
- package/ios/PCFloatingToolbarView.swift +336 -0
- package/ios/PCHaptics.swift +91 -0
- package/ios/PCImageLoader.swift +76 -12
- package/ios/PCLiquidGlass.mm +36 -0
- package/ios/PCLiquidGlass.swift +221 -114
- package/ios/PCLiquidGlassContainer.h +10 -0
- package/ios/PCLiquidGlassContainer.mm +84 -0
- package/ios/PCLiquidGlassContainer.swift +69 -0
- package/ios/PCMenuItems.h +76 -0
- package/ios/PCMenuSupport.swift +350 -0
- package/ios/PCNavigationRail.h +10 -0
- package/ios/PCNavigationRail.mm +270 -0
- package/ios/PCNavigationRailView.swift +415 -0
- package/ios/PCSegmentedControl.mm +17 -2
- package/ios/PCSegmentedControl.swift +57 -7
- package/ios/PCSelectionMenu.mm +36 -8
- package/ios/PCSelectionMenu.swift +224 -48
- package/ios/PCTabBar.h +10 -0
- package/ios/PCTabBar.mm +285 -0
- package/ios/PCTabBarAccessory.h +10 -0
- package/ios/PCTabBarAccessory.mm +93 -0
- package/ios/PCTabBarAccessoryView.swift +96 -0
- package/ios/PCTabBarView.swift +671 -0
- package/ios/PCTextField.h +10 -0
- package/ios/PCTextField.mm +546 -0
- package/ios/PCTextFieldView.swift +1558 -0
- package/lib/commonjs/Button.js +149 -0
- package/lib/commonjs/Button.js.map +1 -0
- package/lib/commonjs/ButtonGroup.js +109 -0
- package/lib/commonjs/ButtonGroup.js.map +1 -0
- package/lib/commonjs/ButtonGroupNativeComponent.ts +191 -0
- package/lib/commonjs/ButtonNativeComponent.ts +192 -0
- package/lib/commonjs/ContextMenu.js +9 -48
- package/lib/commonjs/ContextMenu.js.map +1 -1
- package/lib/commonjs/ContextMenuNativeComponent.ts +47 -49
- package/lib/commonjs/DatePicker.js +98 -2
- package/lib/commonjs/DatePicker.js.map +1 -1
- package/lib/commonjs/DatePickerNativeComponent.ts +19 -2
- package/lib/commonjs/FloatingActionButton.js +60 -0
- package/lib/commonjs/FloatingActionButton.js.map +1 -0
- package/lib/commonjs/FloatingActionButtonNativeComponent.ts +58 -0
- package/lib/commonjs/FloatingToolbar.js +77 -0
- package/lib/commonjs/FloatingToolbar.js.map +1 -0
- package/lib/commonjs/FloatingToolbarNativeComponent.ts +47 -0
- package/lib/commonjs/LiquidGlass.js +7 -1
- package/lib/commonjs/LiquidGlass.js.map +1 -1
- package/lib/commonjs/LiquidGlassContainer.js +32 -0
- package/lib/commonjs/LiquidGlassContainer.js.map +1 -0
- package/lib/commonjs/LiquidGlassContainerNativeComponent.ts +17 -0
- package/lib/commonjs/LiquidGlassNativeComponent.ts +8 -0
- package/lib/commonjs/NavigationRail.js +104 -0
- package/lib/commonjs/NavigationRail.js.map +1 -0
- package/lib/commonjs/NavigationRailNativeComponent.ts +107 -0
- package/lib/commonjs/PlatformComponentsProvider.js +18 -0
- package/lib/commonjs/PlatformComponentsProvider.js.map +1 -0
- package/lib/commonjs/SegmentedControl.js +18 -85
- package/lib/commonjs/SegmentedControl.js.map +1 -1
- package/lib/commonjs/SegmentedControlNativeComponent.ts +14 -0
- package/lib/commonjs/SelectionMenu.js +27 -3
- package/lib/commonjs/SelectionMenu.js.map +1 -1
- package/lib/commonjs/SelectionMenuNativeComponent.ts +26 -4
- package/lib/commonjs/SplitButton.js +98 -0
- package/lib/commonjs/SplitButton.js.map +1 -0
- package/lib/commonjs/TabBar.js +203 -0
- package/lib/commonjs/TabBar.js.map +1 -0
- package/lib/commonjs/TabBarAccessoryNativeComponent.ts +19 -0
- package/lib/commonjs/TabBarNativeComponent.ts +145 -0
- package/lib/commonjs/TextField.js +358 -0
- package/lib/commonjs/TextField.js.map +1 -0
- package/lib/commonjs/TextFieldNativeComponent.ts +324 -0
- package/lib/commonjs/focusRegistry.js +79 -0
- package/lib/commonjs/focusRegistry.js.map +1 -0
- package/lib/commonjs/haptics.js +2 -0
- package/lib/commonjs/haptics.js.map +1 -0
- package/lib/commonjs/icons.js +106 -0
- package/lib/commonjs/icons.js.map +1 -0
- package/lib/commonjs/index.js +143 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.web.js +157 -63
- package/lib/commonjs/index.web.js.map +1 -1
- package/lib/commonjs/jest.js +910 -0
- package/lib/commonjs/jest.js.map +1 -0
- package/lib/commonjs/labelStyle.js +27 -0
- package/lib/commonjs/labelStyle.js.map +1 -0
- package/lib/commonjs/menuItems.js +68 -0
- package/lib/commonjs/menuItems.js.map +1 -0
- package/lib/commonjs/reactNativeInternals.d.js +2 -0
- package/lib/commonjs/reactNativeInternals.d.js.map +1 -0
- package/lib/commonjs/selectionIdentifiers.js +18 -0
- package/lib/commonjs/selectionIdentifiers.js.map +1 -0
- package/lib/commonjs/submitBehavior.js +19 -0
- package/lib/commonjs/submitBehavior.js.map +1 -0
- package/lib/commonjs/tabItems.js +49 -0
- package/lib/commonjs/tabItems.js.map +1 -0
- package/lib/commonjs/web/Button.js +170 -0
- package/lib/commonjs/web/Button.js.map +1 -0
- package/lib/commonjs/web/ButtonGroup.js +119 -0
- package/lib/commonjs/web/ButtonGroup.js.map +1 -0
- package/lib/commonjs/web/DatePicker.js +168 -0
- package/lib/commonjs/web/DatePicker.js.map +1 -0
- package/lib/commonjs/web/DateRangePicker.js +137 -0
- package/lib/commonjs/web/DateRangePicker.js.map +1 -0
- package/lib/commonjs/web/Dialog.js +54 -0
- package/lib/commonjs/web/Dialog.js.map +1 -0
- package/lib/commonjs/web/FloatingActionButton.js +98 -0
- package/lib/commonjs/web/FloatingActionButton.js.map +1 -0
- package/lib/commonjs/web/Icon.js +34 -0
- package/lib/commonjs/web/Icon.js.map +1 -0
- package/lib/commonjs/web/NativeTheme.js +28 -0
- package/lib/commonjs/web/NativeTheme.js.map +1 -0
- package/lib/commonjs/web/NavigationRail.js +139 -0
- package/lib/commonjs/web/NavigationRail.js.map +1 -0
- package/lib/commonjs/web/PlatformComponentsProvider.js +51 -0
- package/lib/commonjs/web/PlatformComponentsProvider.js.map +1 -0
- package/lib/commonjs/web/SegmentedControl.js +117 -0
- package/lib/commonjs/web/SegmentedControl.js.map +1 -0
- package/lib/commonjs/web/SelectionMenu.js +142 -0
- package/lib/commonjs/web/SelectionMenu.js.map +1 -0
- package/lib/commonjs/web/SplitButton.js +35 -0
- package/lib/commonjs/web/SplitButton.js.map +1 -0
- package/lib/commonjs/web/TabBar.js +131 -0
- package/lib/commonjs/web/TabBar.js.map +1 -0
- package/lib/commonjs/web/TextField.js +322 -0
- package/lib/commonjs/web/TextField.js.map +1 -0
- package/lib/commonjs/web/components.js +36 -0
- package/lib/commonjs/web/components.js.map +1 -0
- package/lib/commonjs/web/containers.js +121 -0
- package/lib/commonjs/web/containers.js.map +1 -0
- package/lib/commonjs/web/dateInput.js +116 -0
- package/lib/commonjs/web/dateInput.js.map +1 -0
- package/lib/commonjs/web/shared.js +192 -0
- package/lib/commonjs/web/shared.js.map +1 -0
- package/lib/commonjs/webComponents.js +6 -0
- package/lib/commonjs/webComponents.js.map +1 -0
- package/lib/module/Button.js +142 -0
- package/lib/module/Button.js.map +1 -0
- package/lib/module/ButtonGroup.js +102 -0
- package/lib/module/ButtonGroup.js.map +1 -0
- package/lib/module/ButtonGroupNativeComponent.ts +191 -0
- package/lib/module/ButtonNativeComponent.ts +192 -0
- package/lib/module/ContextMenu.js +9 -48
- package/lib/module/ContextMenu.js.map +1 -1
- package/lib/module/ContextMenuNativeComponent.ts +47 -49
- package/lib/module/DatePicker.js +98 -4
- package/lib/module/DatePicker.js.map +1 -1
- package/lib/module/DatePickerNativeComponent.ts +19 -2
- package/lib/module/FloatingActionButton.js +53 -0
- package/lib/module/FloatingActionButton.js.map +1 -0
- package/lib/module/FloatingActionButtonNativeComponent.ts +58 -0
- package/lib/module/FloatingToolbar.js +70 -0
- package/lib/module/FloatingToolbar.js.map +1 -0
- package/lib/module/FloatingToolbarNativeComponent.ts +47 -0
- package/lib/module/LiquidGlass.js +7 -1
- package/lib/module/LiquidGlass.js.map +1 -1
- package/lib/module/LiquidGlassContainer.js +26 -0
- package/lib/module/LiquidGlassContainer.js.map +1 -0
- package/lib/module/LiquidGlassContainerNativeComponent.ts +17 -0
- package/lib/module/LiquidGlassNativeComponent.ts +8 -0
- package/lib/module/NavigationRail.js +99 -0
- package/lib/module/NavigationRail.js.map +1 -0
- package/lib/module/NavigationRailNativeComponent.ts +107 -0
- package/lib/module/PlatformComponentsProvider.js +13 -0
- package/lib/module/PlatformComponentsProvider.js.map +1 -0
- package/lib/module/SegmentedControl.js +18 -85
- package/lib/module/SegmentedControl.js.map +1 -1
- package/lib/module/SegmentedControlNativeComponent.ts +14 -0
- package/lib/module/SelectionMenu.js +27 -3
- package/lib/module/SelectionMenu.js.map +1 -1
- package/lib/module/SelectionMenuNativeComponent.ts +26 -4
- package/lib/module/SplitButton.js +91 -0
- package/lib/module/SplitButton.js.map +1 -0
- package/lib/module/TabBar.js +196 -0
- package/lib/module/TabBar.js.map +1 -0
- package/lib/module/TabBarAccessoryNativeComponent.ts +19 -0
- package/lib/module/TabBarNativeComponent.ts +145 -0
- package/lib/module/TextField.js +352 -0
- package/lib/module/TextField.js.map +1 -0
- package/lib/module/TextFieldNativeComponent.ts +324 -0
- package/lib/module/focusRegistry.js +75 -0
- package/lib/module/focusRegistry.js.map +1 -0
- package/lib/module/haptics.js +2 -0
- package/lib/module/haptics.js.map +1 -0
- package/lib/module/icons.js +101 -0
- package/lib/module/icons.js.map +1 -0
- package/lib/module/index.js +13 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js +12 -59
- package/lib/module/index.web.js.map +1 -1
- package/lib/module/jest.js +840 -0
- package/lib/module/jest.js.map +1 -0
- package/lib/module/labelStyle.js +23 -0
- package/lib/module/labelStyle.js.map +1 -0
- package/lib/module/menuItems.js +65 -0
- package/lib/module/menuItems.js.map +1 -0
- package/lib/module/reactNativeInternals.d.js +2 -0
- package/lib/module/reactNativeInternals.d.js.map +1 -0
- package/lib/module/selectionIdentifiers.js +14 -0
- package/lib/module/selectionIdentifiers.js.map +1 -0
- package/lib/module/submitBehavior.js +15 -0
- package/lib/module/submitBehavior.js.map +1 -0
- package/lib/module/tabItems.js +45 -0
- package/lib/module/tabItems.js.map +1 -0
- package/lib/module/web/Button.js +164 -0
- package/lib/module/web/Button.js.map +1 -0
- package/lib/module/web/ButtonGroup.js +113 -0
- package/lib/module/web/ButtonGroup.js.map +1 -0
- package/lib/module/web/DatePicker.js +162 -0
- package/lib/module/web/DatePicker.js.map +1 -0
- package/lib/module/web/DateRangePicker.js +131 -0
- package/lib/module/web/DateRangePicker.js.map +1 -0
- package/lib/module/web/Dialog.js +48 -0
- package/lib/module/web/Dialog.js.map +1 -0
- package/lib/module/web/FloatingActionButton.js +94 -0
- package/lib/module/web/FloatingActionButton.js.map +1 -0
- package/lib/module/web/Icon.js +29 -0
- package/lib/module/web/Icon.js.map +1 -0
- package/lib/module/web/NativeTheme.js +23 -0
- package/lib/module/web/NativeTheme.js.map +1 -0
- package/lib/module/web/NavigationRail.js +133 -0
- package/lib/module/web/NavigationRail.js.map +1 -0
- package/lib/module/web/PlatformComponentsProvider.js +44 -0
- package/lib/module/web/PlatformComponentsProvider.js.map +1 -0
- package/lib/module/web/SegmentedControl.js +112 -0
- package/lib/module/web/SegmentedControl.js.map +1 -0
- package/lib/module/web/SelectionMenu.js +137 -0
- package/lib/module/web/SelectionMenu.js.map +1 -0
- package/lib/module/web/SplitButton.js +30 -0
- package/lib/module/web/SplitButton.js.map +1 -0
- package/lib/module/web/TabBar.js +126 -0
- package/lib/module/web/TabBar.js.map +1 -0
- package/lib/module/web/TextField.js +316 -0
- package/lib/module/web/TextField.js.map +1 -0
- package/lib/module/web/components.js +33 -0
- package/lib/module/web/components.js.map +1 -0
- package/lib/module/web/containers.js +112 -0
- package/lib/module/web/containers.js.map +1 -0
- package/lib/module/web/dateInput.js +109 -0
- package/lib/module/web/dateInput.js.map +1 -0
- package/lib/module/web/shared.js +179 -0
- package/lib/module/web/shared.js.map +1 -0
- package/lib/module/webComponents.js +4 -0
- package/lib/module/webComponents.js.map +1 -0
- package/lib/typescript/commonjs/docs/sidebars.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/Button.d.ts +184 -0
- package/lib/typescript/commonjs/src/Button.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/ButtonGroup.d.ts +117 -0
- package/lib/typescript/commonjs/src/ButtonGroup.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/ButtonGroupNativeComponent.d.ts +154 -0
- package/lib/typescript/commonjs/src/ButtonGroupNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/ButtonNativeComponent.d.ts +148 -0
- package/lib/typescript/commonjs/src/ButtonNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/ContextMenu.d.ts +20 -33
- package/lib/typescript/commonjs/src/ContextMenu.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ContextMenuNativeComponent.d.ts +45 -47
- package/lib/typescript/commonjs/src/ContextMenuNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/DatePicker.d.ts +74 -1
- package/lib/typescript/commonjs/src/DatePicker.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/DatePickerNativeComponent.d.ts +16 -1
- package/lib/typescript/commonjs/src/DatePickerNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/FloatingActionButton.d.ts +67 -0
- package/lib/typescript/commonjs/src/FloatingActionButton.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/FloatingActionButtonNativeComponent.d.ts +43 -0
- package/lib/typescript/commonjs/src/FloatingActionButtonNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/FloatingToolbar.d.ts +75 -0
- package/lib/typescript/commonjs/src/FloatingToolbar.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/FloatingToolbarNativeComponent.d.ts +36 -0
- package/lib/typescript/commonjs/src/FloatingToolbarNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/LiquidGlass.d.ts +17 -0
- package/lib/typescript/commonjs/src/LiquidGlass.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/LiquidGlassContainer.d.ts +27 -0
- package/lib/typescript/commonjs/src/LiquidGlassContainer.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/LiquidGlassContainerNativeComponent.d.ts +13 -0
- package/lib/typescript/commonjs/src/LiquidGlassContainerNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/LiquidGlassNativeComponent.d.ts +7 -0
- package/lib/typescript/commonjs/src/LiquidGlassNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/NavigationRail.d.ts +86 -0
- package/lib/typescript/commonjs/src/NavigationRail.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/NavigationRailNativeComponent.d.ts +81 -0
- package/lib/typescript/commonjs/src/NavigationRailNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/PlatformComponentsProvider.d.ts +6 -0
- package/lib/typescript/commonjs/src/PlatformComponentsProvider.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/SegmentedControl.d.ts +35 -47
- package/lib/typescript/commonjs/src/SegmentedControl.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/SegmentedControlNativeComponent.d.ts +11 -0
- package/lib/typescript/commonjs/src/SegmentedControlNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/SelectionMenu.d.ts +44 -2
- package/lib/typescript/commonjs/src/SelectionMenu.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/SelectionMenuNativeComponent.d.ts +20 -4
- package/lib/typescript/commonjs/src/SelectionMenuNativeComponent.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/SplitButton.d.ts +83 -0
- package/lib/typescript/commonjs/src/SplitButton.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TabBar.d.ts +144 -0
- package/lib/typescript/commonjs/src/TabBar.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TabBarAccessoryNativeComponent.d.ts +13 -0
- package/lib/typescript/commonjs/src/TabBarAccessoryNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TabBarNativeComponent.d.ts +110 -0
- package/lib/typescript/commonjs/src/TabBarNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TextField.d.ts +332 -0
- package/lib/typescript/commonjs/src/TextField.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TextFieldNativeComponent.d.ts +240 -0
- package/lib/typescript/commonjs/src/TextFieldNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/focusRegistry.d.ts +13 -0
- package/lib/typescript/commonjs/src/focusRegistry.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/haptics.d.ts +20 -0
- package/lib/typescript/commonjs/src/haptics.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/icons.d.ts +58 -0
- package/lib/typescript/commonjs/src/icons.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/index.d.ts +13 -0
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/index.web.d.ts +25 -133
- package/lib/typescript/commonjs/src/index.web.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/jest.d.ts +139 -0
- package/lib/typescript/commonjs/src/jest.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/labelStyle.d.ts +20 -0
- package/lib/typescript/commonjs/src/labelStyle.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/menuItems.d.ts +100 -0
- package/lib/typescript/commonjs/src/menuItems.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/selectionIdentifiers.d.ts +3 -0
- package/lib/typescript/commonjs/src/selectionIdentifiers.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/sharedTypes.d.ts +6 -1
- package/lib/typescript/commonjs/src/sharedTypes.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/submitBehavior.d.ts +9 -0
- package/lib/typescript/commonjs/src/submitBehavior.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/tabItems.d.ts +55 -0
- package/lib/typescript/commonjs/src/tabItems.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/Button.d.ts +9 -0
- package/lib/typescript/commonjs/src/web/Button.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/ButtonGroup.d.ts +11 -0
- package/lib/typescript/commonjs/src/web/ButtonGroup.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/DatePicker.d.ts +14 -0
- package/lib/typescript/commonjs/src/web/DatePicker.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/DateRangePicker.d.ts +11 -0
- package/lib/typescript/commonjs/src/web/DateRangePicker.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/Dialog.d.ts +12 -0
- package/lib/typescript/commonjs/src/web/Dialog.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/FloatingActionButton.d.ts +8 -0
- package/lib/typescript/commonjs/src/web/FloatingActionButton.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/Icon.d.ts +12 -0
- package/lib/typescript/commonjs/src/web/Icon.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/NativeTheme.d.ts +10 -0
- package/lib/typescript/commonjs/src/web/NativeTheme.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/NavigationRail.d.ts +8 -0
- package/lib/typescript/commonjs/src/web/NavigationRail.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/PlatformComponentsProvider.d.ts +10 -0
- package/lib/typescript/commonjs/src/web/PlatformComponentsProvider.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/SegmentedControl.d.ts +8 -0
- package/lib/typescript/commonjs/src/web/SegmentedControl.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/SelectionMenu.d.ts +10 -0
- package/lib/typescript/commonjs/src/web/SelectionMenu.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/SplitButton.d.ts +9 -0
- package/lib/typescript/commonjs/src/web/SplitButton.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/TabBar.d.ts +9 -0
- package/lib/typescript/commonjs/src/web/TabBar.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/TextField.d.ts +9 -0
- package/lib/typescript/commonjs/src/web/TextField.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/components.d.ts +17 -0
- package/lib/typescript/commonjs/src/web/components.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/containers.d.ts +24 -0
- package/lib/typescript/commonjs/src/web/containers.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/dateInput.d.ts +20 -0
- package/lib/typescript/commonjs/src/web/dateInput.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/web/shared.d.ts +43 -0
- package/lib/typescript/commonjs/src/web/shared.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/webComponents.d.ts +43 -0
- package/lib/typescript/commonjs/src/webComponents.d.ts.map +1 -0
- package/lib/typescript/module/docs/sidebars.d.ts.map +1 -1
- package/lib/typescript/module/src/Button.d.ts +184 -0
- package/lib/typescript/module/src/Button.d.ts.map +1 -0
- package/lib/typescript/module/src/ButtonGroup.d.ts +117 -0
- package/lib/typescript/module/src/ButtonGroup.d.ts.map +1 -0
- package/lib/typescript/module/src/ButtonGroupNativeComponent.d.ts +154 -0
- package/lib/typescript/module/src/ButtonGroupNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/ButtonNativeComponent.d.ts +148 -0
- package/lib/typescript/module/src/ButtonNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/ContextMenu.d.ts +20 -33
- package/lib/typescript/module/src/ContextMenu.d.ts.map +1 -1
- package/lib/typescript/module/src/ContextMenuNativeComponent.d.ts +45 -47
- package/lib/typescript/module/src/ContextMenuNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/DatePicker.d.ts +74 -1
- package/lib/typescript/module/src/DatePicker.d.ts.map +1 -1
- package/lib/typescript/module/src/DatePickerNativeComponent.d.ts +16 -1
- package/lib/typescript/module/src/DatePickerNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/FloatingActionButton.d.ts +67 -0
- package/lib/typescript/module/src/FloatingActionButton.d.ts.map +1 -0
- package/lib/typescript/module/src/FloatingActionButtonNativeComponent.d.ts +43 -0
- package/lib/typescript/module/src/FloatingActionButtonNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/FloatingToolbar.d.ts +75 -0
- package/lib/typescript/module/src/FloatingToolbar.d.ts.map +1 -0
- package/lib/typescript/module/src/FloatingToolbarNativeComponent.d.ts +36 -0
- package/lib/typescript/module/src/FloatingToolbarNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/LiquidGlass.d.ts +17 -0
- package/lib/typescript/module/src/LiquidGlass.d.ts.map +1 -1
- package/lib/typescript/module/src/LiquidGlassContainer.d.ts +27 -0
- package/lib/typescript/module/src/LiquidGlassContainer.d.ts.map +1 -0
- package/lib/typescript/module/src/LiquidGlassContainerNativeComponent.d.ts +13 -0
- package/lib/typescript/module/src/LiquidGlassContainerNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/LiquidGlassNativeComponent.d.ts +7 -0
- package/lib/typescript/module/src/LiquidGlassNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/NavigationRail.d.ts +86 -0
- package/lib/typescript/module/src/NavigationRail.d.ts.map +1 -0
- package/lib/typescript/module/src/NavigationRailNativeComponent.d.ts +81 -0
- package/lib/typescript/module/src/NavigationRailNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/PlatformComponentsProvider.d.ts +6 -0
- package/lib/typescript/module/src/PlatformComponentsProvider.d.ts.map +1 -0
- package/lib/typescript/module/src/SegmentedControl.d.ts +35 -47
- package/lib/typescript/module/src/SegmentedControl.d.ts.map +1 -1
- package/lib/typescript/module/src/SegmentedControlNativeComponent.d.ts +11 -0
- package/lib/typescript/module/src/SegmentedControlNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/SelectionMenu.d.ts +44 -2
- package/lib/typescript/module/src/SelectionMenu.d.ts.map +1 -1
- package/lib/typescript/module/src/SelectionMenuNativeComponent.d.ts +20 -4
- package/lib/typescript/module/src/SelectionMenuNativeComponent.d.ts.map +1 -1
- package/lib/typescript/module/src/SplitButton.d.ts +83 -0
- package/lib/typescript/module/src/SplitButton.d.ts.map +1 -0
- package/lib/typescript/module/src/TabBar.d.ts +144 -0
- package/lib/typescript/module/src/TabBar.d.ts.map +1 -0
- package/lib/typescript/module/src/TabBarAccessoryNativeComponent.d.ts +13 -0
- package/lib/typescript/module/src/TabBarAccessoryNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/TabBarNativeComponent.d.ts +110 -0
- package/lib/typescript/module/src/TabBarNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/TextField.d.ts +332 -0
- package/lib/typescript/module/src/TextField.d.ts.map +1 -0
- package/lib/typescript/module/src/TextFieldNativeComponent.d.ts +240 -0
- package/lib/typescript/module/src/TextFieldNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/focusRegistry.d.ts +13 -0
- package/lib/typescript/module/src/focusRegistry.d.ts.map +1 -0
- package/lib/typescript/module/src/haptics.d.ts +20 -0
- package/lib/typescript/module/src/haptics.d.ts.map +1 -0
- package/lib/typescript/module/src/icons.d.ts +58 -0
- package/lib/typescript/module/src/icons.d.ts.map +1 -0
- package/lib/typescript/module/src/index.d.ts +13 -0
- package/lib/typescript/module/src/index.d.ts.map +1 -1
- package/lib/typescript/module/src/index.web.d.ts +25 -133
- package/lib/typescript/module/src/index.web.d.ts.map +1 -1
- package/lib/typescript/module/src/jest.d.ts +139 -0
- package/lib/typescript/module/src/jest.d.ts.map +1 -0
- package/lib/typescript/module/src/labelStyle.d.ts +20 -0
- package/lib/typescript/module/src/labelStyle.d.ts.map +1 -0
- package/lib/typescript/module/src/menuItems.d.ts +100 -0
- package/lib/typescript/module/src/menuItems.d.ts.map +1 -0
- package/lib/typescript/module/src/selectionIdentifiers.d.ts +3 -0
- package/lib/typescript/module/src/selectionIdentifiers.d.ts.map +1 -0
- package/lib/typescript/module/src/sharedTypes.d.ts +6 -1
- package/lib/typescript/module/src/sharedTypes.d.ts.map +1 -1
- package/lib/typescript/module/src/submitBehavior.d.ts +9 -0
- package/lib/typescript/module/src/submitBehavior.d.ts.map +1 -0
- package/lib/typescript/module/src/tabItems.d.ts +55 -0
- package/lib/typescript/module/src/tabItems.d.ts.map +1 -0
- package/lib/typescript/module/src/web/Button.d.ts +9 -0
- package/lib/typescript/module/src/web/Button.d.ts.map +1 -0
- package/lib/typescript/module/src/web/ButtonGroup.d.ts +11 -0
- package/lib/typescript/module/src/web/ButtonGroup.d.ts.map +1 -0
- package/lib/typescript/module/src/web/DatePicker.d.ts +14 -0
- package/lib/typescript/module/src/web/DatePicker.d.ts.map +1 -0
- package/lib/typescript/module/src/web/DateRangePicker.d.ts +11 -0
- package/lib/typescript/module/src/web/DateRangePicker.d.ts.map +1 -0
- package/lib/typescript/module/src/web/Dialog.d.ts +12 -0
- package/lib/typescript/module/src/web/Dialog.d.ts.map +1 -0
- package/lib/typescript/module/src/web/FloatingActionButton.d.ts +8 -0
- package/lib/typescript/module/src/web/FloatingActionButton.d.ts.map +1 -0
- package/lib/typescript/module/src/web/Icon.d.ts +12 -0
- package/lib/typescript/module/src/web/Icon.d.ts.map +1 -0
- package/lib/typescript/module/src/web/NativeTheme.d.ts +10 -0
- package/lib/typescript/module/src/web/NativeTheme.d.ts.map +1 -0
- package/lib/typescript/module/src/web/NavigationRail.d.ts +8 -0
- package/lib/typescript/module/src/web/NavigationRail.d.ts.map +1 -0
- package/lib/typescript/module/src/web/PlatformComponentsProvider.d.ts +10 -0
- package/lib/typescript/module/src/web/PlatformComponentsProvider.d.ts.map +1 -0
- package/lib/typescript/module/src/web/SegmentedControl.d.ts +8 -0
- package/lib/typescript/module/src/web/SegmentedControl.d.ts.map +1 -0
- package/lib/typescript/module/src/web/SelectionMenu.d.ts +10 -0
- package/lib/typescript/module/src/web/SelectionMenu.d.ts.map +1 -0
- package/lib/typescript/module/src/web/SplitButton.d.ts +9 -0
- package/lib/typescript/module/src/web/SplitButton.d.ts.map +1 -0
- package/lib/typescript/module/src/web/TabBar.d.ts +9 -0
- package/lib/typescript/module/src/web/TabBar.d.ts.map +1 -0
- package/lib/typescript/module/src/web/TextField.d.ts +9 -0
- package/lib/typescript/module/src/web/TextField.d.ts.map +1 -0
- package/lib/typescript/module/src/web/components.d.ts +17 -0
- package/lib/typescript/module/src/web/components.d.ts.map +1 -0
- package/lib/typescript/module/src/web/containers.d.ts +24 -0
- package/lib/typescript/module/src/web/containers.d.ts.map +1 -0
- package/lib/typescript/module/src/web/dateInput.d.ts +20 -0
- package/lib/typescript/module/src/web/dateInput.d.ts.map +1 -0
- package/lib/typescript/module/src/web/shared.d.ts +43 -0
- package/lib/typescript/module/src/web/shared.d.ts.map +1 -0
- package/lib/typescript/module/src/webComponents.d.ts +43 -0
- package/lib/typescript/module/src/webComponents.d.ts.map +1 -0
- package/package.json +55 -4
- package/plugin/build/index.d.ts +3 -2
- package/plugin/build/index.d.ts.map +1 -1
- package/react-native.config.js +6 -0
- package/shared/PCButtonComponentDescriptors-custom.h +22 -0
- package/shared/PCButtonGroupComponentDescriptors-custom.h +22 -0
- package/shared/PCButtonGroupShadowNode-custom.cpp +48 -0
- package/shared/PCButtonGroupShadowNode-custom.h +55 -0
- package/shared/PCButtonGroupState-custom.h +61 -0
- package/shared/PCButtonShadowNode-custom.cpp +48 -0
- package/shared/PCButtonShadowNode-custom.h +55 -0
- package/shared/PCButtonState-custom.h +61 -0
- package/shared/PCFloatingActionButtonComponentDescriptors-custom.h +22 -0
- package/shared/PCFloatingActionButtonShadowNode-custom.cpp +48 -0
- package/shared/PCFloatingActionButtonShadowNode-custom.h +54 -0
- package/shared/PCFloatingActionButtonState-custom.h +61 -0
- package/shared/PCNavigationRailComponentDescriptors-custom.h +47 -0
- package/shared/PCNavigationRailShadowNode-custom.h +42 -0
- package/shared/PCNavigationRailState-custom.h +62 -0
- package/shared/PCTabBarComponentDescriptors-custom.h +22 -0
- package/shared/PCTabBarShadowNode-custom.cpp +54 -0
- package/shared/PCTabBarShadowNode-custom.h +54 -0
- package/shared/PCTabBarState-custom.h +62 -0
- package/shared/PCTextFieldComponentDescriptors-custom.h +22 -0
- package/shared/PCTextFieldShadowNode-custom.cpp +47 -0
- package/shared/PCTextFieldShadowNode-custom.h +55 -0
- package/shared/PCTextFieldState-custom.h +61 -0
- package/shared/react/renderer/components/PlatformComponentsViewSpec/ComponentDescriptors.h +6 -0
- package/src/Button.tsx +359 -0
- package/src/ButtonGroup.tsx +251 -0
- package/src/ButtonGroupNativeComponent.ts +191 -0
- package/src/ButtonNativeComponent.ts +192 -0
- package/src/ContextMenu.tsx +34 -81
- package/src/ContextMenuNativeComponent.ts +47 -49
- package/src/DatePicker.tsx +182 -4
- package/src/DatePickerNativeComponent.ts +19 -2
- package/src/FloatingActionButton.tsx +121 -0
- package/src/FloatingActionButtonNativeComponent.ts +58 -0
- package/src/FloatingToolbar.tsx +164 -0
- package/src/FloatingToolbarNativeComponent.ts +47 -0
- package/src/LiquidGlass.tsx +24 -1
- package/src/LiquidGlassContainer.tsx +42 -0
- package/src/LiquidGlassContainerNativeComponent.ts +17 -0
- package/src/LiquidGlassNativeComponent.ts +8 -0
- package/src/NavigationRail.tsx +203 -0
- package/src/NavigationRailNativeComponent.ts +107 -0
- package/src/PlatformComponentsProvider.tsx +15 -0
- package/src/SegmentedControl.tsx +57 -119
- package/src/SegmentedControlNativeComponent.ts +14 -0
- package/src/SelectionMenu.tsx +81 -6
- package/src/SelectionMenuNativeComponent.ts +26 -4
- package/src/SplitButton.tsx +198 -0
- package/src/TabBar.tsx +373 -0
- package/src/TabBarAccessoryNativeComponent.ts +19 -0
- package/src/TabBarNativeComponent.ts +145 -0
- package/src/TextField.tsx +908 -0
- package/src/TextFieldNativeComponent.ts +324 -0
- package/src/focusRegistry.ts +90 -0
- package/src/haptics.ts +31 -0
- package/src/icons.ts +143 -0
- package/src/index.tsx +13 -0
- package/src/index.web.tsx +53 -199
- package/src/jest.tsx +958 -0
- package/src/labelStyle.ts +36 -0
- package/src/menuItems.ts +152 -0
- package/src/reactNativeInternals.d.ts +22 -0
- package/src/selectionIdentifiers.ts +17 -0
- package/src/sharedTypes.ts +7 -1
- package/src/submitBehavior.ts +16 -0
- package/src/tabItems.ts +113 -0
- package/src/web/Button.tsx +201 -0
- package/src/web/ButtonGroup.tsx +154 -0
- package/src/web/DatePicker.tsx +204 -0
- package/src/web/DateRangePicker.tsx +135 -0
- package/src/web/Dialog.tsx +54 -0
- package/src/web/FloatingActionButton.tsx +76 -0
- package/src/web/Icon.tsx +33 -0
- package/src/web/NativeTheme.ts +23 -0
- package/src/web/NavigationRail.tsx +148 -0
- package/src/web/PlatformComponentsProvider.tsx +48 -0
- package/src/web/SegmentedControl.tsx +127 -0
- package/src/web/SelectionMenu.tsx +149 -0
- package/src/web/SplitButton.tsx +32 -0
- package/src/web/TabBar.tsx +150 -0
- package/src/web/TextField.tsx +361 -0
- package/src/web/components.tsx +71 -0
- package/src/web/containers.tsx +130 -0
- package/src/web/dateInput.ts +137 -0
- package/src/web/shared.ts +176 -0
- package/src/webComponents.ts +45 -0
- package/android/src/main/java/com/platformcomponents/DateConstraints.kt +0 -83
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
package com.platformcomponents
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.Arguments
|
|
4
|
+
import com.facebook.react.bridge.ReadableMap
|
|
5
|
+
import com.facebook.react.bridge.WritableMap
|
|
6
|
+
import com.facebook.react.uimanager.ReactStylesDiffMap
|
|
7
|
+
import com.facebook.react.uimanager.SimpleViewManager
|
|
8
|
+
import com.facebook.react.uimanager.StateWrapper
|
|
9
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
10
|
+
import com.facebook.react.uimanager.UIManagerHelper
|
|
11
|
+
import com.facebook.react.uimanager.ViewManagerDelegate
|
|
12
|
+
import com.facebook.react.uimanager.events.Event
|
|
13
|
+
import com.facebook.react.viewmanagers.PCFloatingActionButtonManagerDelegate
|
|
14
|
+
import com.facebook.react.viewmanagers.PCFloatingActionButtonManagerInterface
|
|
15
|
+
|
|
16
|
+
class PCFloatingActionButtonViewManager :
|
|
17
|
+
SimpleViewManager<PCFloatingActionButtonView>(),
|
|
18
|
+
PCFloatingActionButtonManagerInterface<PCFloatingActionButtonView> {
|
|
19
|
+
|
|
20
|
+
private val delegate: ViewManagerDelegate<PCFloatingActionButtonView> =
|
|
21
|
+
PCFloatingActionButtonManagerDelegate(this)
|
|
22
|
+
|
|
23
|
+
override fun getName(): String = "PCFloatingActionButton"
|
|
24
|
+
|
|
25
|
+
override fun getDelegate(): ViewManagerDelegate<PCFloatingActionButtonView> = delegate
|
|
26
|
+
|
|
27
|
+
override fun createViewInstance(reactContext: ThemedReactContext): PCFloatingActionButtonView =
|
|
28
|
+
PCFloatingActionButtonView(reactContext)
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Pass the StateWrapper to the view so it can update Fabric state with its
|
|
32
|
+
* size, and report it right away so the first layout already fits.
|
|
33
|
+
*/
|
|
34
|
+
override fun updateState(
|
|
35
|
+
view: PCFloatingActionButtonView,
|
|
36
|
+
props: ReactStylesDiffMap,
|
|
37
|
+
stateWrapper: StateWrapper
|
|
38
|
+
): Any? {
|
|
39
|
+
view.stateWrapper = stateWrapper
|
|
40
|
+
view.reportIntrinsicSize()
|
|
41
|
+
return null
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
override fun addEventEmitters(reactContext: ThemedReactContext, view: PCFloatingActionButtonView) {
|
|
45
|
+
view.onPress = {
|
|
46
|
+
PCHaptics.perform(view, view.haptics)
|
|
47
|
+
UIManagerHelper.getEventDispatcherForReactTag(reactContext, view.id)?.dispatchEvent(
|
|
48
|
+
PressEvent(UIManagerHelper.getSurfaceId(view), view.id)
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// icon: {iconType, iconName, iconUri, iconScale, iconTinted}
|
|
54
|
+
override fun setIcon(view: PCFloatingActionButtonView, value: ReadableMap?) {
|
|
55
|
+
view.applyIcon(PCButtonSupport.parseIcon(value))
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
override fun setLabel(view: PCFloatingActionButtonView, value: String?) {
|
|
59
|
+
view.applyLabel(value ?: "")
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// "small" | "regular" | "medium" | "large"
|
|
63
|
+
override fun setSize(view: PCFloatingActionButtonView, value: String?) {
|
|
64
|
+
view.applySize(value)
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// "true" | "false"
|
|
68
|
+
override fun setExtended(view: PCFloatingActionButtonView, value: String?) {
|
|
69
|
+
view.applyExtended(value != "false")
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Colors arrive already processed by React Native (ARGB ints)
|
|
73
|
+
override fun setColor(view: PCFloatingActionButtonView, value: Int?) {
|
|
74
|
+
view.applyColors(value, view.foregroundColor)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
override fun setForegroundColor(view: PCFloatingActionButtonView, value: Int?) {
|
|
78
|
+
view.applyColors(view.containerColor, value)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
override fun setInteractivity(view: PCFloatingActionButtonView, value: String?) {
|
|
82
|
+
view.applyInteractivity(value)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
override fun setSpokenLabel(view: PCFloatingActionButtonView, value: String?) {
|
|
86
|
+
view.applySpokenLabel(value ?: "")
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// "" (none added) | "none" | "selection" | "light" | "medium" | "heavy" | "success" | "warning" | "error"
|
|
90
|
+
override fun setHaptics(view: PCFloatingActionButtonView, value: String?) {
|
|
91
|
+
view.haptics = PCHaptics.configure(view, value)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
override fun setScrollViewNativeID(view: PCFloatingActionButtonView, value: String?) {
|
|
95
|
+
view.applyScrollViewNativeID(value ?: "")
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// --- Events ---
|
|
99
|
+
|
|
100
|
+
private class PressEvent(surfaceId: Int, viewTag: Int) : Event<PressEvent>(surfaceId, viewTag) {
|
|
101
|
+
// Every press counts; two quick presses must not merge into one
|
|
102
|
+
override fun canCoalesce(): Boolean = false
|
|
103
|
+
|
|
104
|
+
override fun getEventName(): String = "topFabPress"
|
|
105
|
+
|
|
106
|
+
// Fabric reads the payload from here
|
|
107
|
+
override fun getEventData(): WritableMap = Arguments.createMap()
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
package com.platformcomponents
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.content.res.ColorStateList
|
|
5
|
+
import android.graphics.Color
|
|
6
|
+
import android.view.View
|
|
7
|
+
import android.view.ViewTreeObserver
|
|
8
|
+
import android.view.animation.AccelerateInterpolator
|
|
9
|
+
import android.view.animation.DecelerateInterpolator
|
|
10
|
+
import androidx.core.content.res.ResourcesCompat
|
|
11
|
+
import com.facebook.react.uimanager.util.ReactFindViewUtil
|
|
12
|
+
import com.google.android.material.R as MaterialR
|
|
13
|
+
import com.google.android.material.color.MaterialColors
|
|
14
|
+
import com.google.android.material.floatingtoolbar.FloatingToolbarLayout
|
|
15
|
+
import com.google.android.material.shape.MaterialShapeDrawable
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* A Material 3 floating toolbar. The Material container (shape, elevation,
|
|
19
|
+
* color) hosts React children, which Fabric lays out itself.
|
|
20
|
+
*/
|
|
21
|
+
class PCFloatingToolbarView(context: Context) :
|
|
22
|
+
FloatingToolbarLayout(
|
|
23
|
+
// Material widgets need a Material theme; fall back to Material 3 defaults instead of crashing.
|
|
24
|
+
PCThemeSupport.materialContext(context, "FloatingToolbar"),
|
|
25
|
+
null,
|
|
26
|
+
0,
|
|
27
|
+
R.style.PCFloatingToolbar
|
|
28
|
+
) {
|
|
29
|
+
|
|
30
|
+
companion object {
|
|
31
|
+
private const val TAG = "PCFloatingToolbar"
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// --- Props ---
|
|
35
|
+
var variant: String = "standard" // "standard" | "vibrant"
|
|
36
|
+
var color: Int? = null
|
|
37
|
+
|
|
38
|
+
/** The button overlay for Buttons inside this toolbar (see PCButtonView). */
|
|
39
|
+
val buttonOverlay: Int
|
|
40
|
+
get() = if (variant == "vibrant") R.style.PCToolbarOverlay_Vibrant else R.style.PCToolbarOverlay
|
|
41
|
+
|
|
42
|
+
// --- Native theme ---
|
|
43
|
+
private val nativeThemeListener = PCNativeTheme.Listener {
|
|
44
|
+
ResourcesCompat.clearCachesForTheme(context.theme)
|
|
45
|
+
applyColors()
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// --- Linked scroll view ---
|
|
49
|
+
var scrollViewNativeID: String = ""
|
|
50
|
+
var hideOnScroll: Boolean = false
|
|
51
|
+
private var watchedScrollView: View? = null
|
|
52
|
+
private var watchedObserver: ViewTreeObserver? = null
|
|
53
|
+
private var lastScrollY = 0
|
|
54
|
+
private var scrollHidden = false
|
|
55
|
+
private val scrollViewFinder = object : ReactFindViewUtil.OnViewFoundListener {
|
|
56
|
+
override fun getNativeId(): String = scrollViewNativeID
|
|
57
|
+
override fun onViewFound(view: View) = watch(view)
|
|
58
|
+
}
|
|
59
|
+
// A tree observer rather than the view's own scroll listener, which a
|
|
60
|
+
// TabBar linked to the same ScrollView would replace
|
|
61
|
+
private val scrollListener = ViewTreeObserver.OnScrollChangedListener {
|
|
62
|
+
val view = watchedScrollView ?: return@OnScrollChangedListener
|
|
63
|
+
val scrollY = view.scrollY
|
|
64
|
+
val dy = scrollY - lastScrollY
|
|
65
|
+
lastScrollY = scrollY
|
|
66
|
+
onContentScrolled(scrollY, dy)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
init {
|
|
70
|
+
clipChildren = false
|
|
71
|
+
clipToPadding = false
|
|
72
|
+
applyColors()
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// ---- Public apply* (called by manager) ----
|
|
76
|
+
|
|
77
|
+
fun applyVariant(value: String?) {
|
|
78
|
+
val parsed = if (value == "vibrant") "vibrant" else "standard"
|
|
79
|
+
if (variant == parsed) return
|
|
80
|
+
variant = parsed
|
|
81
|
+
applyColors()
|
|
82
|
+
// Buttons inside take the toolbar's button styles
|
|
83
|
+
for (i in 0 until childCount) {
|
|
84
|
+
(getChildAt(i) as? PCButtonView)?.refreshToolbarStyle()
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
fun applyColor(value: Int?) {
|
|
89
|
+
if (color == value) return
|
|
90
|
+
color = value
|
|
91
|
+
applyColors()
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* A `backgroundColor` style would replace the Material shape; route it into
|
|
96
|
+
* the color instead. React Native resets it with transparent.
|
|
97
|
+
*/
|
|
98
|
+
override fun setBackgroundColor(color: Int) {
|
|
99
|
+
applyColor(if (color == Color.TRANSPARENT) null else color)
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
private fun applyColors() {
|
|
103
|
+
val resolved = color ?: MaterialColors.getColor(
|
|
104
|
+
this,
|
|
105
|
+
if (variant == "vibrant") MaterialR.attr.colorPrimaryContainer else MaterialR.attr.colorSurfaceContainer,
|
|
106
|
+
Color.TRANSPARENT
|
|
107
|
+
)
|
|
108
|
+
val shape = background as? MaterialShapeDrawable
|
|
109
|
+
if (shape != null) {
|
|
110
|
+
shape.fillColor = ColorStateList.valueOf(resolved)
|
|
111
|
+
} else {
|
|
112
|
+
backgroundTintList = ColorStateList.valueOf(resolved)
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// ---- Hide on scroll ----
|
|
117
|
+
// Material's HideViewOnScrollBehavior only works in a CoordinatorLayout,
|
|
118
|
+
// which a React Native screen doesn't have. The toolbar does its motion
|
|
119
|
+
// itself, as TabBar does: it slides past its edge of the linked ScrollView
|
|
120
|
+
// (175 ms out, 225 ms back) while the content scrolls down, and returns as
|
|
121
|
+
// it scrolls up or reaches the top. The host view moves, so React Native's
|
|
122
|
+
// touch targeting follows it and the content underneath takes the touches.
|
|
123
|
+
|
|
124
|
+
fun applyScrollViewNativeID(value: String) {
|
|
125
|
+
if (scrollViewNativeID == value) return
|
|
126
|
+
scrollViewNativeID = value
|
|
127
|
+
findScrollView()
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
fun applyHideOnScroll(value: Boolean) {
|
|
131
|
+
if (hideOnScroll == value) return
|
|
132
|
+
hideOnScroll = value
|
|
133
|
+
if (!value) setScrollHidden(false)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** The ScrollView with scrollViewNativeID, now or once it mounts. */
|
|
137
|
+
private fun findScrollView() {
|
|
138
|
+
unwatch()
|
|
139
|
+
ReactFindViewUtil.removeViewListener(scrollViewFinder)
|
|
140
|
+
if (scrollViewNativeID.isEmpty() || !isAttachedToWindow) return
|
|
141
|
+
val found = ReactFindViewUtil.findView(rootView, scrollViewNativeID)
|
|
142
|
+
if (found != null) watch(found) else ReactFindViewUtil.addViewListener(scrollViewFinder)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
private fun watch(view: View) {
|
|
146
|
+
ReactFindViewUtil.removeViewListener(scrollViewFinder)
|
|
147
|
+
unwatch()
|
|
148
|
+
watchedScrollView = view
|
|
149
|
+
lastScrollY = view.scrollY
|
|
150
|
+
watchedObserver = view.viewTreeObserver.also { it.addOnScrollChangedListener(scrollListener) }
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
private fun unwatch() {
|
|
154
|
+
watchedObserver?.takeIf { it.isAlive }?.removeOnScrollChangedListener(scrollListener)
|
|
155
|
+
watchedObserver = null
|
|
156
|
+
watchedScrollView = null
|
|
157
|
+
if (scrollHidden) {
|
|
158
|
+
scrollHidden = false
|
|
159
|
+
animate().cancel()
|
|
160
|
+
translationX = 0f
|
|
161
|
+
translationY = 0f
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
private fun onContentScrolled(scrollY: Int, dy: Int) {
|
|
166
|
+
if (!hideOnScroll || dy == 0) return
|
|
167
|
+
// Back at the top the toolbar always shows
|
|
168
|
+
setScrollHidden(scrollY > 0 && dy > 0)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
private fun setScrollHidden(hide: Boolean) {
|
|
172
|
+
if (scrollHidden == hide) return
|
|
173
|
+
scrollHidden = hide
|
|
174
|
+
val (dx, dy) = if (hide) hiddenTranslation() else 0f to 0f
|
|
175
|
+
animate().cancel()
|
|
176
|
+
animate()
|
|
177
|
+
.translationX(dx)
|
|
178
|
+
.translationY(dy)
|
|
179
|
+
.setDuration(if (hide) 175L else 225L)
|
|
180
|
+
.setInterpolator(if (hide) AccelerateInterpolator() else DecelerateInterpolator())
|
|
181
|
+
.start()
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* How far to move to get past the linked edge: top or bottom for a
|
|
186
|
+
* horizontal toolbar, left or right for a vertical one, from the toolbar to
|
|
187
|
+
* that edge of the ScrollView plus the elevation shadow, and at least the
|
|
188
|
+
* toolbar's own size.
|
|
189
|
+
*/
|
|
190
|
+
private fun hiddenTranslation(): Pair<Float, Float> {
|
|
191
|
+
val scrollView = watchedScrollView ?: return 0f to 0f
|
|
192
|
+
val here = IntArray(2).also { getLocationInWindow(it) }
|
|
193
|
+
val there = IntArray(2).also { scrollView.getLocationInWindow(it) }
|
|
194
|
+
// Where the toolbar sits without the translation it may have
|
|
195
|
+
val left = here[0] - translationX
|
|
196
|
+
val top = here[1] - translationY
|
|
197
|
+
val right = left + width
|
|
198
|
+
val bottom = top + height
|
|
199
|
+
val scrollLeft = there[0].toFloat()
|
|
200
|
+
val scrollTop = there[1].toFloat()
|
|
201
|
+
val scrollRight = scrollLeft + scrollView.width
|
|
202
|
+
val scrollBottom = scrollTop + scrollView.height
|
|
203
|
+
val shadow = elevation
|
|
204
|
+
return if (width >= height) {
|
|
205
|
+
if (top + bottom < scrollTop + scrollBottom) {
|
|
206
|
+
0f to minOf(scrollTop - bottom - shadow, -height.toFloat())
|
|
207
|
+
} else {
|
|
208
|
+
0f to maxOf(scrollBottom - top + shadow, height.toFloat())
|
|
209
|
+
}
|
|
210
|
+
} else {
|
|
211
|
+
if (left + right < scrollLeft + scrollRight) {
|
|
212
|
+
minOf(scrollLeft - right - shadow, -width.toFloat()) to 0f
|
|
213
|
+
} else {
|
|
214
|
+
maxOf(scrollRight - left + shadow, width.toFloat()) to 0f
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
override fun onAttachedToWindow() {
|
|
220
|
+
super.onAttachedToWindow()
|
|
221
|
+
PCNativeTheme.addListener(nativeThemeListener)
|
|
222
|
+
PCNativeTheme.attach(context)
|
|
223
|
+
if (watchedScrollView == null) findScrollView()
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
override fun onDetachedFromWindow() {
|
|
227
|
+
ReactFindViewUtil.removeViewListener(scrollViewFinder)
|
|
228
|
+
unwatch()
|
|
229
|
+
PCNativeTheme.removeListener(nativeThemeListener)
|
|
230
|
+
super.onDetachedFromWindow()
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// ---- Layout ----
|
|
234
|
+
// Fabric sizes this view and positions its children; FrameLayout must not
|
|
235
|
+
// re-measure or re-position them against its own padding and gravity.
|
|
236
|
+
|
|
237
|
+
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
|
238
|
+
setMeasuredDimension(
|
|
239
|
+
MeasureSpec.getSize(widthMeasureSpec),
|
|
240
|
+
MeasureSpec.getSize(heightMeasureSpec)
|
|
241
|
+
)
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
|
|
245
|
+
// No-op: Fabric lays out the children
|
|
246
|
+
}
|
|
247
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
package com.platformcomponents
|
|
2
|
+
|
|
3
|
+
import android.view.View
|
|
4
|
+
import com.facebook.react.bridge.ReadableMap
|
|
5
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
6
|
+
import com.facebook.react.uimanager.ViewGroupManager
|
|
7
|
+
import com.facebook.react.uimanager.ViewManagerDelegate
|
|
8
|
+
import com.facebook.react.viewmanagers.PCFloatingToolbarManagerDelegate
|
|
9
|
+
import com.facebook.react.viewmanagers.PCFloatingToolbarManagerInterface
|
|
10
|
+
import com.platformcomponents.PCButtonSupport.stringOr
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Android ViewManager for FloatingToolbar. Uses ViewGroupManager since the
|
|
14
|
+
* toolbar hosts React children.
|
|
15
|
+
*/
|
|
16
|
+
class PCFloatingToolbarViewManager :
|
|
17
|
+
ViewGroupManager<PCFloatingToolbarView>(),
|
|
18
|
+
PCFloatingToolbarManagerInterface<PCFloatingToolbarView> {
|
|
19
|
+
|
|
20
|
+
companion object {
|
|
21
|
+
private const val TAG = "PCFloatingToolbar"
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
private val delegate: ViewManagerDelegate<PCFloatingToolbarView> =
|
|
25
|
+
PCFloatingToolbarManagerDelegate(this)
|
|
26
|
+
|
|
27
|
+
override fun getName(): String = "PCFloatingToolbar"
|
|
28
|
+
|
|
29
|
+
override fun getDelegate(): ViewManagerDelegate<PCFloatingToolbarView> = delegate
|
|
30
|
+
|
|
31
|
+
override fun createViewInstance(reactContext: ThemedReactContext): PCFloatingToolbarView {
|
|
32
|
+
return PCFloatingToolbarView(reactContext)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Colors arrive already processed by React Native (ARGB ints)
|
|
36
|
+
override fun setColor(view: PCFloatingToolbarView, value: Int?) {
|
|
37
|
+
view.applyColor(value)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
override fun setScrollViewNativeID(view: PCFloatingToolbarView, value: String?) {
|
|
41
|
+
view.applyScrollViewNativeID(value ?: "")
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
override fun setHideOnScroll(view: PCFloatingToolbarView, value: Boolean) {
|
|
45
|
+
view.applyHideOnScroll(value)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
override fun setIos(view: PCFloatingToolbarView, value: ReadableMap?) {
|
|
49
|
+
// iOS props are ignored on Android
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// android: {variant}
|
|
53
|
+
override fun setAndroid(view: PCFloatingToolbarView, value: ReadableMap?) {
|
|
54
|
+
view.applyVariant(value?.stringOr("variant", "standard"))
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// --- ViewGroupManager child management ---
|
|
58
|
+
override fun addView(parent: PCFloatingToolbarView, child: View, index: Int) {
|
|
59
|
+
parent.addView(child, index)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
override fun removeViewAt(parent: PCFloatingToolbarView, index: Int) {
|
|
63
|
+
parent.removeViewAt(index)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
override fun getChildCount(parent: PCFloatingToolbarView): Int {
|
|
67
|
+
return parent.childCount
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
override fun getChildAt(parent: PCFloatingToolbarView, index: Int): View? {
|
|
71
|
+
return parent.getChildAt(index)
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
package com.platformcomponents
|
|
2
|
+
|
|
3
|
+
import android.os.Build
|
|
4
|
+
import android.view.HapticFeedbackConstants
|
|
5
|
+
import android.view.View
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The shared `haptics` prop: `View.performHapticFeedback` with the matching
|
|
9
|
+
* `HapticFeedbackConstants`, played when a control reports the user's action.
|
|
10
|
+
* The system touch-feedback setting applies (no ignore flags are passed).
|
|
11
|
+
*/
|
|
12
|
+
object PCHaptics {
|
|
13
|
+
/**
|
|
14
|
+
* Applies a `haptics` value to [view]: "none" turns off the haptics the view
|
|
15
|
+
* plays itself (such as a long press), anything else turns them back on.
|
|
16
|
+
* Returns the value for the view to keep ("" when unset).
|
|
17
|
+
*/
|
|
18
|
+
fun configure(view: View, value: String?): String {
|
|
19
|
+
val kind = value ?: ""
|
|
20
|
+
view.isHapticFeedbackEnabled = kind != "none"
|
|
21
|
+
return kind
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Plays [kind] on [view]; "" and "none" play nothing. */
|
|
25
|
+
fun perform(view: View, kind: String) {
|
|
26
|
+
val constant = constantFor(kind) ?: return
|
|
27
|
+
view.performHapticFeedback(constant)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** The feedback constant for a `haptics` value, with fallbacks below the API level that added it. */
|
|
31
|
+
fun constantFor(kind: String): Int? = when (kind) {
|
|
32
|
+
"selection" ->
|
|
33
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) HapticFeedbackConstants.SEGMENT_TICK
|
|
34
|
+
else HapticFeedbackConstants.CLOCK_TICK
|
|
35
|
+
"light" -> HapticFeedbackConstants.CONTEXT_CLICK
|
|
36
|
+
"medium" -> HapticFeedbackConstants.VIRTUAL_KEY
|
|
37
|
+
"heavy" -> HapticFeedbackConstants.LONG_PRESS
|
|
38
|
+
"success" ->
|
|
39
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) HapticFeedbackConstants.CONFIRM
|
|
40
|
+
else HapticFeedbackConstants.VIRTUAL_KEY
|
|
41
|
+
"warning", "error" ->
|
|
42
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) HapticFeedbackConstants.REJECT
|
|
43
|
+
else HapticFeedbackConstants.LONG_PRESS
|
|
44
|
+
else -> null
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -13,6 +13,8 @@ import android.util.LruCache
|
|
|
13
13
|
import java.net.HttpURLConnection
|
|
14
14
|
import java.net.URL
|
|
15
15
|
import java.util.concurrent.Executors
|
|
16
|
+
import org.json.JSONArray
|
|
17
|
+
import org.json.JSONObject
|
|
16
18
|
import kotlin.math.roundToInt
|
|
17
19
|
|
|
18
20
|
/**
|
|
@@ -30,6 +32,9 @@ object PCImageLoader {
|
|
|
30
32
|
private val executor = Executors.newFixedThreadPool(2)
|
|
31
33
|
private val mainHandler = Handler(Looper.getMainLooper())
|
|
32
34
|
private val cache = LruCache<String, Bitmap>(32)
|
|
35
|
+
private val cacheLock = Any()
|
|
36
|
+
private var nextGeneration = 0L
|
|
37
|
+
private val generations = mutableMapOf<String, Long>()
|
|
33
38
|
|
|
34
39
|
/**
|
|
35
40
|
* Loads [uri] and delivers the bitmap on the main thread. [scale] is the
|
|
@@ -38,37 +43,67 @@ object PCImageLoader {
|
|
|
38
43
|
*
|
|
39
44
|
* Cached images are delivered synchronously.
|
|
40
45
|
*/
|
|
41
|
-
fun load(context: Context, uri: String, scale: Float, callback: (Bitmap?) -> Unit) {
|
|
42
|
-
val
|
|
43
|
-
|
|
46
|
+
fun load(context: Context, uri: String, scale: Float, request: String = "", callback: (Bitmap?) -> Unit) {
|
|
47
|
+
val options = try { if (request.isEmpty()) JSONObject() else JSONObject(request) }
|
|
48
|
+
catch (_: Exception) { callback(null); return }
|
|
49
|
+
val policy = options.optString("cache", "default")
|
|
50
|
+
options.remove("cache")
|
|
51
|
+
val key = JSONArray().put(uri).put(scale.toDouble()).put(options).toString()
|
|
52
|
+
val cached = if (policy == "reload") null else cache.get(key)
|
|
53
|
+
cached?.let {
|
|
44
54
|
callback(it)
|
|
45
55
|
return
|
|
46
56
|
}
|
|
57
|
+
if (policy == "only-if-cached") { callback(null); return }
|
|
58
|
+
val generation = synchronized(cacheLock) {
|
|
59
|
+
nextGeneration += 1
|
|
60
|
+
generations[key] = nextGeneration
|
|
61
|
+
nextGeneration
|
|
62
|
+
}
|
|
47
63
|
|
|
48
64
|
val appContext = context.applicationContext
|
|
49
65
|
executor.execute {
|
|
66
|
+
var canCache = true
|
|
50
67
|
val bitmap = try {
|
|
51
|
-
decode(appContext, uri)
|
|
68
|
+
decode(appContext, uri, options) { canCache = it }
|
|
52
69
|
} catch (e: Exception) {
|
|
53
|
-
|
|
70
|
+
// Image URIs may carry credentials or signed query parameters.
|
|
71
|
+
Log.w(TAG, "Failed to load image (${e.javaClass.simpleName})")
|
|
54
72
|
null
|
|
55
73
|
}
|
|
56
74
|
if (bitmap != null) {
|
|
57
75
|
bitmap.density = (scale.coerceAtLeast(0.01f) * DisplayMetrics.DENSITY_DEFAULT).roundToInt()
|
|
58
|
-
|
|
76
|
+
}
|
|
77
|
+
synchronized(cacheLock) {
|
|
78
|
+
if (generations[key] == generation) {
|
|
79
|
+
if (bitmap != null && canCache) cache.put(key, bitmap) else cache.remove(key)
|
|
80
|
+
generations.remove(key)
|
|
81
|
+
}
|
|
59
82
|
}
|
|
60
83
|
mainHandler.post { callback(bitmap) }
|
|
61
84
|
}
|
|
62
85
|
}
|
|
63
86
|
|
|
64
|
-
private fun decode(context: Context, uri: String): Bitmap? {
|
|
87
|
+
private fun decode(context: Context, uri: String, options: JSONObject, cacheable: (Boolean) -> Unit): Bitmap? {
|
|
65
88
|
val parsed = Uri.parse(uri)
|
|
66
89
|
return when (parsed.scheme?.lowercase()) {
|
|
67
90
|
"http", "https" -> {
|
|
68
91
|
val connection = URL(uri).openConnection() as HttpURLConnection
|
|
69
92
|
connection.connectTimeout = TIMEOUT_MS
|
|
70
93
|
connection.readTimeout = TIMEOUT_MS
|
|
94
|
+
connection.useCaches = false
|
|
95
|
+
connection.instanceFollowRedirects = options.length() == 0
|
|
96
|
+
connection.requestMethod = options.optString("method", "GET")
|
|
97
|
+
options.optJSONObject("headers")?.let { headers ->
|
|
98
|
+
for (name in headers.keys()) connection.setRequestProperty(name, headers.getString(name))
|
|
99
|
+
}
|
|
71
100
|
try {
|
|
101
|
+
if (options.has("body")) {
|
|
102
|
+
connection.doOutput = true
|
|
103
|
+
connection.outputStream.use { it.write(options.getString("body").toByteArray(Charsets.UTF_8)) }
|
|
104
|
+
}
|
|
105
|
+
if (connection.responseCode !in 200..299) return null
|
|
106
|
+
cacheable(!connection.getHeaderField("Cache-Control").orEmpty().contains("no-store", ignoreCase = true))
|
|
72
107
|
connection.inputStream.use { BitmapFactory.decodeStream(it) }
|
|
73
108
|
} finally {
|
|
74
109
|
connection.disconnect()
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
package com.platformcomponents
|
|
2
|
+
|
|
3
|
+
import android.content.Context
|
|
4
|
+
import android.view.ViewGroup
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Android implementation of LiquidGlassContainer.
|
|
8
|
+
*
|
|
9
|
+
* Glass containers are an iOS 26 feature, so on Android this is a plain
|
|
10
|
+
* container: React lays out the children, and `spacing` has no effect.
|
|
11
|
+
*/
|
|
12
|
+
class PCLiquidGlassContainerView(context: Context) : ViewGroup(context) {
|
|
13
|
+
|
|
14
|
+
init {
|
|
15
|
+
clipChildren = false
|
|
16
|
+
clipToPadding = false
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// ---- Layout ----
|
|
20
|
+
// Fabric sizes this view and positions its children.
|
|
21
|
+
|
|
22
|
+
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
|
23
|
+
setMeasuredDimension(
|
|
24
|
+
MeasureSpec.getSize(widthMeasureSpec),
|
|
25
|
+
MeasureSpec.getSize(heightMeasureSpec)
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
|
|
30
|
+
// No-op: Fabric lays out the children
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
package com.platformcomponents
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
4
|
+
import com.facebook.react.uimanager.ViewGroupManager
|
|
5
|
+
import com.facebook.react.uimanager.ViewManagerDelegate
|
|
6
|
+
import com.facebook.react.viewmanagers.PCLiquidGlassContainerManagerDelegate
|
|
7
|
+
import com.facebook.react.viewmanagers.PCLiquidGlassContainerManagerInterface
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Android ViewManager for LiquidGlassContainer: a plain container, since
|
|
11
|
+
* glass containers are iOS 26 only.
|
|
12
|
+
*/
|
|
13
|
+
class PCLiquidGlassContainerViewManager :
|
|
14
|
+
ViewGroupManager<PCLiquidGlassContainerView>(),
|
|
15
|
+
PCLiquidGlassContainerManagerInterface<PCLiquidGlassContainerView> {
|
|
16
|
+
|
|
17
|
+
private val delegate: ViewManagerDelegate<PCLiquidGlassContainerView> =
|
|
18
|
+
PCLiquidGlassContainerManagerDelegate(this)
|
|
19
|
+
|
|
20
|
+
override fun getName(): String = "PCLiquidGlassContainer"
|
|
21
|
+
|
|
22
|
+
override fun getDelegate(): ViewManagerDelegate<PCLiquidGlassContainerView> = delegate
|
|
23
|
+
|
|
24
|
+
override fun createViewInstance(reactContext: ThemedReactContext): PCLiquidGlassContainerView {
|
|
25
|
+
return PCLiquidGlassContainerView(reactContext)
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
override fun setSpacing(view: PCLiquidGlassContainerView, value: Float) {
|
|
29
|
+
// Glass merging is iOS only
|
|
30
|
+
}
|
|
31
|
+
}
|