react-native-ui-lib 7.46.3-snapshot.7341 → 7.46.3-snapshot.7342

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.
Files changed (202) hide show
  1. package/babel.config.js +0 -12
  2. package/index.js +0 -1
  3. package/lib/android/build.gradle +5 -5
  4. package/lib/android/src/main/java/com/wix/reactnativeuilib/UiLibPackageList.java +2 -0
  5. package/lib/android/src/main/java/com/wix/reactnativeuilib/highlighterview/HighlighterViewManager.java +23 -31
  6. package/lib/android/src/main/java/com/wix/reactnativeuilib/highlighterview/ReactHacks.java +30 -0
  7. package/lib/android/src/main/java/com/wix/reactnativeuilib/highlighterview/ReflectionUtils.java +34 -0
  8. package/lib/android/src/main/java/com/wix/reactnativeuilib/keyboardinput/utils/RuntimeUtils.java +1 -1
  9. package/lib/android/src/main/java/com/wix/reactnativeuilib/textinput/DefaultKeyListener.java +33 -0
  10. package/lib/android/src/main/java/com/wix/reactnativeuilib/textinput/KeyListenerProxy.java +53 -0
  11. package/lib/android/src/main/java/com/wix/reactnativeuilib/textinput/TextInputDelKeyHandlerModule.java +54 -0
  12. package/lib/android/src/main/java/com/wix/reactnativeuilib/textinput/TextInputDelKeyHandlerPackage.java +28 -0
  13. package/lib/android/src/main/java/com/wix/reactnativeuilib/textinput/ViewUtils.java +36 -0
  14. package/lib/components/{HighlighterOverlayView/index.d.ts → HighlighterOverlayView.d.ts} +1 -1
  15. package/lib/components/HighlighterOverlayView.js +40 -0
  16. package/lib/components/{HighlighterOverlayView/index.web.d.ts → HighlighterOverlayView.web.d.ts} +1 -1
  17. package/lib/components/Keyboard/{KeyboardAccessoryView → KeyboardInput}/CustomKeyboardView/CustomKeyboardView.android.d.ts +2 -5
  18. package/lib/components/Keyboard/KeyboardInput/CustomKeyboardView/CustomKeyboardView.android.js +28 -0
  19. package/lib/components/Keyboard/{KeyboardAccessoryView → KeyboardInput}/CustomKeyboardView/CustomKeyboardView.ios.d.ts +1 -1
  20. package/lib/components/Keyboard/{KeyboardAccessoryView → KeyboardInput}/CustomKeyboardView/CustomKeyboardView.ios.js +3 -3
  21. package/lib/components/Keyboard/{KeyboardAccessoryView/CustomKeyboardView → KeyboardInput}/CustomKeyboardViewBase.d.ts +0 -3
  22. package/lib/components/Keyboard/{KeyboardAccessoryView/CustomKeyboardView → KeyboardInput}/CustomKeyboardViewBase.js +1 -1
  23. package/lib/components/Keyboard/{KeyboardAccessoryView/index.d.ts → KeyboardInput/KeyboardAccessoryView.d.ts} +1 -11
  24. package/lib/components/Keyboard/{KeyboardAccessoryView/index.js → KeyboardInput/KeyboardAccessoryView.js} +5 -31
  25. package/lib/components/Keyboard/{KeyboardAccessoryView/KeyboardRegistry/index.d.ts → KeyboardInput/KeyboardRegistry.d.ts} +1 -1
  26. package/lib/components/Keyboard/{KeyboardAccessoryView/KeyboardRegistry/index.js → KeyboardInput/KeyboardRegistry.js} +1 -1
  27. package/lib/components/Keyboard/{KeyboardAccessoryView/KeyboardRegistry → KeyboardInput}/__tests__/KeyboardRegistry.spec.js +1 -1
  28. package/lib/components/Keyboard/{KeyboardAccessoryView → KeyboardInput}/keyboardAccessoryView.api.json +5 -5
  29. package/lib/components/Keyboard/{KeyboardAccessoryView/KeyboardRegistry → KeyboardInput}/keyboardRegistry.api.json +9 -9
  30. package/lib/components/Keyboard/KeyboardInput/utils/KeyboardUtils.d.ts +11 -0
  31. package/lib/components/Keyboard/KeyboardInput/utils/KeyboardUtils.js +17 -0
  32. package/lib/components/Keyboard/{KeyboardAccessoryView/KeyboardRegistry/EventEmitterManager → KeyboardInput/utils}/__tests__/EventEmitterManager.spec.js +1 -1
  33. package/lib/components/Keyboard/{KeyboardAwareInsetsView/index.d.ts → KeyboardTracking/KeyboardAwareInsetsView.d.ts} +1 -1
  34. package/lib/components/Keyboard/{KeyboardAwareInsetsView/index.js → KeyboardTracking/KeyboardAwareInsetsView.js} +1 -1
  35. package/lib/components/Keyboard/{KeyboardTrackingView → KeyboardTracking/KeyboardTrackingView}/KeyboardTrackingView.ios.d.ts +4 -1
  36. package/lib/components/Keyboard/{KeyboardTrackingView → KeyboardTracking/KeyboardTrackingView}/KeyboardTrackingView.ios.js +8 -5
  37. package/lib/components/Keyboard/{KeyboardTrackingView → KeyboardTracking/KeyboardTrackingView}/index.d.ts +2 -2
  38. package/lib/components/Keyboard/{KeyboardTrackingView → KeyboardTracking/KeyboardTrackingView}/keyboardTrackingView.api.json +20 -11
  39. package/lib/components/Keyboard/index.d.ts +6 -6
  40. package/lib/components/Keyboard/index.js +6 -6
  41. package/lib/components/SafeArea/SafeAreaInsetsManager.d.ts +7 -21
  42. package/lib/components/SafeArea/SafeAreaInsetsManager.js +31 -95
  43. package/lib/components/SafeArea/SafeAreaSpacerView.d.ts +2 -2
  44. package/lib/components/SafeArea/SafeAreaSpacerView.js +9 -63
  45. package/lib/components/index.d.ts +1 -1
  46. package/lib/components/index.js +1 -1
  47. package/lib/ios/reactnativeuilib/keyboardinput/rctcustomInputcontroller/RCTCustomInputControllerTemp.m +8 -52
  48. package/lib/ios/reactnativeuilib/keyboardinput/rctcustomInputcontroller/RCTCustomKeyboardViewControllerTemp.h +7 -1
  49. package/lib/ios/reactnativeuilib/keyboardinput/rctcustomInputcontroller/RCTCustomKeyboardViewControllerTemp.m +1 -1
  50. package/lib/ios/reactnativeuilib/keyboardtrackingview/KeyboardTrackingViewTempManager.m +41 -109
  51. package/lib/package.json +1 -1
  52. package/lib/react-native.config.js +3 -1
  53. package/metro.config.js +2 -2
  54. package/package.json +25 -25
  55. package/panningViews.d.ts +2 -0
  56. package/panningViews.js +1 -0
  57. package/react-native.config.js +3 -1
  58. package/scripts/release/prReleaseNotesCommon.js +15 -4
  59. package/sharedTransition.d.ts +2 -0
  60. package/sharedTransition.js +1 -0
  61. package/src/commons/Constants.js +5 -2
  62. package/src/components/KeyboardAwareScrollView/KeyboardAwareBase.js +1 -5
  63. package/src/components/actionSheet/index.d.ts +12 -2
  64. package/src/components/actionSheet/index.js +42 -3
  65. package/src/components/badge/index.d.ts +47 -107
  66. package/src/components/button/button.api.json +1 -1
  67. package/src/components/button/index.d.ts +23 -53
  68. package/src/components/button/types.d.ts +1 -0
  69. package/src/components/colorPicker/ColorPickerDialog.d.ts +1 -1
  70. package/src/components/colorPicker/ColorPickerDialog.js +1 -1
  71. package/src/components/dateTimePicker/index.d.ts +5 -186
  72. package/src/components/dateTimePicker/index.js +4 -3
  73. package/src/components/dialog/DialogDismissibleView.d.ts +34 -0
  74. package/src/components/dialog/DialogDismissibleView.js +184 -0
  75. package/src/components/dialog/OverlayFadingBackground.d.ts +14 -0
  76. package/src/components/dialog/OverlayFadingBackground.js +45 -0
  77. package/src/components/dialog/dialog.api.json +37 -31
  78. package/src/components/dialog/index.d.ts +105 -13
  79. package/src/components/dialog/index.js +212 -204
  80. package/src/components/drawer/Swipeable.js +2 -1
  81. package/src/components/drawer/index.js +25 -31
  82. package/src/components/fadedScrollView/index.js +2 -7
  83. package/src/components/featureHighlight/index.d.ts +1 -1
  84. package/src/components/index.js +19 -0
  85. package/src/components/marquee/types.js +1 -4
  86. package/src/components/modal/index.d.ts +0 -5
  87. package/src/components/modal/index.js +10 -14
  88. package/src/components/modal/modal.api.json +0 -5
  89. package/src/components/panningViews/asPanViewConsumer.d.ts +3 -0
  90. package/src/components/panningViews/asPanViewConsumer.js +16 -0
  91. package/src/components/panningViews/panDismissibleView.d.ts +51 -0
  92. package/src/components/panningViews/panDismissibleView.js +350 -0
  93. package/src/components/panningViews/panGestureView.d.ts +23 -0
  94. package/src/components/panningViews/panGestureView.js +156 -0
  95. package/src/components/panningViews/panListenerView.d.ts +66 -0
  96. package/src/components/panningViews/panListenerView.js +155 -0
  97. package/src/components/panningViews/panResponderView.d.ts +19 -0
  98. package/src/components/panningViews/panResponderView.js +79 -0
  99. package/src/components/panningViews/panningContext.d.ts +3 -0
  100. package/src/components/panningViews/panningContext.js +4 -0
  101. package/src/components/panningViews/panningProvider.d.ts +73 -0
  102. package/src/components/panningViews/panningProvider.js +101 -0
  103. package/src/components/picker/Picker.driver.new.d.ts +2 -2
  104. package/src/components/picker/Picker.driver.new.js +3 -3
  105. package/src/components/picker/PickerItem.js +20 -6
  106. package/src/components/picker/PickerPresenter.d.ts +1 -0
  107. package/src/components/picker/PickerPresenter.js +23 -1
  108. package/src/components/picker/api/picker.api.json +1 -0
  109. package/src/components/picker/api/pickerItem.api.json +5 -0
  110. package/src/components/picker/helpers/useFieldType.d.ts +23 -53
  111. package/src/components/picker/helpers/usePickerLabel.d.ts +1 -1
  112. package/src/components/picker/helpers/usePickerLabel.js +3 -2
  113. package/src/components/picker/helpers/usePickerMigrationWarnings.d.ts +1 -1
  114. package/src/components/picker/helpers/usePickerMigrationWarnings.js +12 -0
  115. package/src/components/picker/helpers/usePickerSearch.d.ts +1 -1
  116. package/src/components/picker/helpers/usePickerSearch.js +8 -4
  117. package/src/components/picker/helpers/usePickerSelection.d.ts +1 -1
  118. package/src/components/picker/helpers/usePickerSelection.js +10 -2
  119. package/src/components/picker/index.js +22 -4
  120. package/src/components/picker/types.d.ts +24 -1
  121. package/src/components/segmentedControl/index.js +3 -3
  122. package/src/components/sharedTransition/ShareTransitionContext.js +3 -0
  123. package/src/components/sharedTransition/SharedArea.js +153 -0
  124. package/src/components/sharedTransition/SourceElement.js +44 -0
  125. package/src/components/sharedTransition/TargetElement.js +38 -0
  126. package/src/components/sharedTransition/index.js +9 -0
  127. package/src/components/slider/GradientSlider.d.ts +1 -1
  128. package/src/components/sortableGridList/SortableItem.js +4 -13
  129. package/src/components/sortableList/SortableListItem.js +4 -13
  130. package/src/components/stackAggregator/index.js +11 -16
  131. package/src/components/text/Text.driver.new.d.ts +2 -2
  132. package/src/components/text/Text.driver.new.js +2 -2
  133. package/src/components/textField/Input.js +1 -0
  134. package/src/components/textField/TextField.driver.new.d.ts +2 -2
  135. package/src/components/textField/TextField.driver.new.js +2 -2
  136. package/src/components/textField/presets/outline.d.ts +46 -106
  137. package/src/components/textField/presets/underline.d.ts +46 -106
  138. package/src/components/textField/types.js +0 -1
  139. package/src/components/textField/usePreset.d.ts +44 -72
  140. package/src/components/timeline/types.js +0 -3
  141. package/src/incubator/dialog/dialog.api.json +54 -0
  142. package/src/{components → incubator}/dialog/dialogHeader.api.json +2 -2
  143. package/src/incubator/dialog/index.d.ts +15 -0
  144. package/src/incubator/dialog/index.js +218 -0
  145. package/src/{components → incubator}/dialog/types.d.ts +19 -0
  146. package/src/{components → incubator}/dialog/types.js +3 -1
  147. package/src/{components → incubator}/dialog/useDialogContent.d.ts +1 -1
  148. package/src/incubator/expandableOverlay/ExpandableOverlay.driver.js +1 -1
  149. package/src/incubator/expandableOverlay/index.d.ts +3 -42
  150. package/src/incubator/expandableOverlay/index.js +4 -1
  151. package/src/{hooks/useHiddenLocation/index.d.ts → incubator/hooks/useHiddenLocation.d.ts} +1 -1
  152. package/src/{hooks/useHiddenLocation/index.web.d.ts → incubator/hooks/useHiddenLocation.web.d.ts} +1 -1
  153. package/src/incubator/index.d.ts +2 -0
  154. package/src/incubator/index.js +2 -0
  155. package/src/{components → incubator}/panView/index.d.ts +3 -3
  156. package/src/{components → incubator}/panView/index.js +4 -4
  157. package/src/{components → incubator}/panView/usePanGesture.d.ts +1 -1
  158. package/src/incubator/toast/index.js +1 -1
  159. package/src/index.d.ts +10 -3
  160. package/src/index.js +162 -42
  161. package/src/testkit/index.d.ts +1 -1
  162. package/src/testkit/index.js +1 -1
  163. package/src/testkit/new/Component.driver.d.ts +1 -4
  164. package/src/testkit/new/Component.driver.js +3 -3
  165. package/lib/components/HighlighterOverlayView/index.js +0 -49
  166. package/lib/components/Keyboard/KeyboardAccessoryView/CustomKeyboardView/CustomKeyboardView.android.js +0 -51
  167. package/lib/components/Keyboard/KeyboardAccessoryView/KeyboardUtils/index.d.ts +0 -26
  168. package/lib/components/Keyboard/KeyboardAccessoryView/KeyboardUtils/index.js +0 -91
  169. package/lib/components/SafeArea/__tests__/SafeAreaInsetsManager.spec.js +0 -274
  170. package/lib/components/SafeArea/index.d.ts +0 -10
  171. package/lib/components/SafeArea/index.js +0 -11
  172. package/panView.d.ts +0 -2
  173. package/panView.js +0 -1
  174. /package/lib/components/{HighlighterOverlayView/index.web.js → HighlighterOverlayView.web.js} +0 -0
  175. /package/lib/components/Keyboard/{KeyboardAccessoryView → KeyboardInput}/CustomKeyboardView/index.d.ts +0 -0
  176. /package/lib/components/Keyboard/{KeyboardAccessoryView → KeyboardInput}/CustomKeyboardView/index.js +0 -0
  177. /package/lib/components/Keyboard/{KeyboardAccessoryView → KeyboardInput}/CustomKeyboardView/index.web.d.ts +0 -0
  178. /package/lib/components/Keyboard/{KeyboardAccessoryView → KeyboardInput}/CustomKeyboardView/index.web.js +0 -0
  179. /package/lib/components/Keyboard/{KeyboardAccessoryView → KeyboardInput}/TextInputKeyboardManager/TextInputKeyboardManager.android.d.ts +0 -0
  180. /package/lib/components/Keyboard/{KeyboardAccessoryView → KeyboardInput}/TextInputKeyboardManager/TextInputKeyboardManager.android.js +0 -0
  181. /package/lib/components/Keyboard/{KeyboardAccessoryView → KeyboardInput}/TextInputKeyboardManager/TextInputKeyboardManager.ios.d.ts +0 -0
  182. /package/lib/components/Keyboard/{KeyboardAccessoryView → KeyboardInput}/TextInputKeyboardManager/TextInputKeyboardManager.ios.js +0 -0
  183. /package/lib/components/Keyboard/{KeyboardAccessoryView → KeyboardInput}/TextInputKeyboardManager/index.d.ts +0 -0
  184. /package/lib/components/Keyboard/{KeyboardAccessoryView → KeyboardInput}/TextInputKeyboardManager/index.js +0 -0
  185. /package/lib/components/Keyboard/{KeyboardAccessoryView/KeyboardRegistry/EventEmitterManager/index.d.ts → KeyboardInput/utils/EventEmitterManager.d.ts} +0 -0
  186. /package/lib/components/Keyboard/{KeyboardAccessoryView/KeyboardRegistry/EventEmitterManager/index.js → KeyboardInput/utils/EventEmitterManager.js} +0 -0
  187. /package/lib/components/Keyboard/{KeyboardTrackingView → KeyboardTracking/KeyboardTrackingView}/KeyboardTrackingView.android.d.ts +0 -0
  188. /package/lib/components/Keyboard/{KeyboardTrackingView → KeyboardTracking/KeyboardTrackingView}/KeyboardTrackingView.android.js +0 -0
  189. /package/lib/components/Keyboard/{KeyboardTrackingView → KeyboardTracking/KeyboardTrackingView}/index.js +0 -0
  190. /package/lib/components/Keyboard/{KeyboardTrackingView → KeyboardTracking/KeyboardTrackingView}/index.web.d.ts +0 -0
  191. /package/lib/components/Keyboard/{KeyboardTrackingView → KeyboardTracking/KeyboardTrackingView}/index.web.js +0 -0
  192. /package/lib/components/Keyboard/{KeyboardAwareInsetsView → KeyboardTracking}/keyboardAwareInsetsView.api.json +0 -0
  193. /package/src/{components → incubator}/dialog/Dialog.driver.new.d.ts +0 -0
  194. /package/src/{components → incubator}/dialog/Dialog.driver.new.js +0 -0
  195. /package/src/{components → incubator}/dialog/DialogHeader.d.ts +0 -0
  196. /package/src/{components → incubator}/dialog/DialogHeader.js +0 -0
  197. /package/src/{components → incubator}/dialog/useDialogContent.js +0 -0
  198. /package/src/{hooks/useHiddenLocation/index.js → incubator/hooks/useHiddenLocation.js} +0 -0
  199. /package/src/{hooks/useHiddenLocation/index.web.js → incubator/hooks/useHiddenLocation.web.js} +0 -0
  200. /package/src/{components → incubator}/panView/panningUtil.d.ts +0 -0
  201. /package/src/{components → incubator}/panView/panningUtil.js +0 -0
  202. /package/src/{components → incubator}/panView/usePanGesture.js +0 -0
@@ -1,15 +1,107 @@
1
- import React from 'react';
2
- import DialogHeader from './DialogHeader';
3
- import { DialogProps, DialogDirections, DialogDirectionsEnum, DialogHeaderProps } from './types';
4
- export { DialogProps, DialogDirections, DialogDirectionsEnum, DialogHeaderProps };
5
- export interface DialogStatics {
6
- directions: typeof DialogDirectionsEnum;
7
- Header: typeof DialogHeader;
8
- }
9
- export interface DialogImperativeMethods {
10
- dismiss: () => void;
11
- }
12
- declare const _default: React.ForwardRefExoticComponent<import("./types")._DialogProps & {
1
+ import React, { Component } from 'react';
2
+ import { StyleProp, ViewStyle, ModalPropsIOS, AccessibilityProps, type DimensionValue } from 'react-native';
3
+ import { AlignmentModifiers } from '../../commons/modifiers';
4
+ import { ModalProps } from '../modal';
5
+ import { PanningDirections, PanningDirectionsEnum } from '../panningViews/panningProvider';
6
+ export { PanningDirections as DialogDirections, PanningDirectionsEnum as DialogDirectionsEnum };
7
+ interface RNPartialProps extends Pick<ModalPropsIOS, 'supportedOrientations'>, Pick<AccessibilityProps, 'accessibilityLabel'> {
8
+ }
9
+ export interface DialogProps extends AlignmentModifiers, RNPartialProps {
10
+ /**
11
+ * Control visibility of the dialog
12
+ */
13
+ visible?: boolean;
14
+ /**
15
+ * Dismiss callback for when clicking on the background
16
+ */
17
+ onDismiss?: (props?: any) => void;
18
+ /**
19
+ * Whether or not to ignore background press
20
+ */
21
+ ignoreBackgroundPress?: boolean;
22
+ /**
23
+ * The color of the overlay background
24
+ */
25
+ overlayBackgroundColor?: string;
26
+ /**
27
+ * The dialog width (default: 90%)
28
+ */
29
+ width?: DimensionValue;
30
+ /**
31
+ * The dialog height (default: undefined)
32
+ */
33
+ height?: DimensionValue;
34
+ /**
35
+ * The direction of the allowed pan (default is DOWN).
36
+ * Types: UP, DOWN, LEFT and RIGHT (using PanningProvider.Directions.###).
37
+ * Pass null to remove pan.
38
+ */
39
+ panDirection?: PanningDirections;
40
+ /**
41
+ * Whether or not to handle SafeArea
42
+ */
43
+ useSafeArea?: boolean;
44
+ /**
45
+ * Called once the dialog has been dismissed completely
46
+ */
47
+ onDialogDismissed?: (props: any) => void;
48
+ /**
49
+ * If this is added only the header will be pannable;
50
+ * this allows for scrollable content (the children of the dialog)
51
+ * props are transferred to the renderPannableHeader
52
+ */
53
+ renderPannableHeader?: (props: any) => JSX.Element;
54
+ /**
55
+ * The props that will be passed to the pannable header
56
+ */
57
+ pannableHeaderProps?: any;
58
+ /**
59
+ * Additional props for the modal.
60
+ */
61
+ modalProps?: ModalProps;
62
+ /**
63
+ * The Dialog`s container style
64
+ */
65
+ containerStyle?: StyleProp<ViewStyle>;
66
+ /**
67
+ * Used as a testing identifier
68
+ */
69
+ testID?: string;
13
70
  children?: React.ReactNode;
14
- } & React.RefAttributes<any>> & DialogStatics;
71
+ }
72
+ interface DialogState {
73
+ alignments: AlignmentModifiers;
74
+ modalVisibility?: boolean;
75
+ dialogVisibility?: boolean;
76
+ fadeOut?: boolean;
77
+ }
78
+ /**
79
+ * @description: Dialog component for displaying custom content inside a popup dialog
80
+ * @notes: Use alignment modifiers to control the dialog position
81
+ * (top, bottom, centerV, centerH, etc... by default the dialog is aligned to center)
82
+ * @modifiers: alignment
83
+ * @example: https://github.com/wix/react-native-ui-lib/blob/master/demo/src/screens/componentScreens/DialogScreen.js
84
+ * @gif: https://github.com/wix/react-native-ui-lib/blob/master/demo/showcase/Dialog/Dialog.gif?raw=true
85
+ */
86
+ declare class Dialog extends Component<DialogProps, DialogState> {
87
+ static displayName: string;
88
+ static directions: typeof PanningDirectionsEnum;
89
+ static defaultProps: {
90
+ overlayBackgroundColor: string | undefined;
91
+ };
92
+ private styles;
93
+ constructor(props: DialogProps);
94
+ UNSAFE_componentWillReceiveProps(nextProps: DialogProps): void;
95
+ setAlignment(): void;
96
+ onFadeDone: () => void;
97
+ _onDismiss: () => void;
98
+ onDismiss: () => void;
99
+ hideDialogView: () => void;
100
+ renderPannableHeader: (directions: PanningDirections[]) => React.JSX.Element | undefined;
101
+ getContainerType: () => React.ForwardRefExoticComponent<import("../view").ViewProps & React.RefAttributes<import("react-native").View>> | React.ComponentClass<import("../panningViews/panListenerView").PanListenerViewProps, any>;
102
+ renderDialogView: () => React.JSX.Element;
103
+ renderDialogContainer: () => React.JSX.Element;
104
+ render: () => React.JSX.Element;
105
+ }
106
+ declare const _default: React.ForwardRefExoticComponent<DialogProps & React.RefAttributes<any>> & typeof Dialog;
15
107
  export default _default;
@@ -1,218 +1,226 @@
1
- import React, { useMemo, useCallback, useImperativeHandle, forwardRef, useEffect, useState } from 'react';
1
+ import _isEmpty from "lodash/isEmpty";
2
+ import React, { Component } from 'react';
2
3
  import { StyleSheet } from 'react-native';
3
- import hoistStatics from 'hoist-non-react-statics';
4
- import { Extrapolation, interpolate, runOnJS, useAnimatedStyle, useSharedValue, withSpring, withTiming } from 'react-native-reanimated';
5
- import { Gesture, GestureDetector } from 'react-native-gesture-handler';
6
- import { Spacings, Colors, BorderRadiuses } from "../../style";
7
- import { useDidUpdate } from "../../hooks";
8
- import { asBaseComponent, Constants } from "../../commons/new";
9
- import View from "../../components/view";
10
- import Modal from "../../components/modal";
4
+ import { Colors } from "../../style";
11
5
  import { extractAlignmentsValues } from "../../commons/modifiers";
12
- import useHiddenLocation from "../../hooks/useHiddenLocation";
13
- import DialogHeader from "./DialogHeader";
14
- import useDialogContent from "./useDialogContent";
15
- import { DialogProps, DialogDirections, DialogDirectionsEnum, DialogHeaderProps } from "./types";
16
- export { DialogProps, DialogDirections, DialogDirectionsEnum, DialogHeaderProps };
17
- const THRESHOLD_VELOCITY = 750;
18
- const Dialog = (props, ref) => {
19
- const {
20
- visible = false,
21
- headerProps,
22
- showCloseButton,
23
- closeButtonProps,
24
- containerStyle: propsContainerStyle,
25
- containerProps: propsContainerProps,
26
- width,
27
- height,
28
- onDismiss,
29
- direction = DialogDirectionsEnum.DOWN,
30
- ignoreBackgroundPress,
31
- modalProps = {},
32
- useSafeArea,
33
- testID,
34
- children
35
- } = props;
36
- const {
37
- overlayBackgroundColor = Colors.rgba(Colors.grey10, 0.65),
38
- ...otherModalProps
39
- } = modalProps;
40
- const visibility = useSharedValue(0); // value between 0 (closed) and 1 (open)
41
- const initialTranslation = useSharedValue(0);
42
- const [modalVisibility, setModalVisibility] = useState(visible); // unfortunately this is needed when changing visibility by the user (clicking on an option etc)
43
-
44
- const {
45
- setRef,
46
- onLayout,
47
- hiddenLocation: _hiddenLocation
48
- } = useHiddenLocation();
49
- const hiddenLocation = _hiddenLocation[direction];
50
- const wasMeasured = _hiddenLocation.wasMeasured;
51
- const isVertical = useMemo(() => {
52
- 'worklet';
6
+ import { Constants, asBaseComponent } from "../../commons/new";
7
+ import Modal from "../modal";
8
+ import View from "../view";
9
+ import PanListenerView from "../panningViews/panListenerView";
10
+ import DialogDismissibleView from "./DialogDismissibleView";
11
+ import OverlayFadingBackground from "./OverlayFadingBackground";
12
+ import PanningProvider, { PanningDirections, PanningDirectionsEnum } from "../panningViews/panningProvider";
13
+ export { PanningDirections as DialogDirections, PanningDirectionsEnum as DialogDirectionsEnum };
53
14
 
54
- return direction === DialogDirectionsEnum.DOWN || direction === DialogDirectionsEnum.UP;
55
- }, [direction]);
56
- const getTranslationInterpolation = useCallback(value => {
57
- 'worklet';
15
+ // TODO: KNOWN ISSUES
16
+ // 1. iOS pressing on the background while enter animation is happening will not call onDismiss
17
+ // Touch events are not registered?
18
+ // 2. SafeArea is transparent
19
+ // 3. Check why we need the state change in DialogDismissibleView -> onLayout -> animateTo
58
20
 
59
- return interpolate(value, [0, 1], [hiddenLocation, 0], Extrapolation.CLAMP);
60
- }, [hiddenLocation]);
61
- const getTranslationReverseInterpolation = useCallback(value => {
62
- 'worklet';
21
+ const DEFAULT_OVERLAY_BACKGROUND_COLOR = Colors.rgba(Colors.$backgroundInverted, 0.3);
63
22
 
64
- return interpolate(value, [hiddenLocation, 0], [0, 1]);
65
- }, [hiddenLocation]);
66
- const _onDismiss = useCallback(() => {
67
- 'worklet';
68
-
69
- runOnJS(setModalVisibility)(false);
70
- }, []);
71
- const close = useCallback(() => {
72
- 'worklet';
73
-
74
- visibility.value = withTiming(0, undefined, _onDismiss);
75
- // eslint-disable-next-line react-hooks/exhaustive-deps
76
- }, [_onDismiss]);
77
- const open = useCallback(() => {
78
- 'worklet';
79
-
80
- visibility.value = withSpring(1);
81
- // eslint-disable-next-line react-hooks/exhaustive-deps
82
- }, []);
83
- useEffect(() => {
84
- if (visible) {
85
- setModalVisibility(true);
86
- } else if (wasMeasured && modalVisibility) {
87
- // Close when sending visible = false
88
- close();
89
- }
90
- // eslint-disable-next-line react-hooks/exhaustive-deps
91
- }, [visible, wasMeasured]);
92
- useDidUpdate(() => {
93
- if (wasMeasured) {
94
- if (modalVisibility) {
95
- open();
96
- } else if (Constants.isAndroid) {
97
- onDismiss?.();
98
- }
99
- }
100
- // eslint-disable-next-line react-hooks/exhaustive-deps
101
- }, [modalVisibility, wasMeasured]);
102
- const alignmentStyle = useMemo(() => {
103
- return {
104
- flex: 1,
105
- alignItems: 'center',
106
- ...extractAlignmentsValues(props)
23
+ /**
24
+ * @description: Dialog component for displaying custom content inside a popup dialog
25
+ * @notes: Use alignment modifiers to control the dialog position
26
+ * (top, bottom, centerV, centerH, etc... by default the dialog is aligned to center)
27
+ * @modifiers: alignment
28
+ * @example: https://github.com/wix/react-native-ui-lib/blob/master/demo/src/screens/componentScreens/DialogScreen.js
29
+ * @gif: https://github.com/wix/react-native-ui-lib/blob/master/demo/showcase/Dialog/Dialog.gif?raw=true
30
+ */
31
+ class Dialog extends Component {
32
+ static displayName = 'Dialog';
33
+ static directions = PanningDirectionsEnum;
34
+ static defaultProps = {
35
+ overlayBackgroundColor: DEFAULT_OVERLAY_BACKGROUND_COLOR
36
+ };
37
+ constructor(props) {
38
+ super(props);
39
+ this.state = {
40
+ alignments: extractAlignmentsValues(props),
41
+ modalVisibility: props.visible,
42
+ dialogVisibility: props.visible
107
43
  };
108
- // eslint-disable-next-line react-hooks/exhaustive-deps
109
- }, []);
110
- const {
111
- renderDialogContent,
112
- containerProps,
113
- containerStyle
114
- } = useDialogContent({
115
- showCloseButton,
116
- close,
117
- closeButtonProps,
118
- containerStyle: propsContainerStyle,
119
- containerProps: propsContainerProps,
120
- headerProps,
121
- children
122
- });
123
- const animatedStyle = useAnimatedStyle(() => {
124
- if (isVertical) {
125
- return {
126
- transform: [{
127
- translateY: getTranslationInterpolation(visibility.value)
128
- }]
129
- };
44
+ this.styles = createStyles(this.props);
45
+ this.setAlignment();
46
+ }
47
+ UNSAFE_componentWillReceiveProps(nextProps) {
48
+ const {
49
+ visible: nexVisible
50
+ } = nextProps;
51
+ const {
52
+ visible
53
+ } = this.props;
54
+ if (nexVisible && !visible) {
55
+ this.setState({
56
+ modalVisibility: true,
57
+ dialogVisibility: true
58
+ });
59
+ } else if (visible && !nexVisible) {
60
+ this.hideDialogView();
61
+ }
62
+ }
63
+ setAlignment() {
64
+ const {
65
+ alignments
66
+ } = this.state;
67
+ if (_isEmpty(alignments)) {
68
+ this.styles.alignments = this.styles.centerContent;
130
69
  } else {
131
- return {
132
- transform: [{
133
- translateX: getTranslationInterpolation(visibility.value)
134
- }]
135
- };
70
+ this.styles.alignments = alignments;
136
71
  }
137
- });
138
- const style = useMemo(() => {
139
- return [styles.defaultDialogStyle, {
140
- backgroundColor: Colors.$backgroundDefault
141
- }, containerStyle, animatedStyle, width ? {
142
- width
143
- } : undefined, height ? {
144
- height
145
- } : undefined];
146
- // eslint-disable-next-line react-hooks/exhaustive-deps
147
- }, [containerStyle, width, height]);
148
- const shouldClose = event => {
149
- 'worklet';
72
+ }
150
73
 
151
- const wasPannedOverThreshold = Math.abs(getTranslationInterpolation(visibility.value)) >= Math.abs(hiddenLocation / 3);
152
- let velocity;
153
- switch (direction) {
154
- case DialogDirectionsEnum.DOWN:
155
- default:
156
- velocity = event.velocityY;
157
- break;
158
- case DialogDirectionsEnum.UP:
159
- velocity = -event.velocityY;
160
- break;
161
- case DialogDirectionsEnum.LEFT:
162
- velocity = -event.velocityX;
163
- break;
164
- case DialogDirectionsEnum.RIGHT:
165
- velocity = event.velocityX;
166
- break;
74
+ // TODO: revert adding this workaround once RN fixes https://github.com/facebook/react-native/issues/29455
75
+ onFadeDone = () => {
76
+ if (!this.state.modalVisibility) {
77
+ setTimeout(() => {
78
+ // unfortunately this is needed if a modal needs to open on iOS
79
+ this.props.onDialogDismissed?.(this.props);
80
+ }, 100);
167
81
  }
168
- const wasFlung = velocity >= THRESHOLD_VELOCITY;
169
- return wasPannedOverThreshold || wasFlung;
170
82
  };
171
- const panGesture = Gesture.Pan().onStart(event => {
172
- initialTranslation.value = getTranslationReverseInterpolation(isVertical ? event.translationY : event.translationX) - visibility.value;
173
- }).onUpdate(event => {
174
- visibility.value = getTranslationReverseInterpolation(isVertical ? event.translationY : event.translationX) - initialTranslation.value;
175
- }).onEnd(event => {
176
- if (shouldClose(event)) {
177
- close();
83
+ _onDismiss = () => {
84
+ this.setState({
85
+ modalVisibility: false,
86
+ fadeOut: false
87
+ }, () => {
88
+ const props = this.props;
89
+ if (props.visible) {
90
+ props.onDismiss?.(props);
91
+ }
92
+ // Parity with iOS Modal's onDismiss
93
+ if (Constants.isAndroid) {
94
+ props.onDialogDismissed?.(props);
95
+ }
96
+ });
97
+ };
98
+ onDismiss = () => {
99
+ const fadeOut = Constants.isIOS && this.props.visible;
100
+ if (fadeOut) {
101
+ this.setState({
102
+ fadeOut
103
+ }, this._onDismiss);
178
104
  } else {
179
- open();
105
+ this._onDismiss();
106
+ }
107
+ };
108
+ hideDialogView = () => {
109
+ this.setState({
110
+ dialogVisibility: false
111
+ });
112
+ };
113
+ renderPannableHeader = directions => {
114
+ const {
115
+ renderPannableHeader,
116
+ pannableHeaderProps
117
+ } = this.props;
118
+ if (renderPannableHeader) {
119
+ return <PanListenerView directions={directions}>{renderPannableHeader(pannableHeaderProps)}</PanListenerView>;
120
+ }
121
+ };
122
+ getContainerType = () => {
123
+ const {
124
+ panDirection,
125
+ renderPannableHeader
126
+ } = this.props;
127
+ if (!panDirection || renderPannableHeader) {
128
+ return View;
129
+ }
130
+ return PanListenerView;
131
+ };
132
+ renderDialogView = () => {
133
+ const {
134
+ children,
135
+ panDirection = PanningProvider.Directions.DOWN,
136
+ containerStyle,
137
+ testID
138
+ } = this.props;
139
+ const {
140
+ dialogVisibility
141
+ } = this.state;
142
+ const Container = this.getContainerType();
143
+ return <View testID={testID} style={[this.styles.dialogViewSize]} pointerEvents="box-none">
144
+ <PanningProvider>
145
+ <DialogDismissibleView direction={panDirection} visible={dialogVisibility} onDismiss={this.onDismiss} containerStyle={this.styles.flexType} style={this.styles.flexType}>
146
+ <Container directions={[panDirection]} style={[this.styles.overflow, !Constants.isWeb && this.styles.flexType, containerStyle]}>
147
+ {this.renderPannableHeader([panDirection])}
148
+ {children}
149
+ </Container>
150
+ </DialogDismissibleView>
151
+ </PanningProvider>
152
+ </View>;
153
+ };
154
+
155
+ // TODO: renderOverlay {_.invoke(this.props, 'renderOverlay')}
156
+ renderDialogContainer = () => {
157
+ const {
158
+ modalVisibility,
159
+ dialogVisibility,
160
+ fadeOut
161
+ } = this.state;
162
+ const {
163
+ useSafeArea,
164
+ bottom,
165
+ overlayBackgroundColor,
166
+ testID
167
+ } = this.props;
168
+ const addBottomSafeArea = Constants.isIphoneX && useSafeArea && bottom;
169
+ const bottomInsets = Constants.getSafeAreaInsets().bottom - 8; // TODO: should this be here or in the input style?
170
+ const onFadeDone = Constants.isIOS ? this.onFadeDone : undefined;
171
+ return <View useSafeArea={useSafeArea} style={[this.styles.centerHorizontal, this.styles.alignments, this.styles.container]} pointerEvents="box-none">
172
+ <OverlayFadingBackground testID={`${testID}.overlayFadingBackground`} modalVisibility={modalVisibility} dialogVisibility={dialogVisibility} overlayBackgroundColor={overlayBackgroundColor} onFadeDone={onFadeDone} fadeOut={fadeOut} />
173
+ {this.renderDialogView()}
174
+ {addBottomSafeArea && <View style={{
175
+ marginTop: bottomInsets
176
+ }} />}
177
+ </View>;
178
+ };
179
+ render = () => {
180
+ const {
181
+ modalVisibility
182
+ } = this.state;
183
+ const {
184
+ testID,
185
+ supportedOrientations,
186
+ accessibilityLabel,
187
+ ignoreBackgroundPress,
188
+ modalProps
189
+ } = this.props;
190
+ const onBackgroundPress = !ignoreBackgroundPress ? this.hideDialogView : undefined;
191
+ return <Modal testID={`${testID}.modal`} transparent visible={modalVisibility} animationType={'none'} onBackgroundPress={onBackgroundPress} onRequestClose={onBackgroundPress} supportedOrientations={supportedOrientations} accessibilityLabel={accessibilityLabel} {...modalProps}>
192
+ {this.renderDialogContainer()}
193
+ </Modal>;
194
+ };
195
+ }
196
+ function createStyles(props) {
197
+ const {
198
+ width = '90%',
199
+ height
200
+ } = props;
201
+ const flexType = height ? {
202
+ flex: 1
203
+ } : {
204
+ flex: 0
205
+ };
206
+ return StyleSheet.create({
207
+ dialogViewSize: {
208
+ width,
209
+ height: height ?? undefined
210
+ },
211
+ flexType,
212
+ container: {
213
+ flex: 1
214
+ },
215
+ centerHorizontal: {
216
+ alignItems: 'center'
217
+ },
218
+ centerContent: {
219
+ justifyContent: 'center'
220
+ },
221
+ overflow: {
222
+ overflow: 'hidden'
180
223
  }
181
224
  });
182
- useImperativeHandle(ref, () => ({
183
- dismiss: close
184
- }));
185
- const renderDialog = () => <GestureDetector gesture={panGesture}>
186
- <View {...containerProps} reanimated={!Constants.accessibility.isReduceMotionEnabled} style={style} onLayout={onLayout} ref={setRef} testID={testID}>
187
- {renderDialogContent()}
188
- </View>
189
- </GestureDetector>;
190
- const overlayStyle = useAnimatedStyle(() => {
191
- return {
192
- opacity: visibility.value,
193
- backgroundColor: overlayBackgroundColor
194
- };
195
- }, [overlayBackgroundColor]);
196
- const renderOverlayView = () => <View testID={`${testID}.overlayFadingBackground`} absF reanimated style={overlayStyle} pointerEvents="none" />;
197
- return <Modal transparent animationType={'none'} {...otherModalProps} testID={`${testID}.modal`} useGestureHandlerRootView visible={modalVisibility} onBackgroundPress={ignoreBackgroundPress ? undefined : close} onRequestClose={ignoreBackgroundPress ? undefined : close} onDismiss={onDismiss}>
198
- {renderOverlayView()}
199
- <View useSafeArea={useSafeArea} pointerEvents={'box-none'} style={alignmentStyle}>
200
- {renderDialog()}
201
- </View>
202
- </Modal>;
203
- };
204
- Dialog.displayName = 'Dialog';
205
- Dialog.directions = DialogDirectionsEnum;
206
- Dialog.Header = DialogHeader;
207
- const _Dialog = forwardRef(Dialog);
208
- hoistStatics(_Dialog, Dialog);
209
- export default asBaseComponent(_Dialog);
210
- const styles = StyleSheet.create({
211
- defaultDialogStyle: {
212
- marginBottom: Spacings.s5,
213
- maxHeight: '60%',
214
- width: 250,
215
- borderRadius: BorderRadiuses.br20,
216
- overflow: 'hidden'
217
- }
218
- });
225
+ }
226
+ export default asBaseComponent(Dialog);
@@ -26,7 +26,8 @@ class Swipeable extends Component {
26
26
  static defaultProps = {
27
27
  friction: 1,
28
28
  overshootFriction: 1,
29
- useNativeAnimations: true,
29
+ useNativeAnimations: false,
30
+ // issue in iPhone5
30
31
  fullLeftThreshold: 0.45,
31
32
  fullRightThreshold: 0.45
32
33
  };
@@ -220,33 +220,30 @@ class Drawer extends PureComponent {
220
220
  outputRange,
221
221
  extrapolate: 'clamp'
222
222
  });
223
- return <RectButton key={index} testID={item.testID} onPress={() => this.onActionPress(item)}>
224
- <View style={[styles.action, item.style, {
225
- backgroundColor: item.background || DEFAULT_BG,
226
- height: '100%',
227
- width: item.width,
228
- minWidth: itemsMinWidth
229
- }]}>
230
- {item.customElement}
231
- {!item.customElement && item.icon && <Animated.Image source={item.icon} style={[styles.actionIcon, {
232
- width: itemsIconSize,
233
- height: itemsIconSize,
234
- tintColor: item.iconColor || itemsTintColor,
235
- opacity,
236
- transform: [{
237
- scale
238
- }]
239
- }]} />}
240
- {!item.customElement && item.text && <Animated.Text style={[styles.actionText, {
241
- color: item.textColor || itemsTintColor,
242
- opacity,
243
- transform: [{
244
- scale
245
- }]
246
- }, itemsTextStyle]} accessibilityElementsHidden importantForAccessibility="no-hide-descendants" accessible={false}>
247
- {item.text}
248
- </Animated.Text>}
249
- </View>
223
+ return <RectButton key={index} testID={item.testID} style={[styles.action, item.style, {
224
+ backgroundColor: item.background || DEFAULT_BG,
225
+ width: item.width,
226
+ minWidth: itemsMinWidth
227
+ }]} onPress={() => this.onActionPress(item)}>
228
+ {item.customElement}
229
+ {!item.customElement && item.icon && <Animated.Image source={item.icon} style={[styles.actionIcon, {
230
+ width: itemsIconSize,
231
+ height: itemsIconSize,
232
+ tintColor: item.iconColor || itemsTintColor,
233
+ opacity,
234
+ transform: [{
235
+ scale
236
+ }]
237
+ }]} />}
238
+ {!item.customElement && item.text && <Animated.Text style={[styles.actionText, {
239
+ color: item.textColor || itemsTintColor,
240
+ opacity,
241
+ transform: [{
242
+ scale
243
+ }]
244
+ }, itemsTextStyle]} accessibilityElementsHidden importantForAccessibility="no-hide-descendants" accessible={false}>
245
+ {item.text}
246
+ </Animated.Text>}
250
247
  </RectButton>;
251
248
  };
252
249
  render() {
@@ -258,7 +255,7 @@ class Drawer extends PureComponent {
258
255
  onToggleSwipeLeft,
259
256
  ...others
260
257
  } = this.props;
261
- return <GestureHandlerRootView style={styles.container}>
258
+ return <GestureHandlerRootView>
262
259
  <Swipeable {...others} ref={this._swipeableRow} friction={1} containerStyle={style} animationOptions={this.animationOptions} renderLeftActions={this.leftRender} renderRightActions={this.rightRender} rightActionsContainerStyle={this.getRightActionsContainerStyle(rightItems, leftItem)} leftActionsContainerStyle={this.getLeftActionsContainerStyle(leftItem, rightItems)} onSwipeableWillOpen={this.onSwipeableWillOpen} onSwipeableWillClose={this.onSwipeableWillClose} onToggleSwipeLeft={onToggleSwipeLeft && this.onToggleSwipeLeft}>
263
260
  <View accessible accessibilityActions={this.getAccessibilityActions()} onAccessibilityAction={this.onAccessibilityAction} {...extractAccessibilityProps(this.props)}>
264
261
  {children}
@@ -269,9 +266,6 @@ class Drawer extends PureComponent {
269
266
  }
270
267
  export default asBaseComponent(Drawer);
271
268
  const styles = StyleSheet.create({
272
- container: {
273
- flex: 0
274
- },
275
269
  leftAction: {
276
270
  flex: 1,
277
271
  justifyContent: 'center',
@@ -1,5 +1,5 @@
1
1
  import React, { useCallback, useRef, useImperativeHandle } from 'react';
2
- import { ScrollView as RNScrollView, StyleSheet } from 'react-native';
2
+ import { ScrollView as RNScrollView } from 'react-native';
3
3
  import { ScrollView as GestureScrollView, GestureHandlerRootView } from 'react-native-gesture-handler';
4
4
  import Fader from "../fader";
5
5
  import useScrollEnabler from "../../hooks/useScrollEnabler";
@@ -60,7 +60,7 @@ const FadedScrollView = props => {
60
60
  isScrollEnabled
61
61
  }));
62
62
  if (children) {
63
- return <GestureHandlerRootView style={styles.container}>
63
+ return <GestureHandlerRootView>
64
64
  <ScrollView scrollEventThrottle={16} decelerationRate={'fast'} {...others} horizontal={horizontal} scrollEnabled={scrollEnabled} onContentSizeChange={_onContentSizeChange} onLayout={_onLayout} onScroll={onScroll}
65
65
  // @ts-expect-error
66
66
  ref={scrollViewRef}>
@@ -72,10 +72,5 @@ const FadedScrollView = props => {
72
72
  }
73
73
  return null;
74
74
  };
75
- const styles = StyleSheet.create({
76
- container: {
77
- flex: 0
78
- }
79
- });
80
75
  FadedScrollView.displayName = 'IGNORE';
81
76
  export default forwardRef(FadedScrollView);
@@ -100,7 +100,7 @@ export type FeatureHighlightProps = {
100
100
  interface State {
101
101
  fadeAnim: Animated.Value;
102
102
  contentTopPosition?: number;
103
- node?: number;
103
+ node?: number | null;
104
104
  getTarget?: () => any;
105
105
  }
106
106
  /**