@draftbit/core 46.11.1-c64d65.2 → 46.11.1-ca634b.2

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 (119) hide show
  1. package/lib/commonjs/components/BottomSheet/BottomSheet.js +89 -0
  2. package/lib/commonjs/components/BottomSheet/BottomSheet.js.map +1 -0
  3. package/lib/commonjs/components/BottomSheet/BottomSheetComponent.js +424 -0
  4. package/lib/commonjs/components/BottomSheet/BottomSheetComponent.js.map +1 -0
  5. package/lib/commonjs/components/BottomSheet/index.js +14 -0
  6. package/lib/commonjs/components/BottomSheet/index.js.map +1 -0
  7. package/lib/commonjs/components/Checkbox/CheckboxGroup.js +16 -3
  8. package/lib/commonjs/components/Checkbox/CheckboxGroup.js.map +1 -1
  9. package/lib/commonjs/components/Checkbox/CheckboxGroupRow.js +22 -5
  10. package/lib/commonjs/components/Checkbox/CheckboxGroupRow.js.map +1 -1
  11. package/lib/commonjs/components/Checkbox/context.js +1 -1
  12. package/lib/commonjs/components/Checkbox/context.js.map +1 -1
  13. package/lib/commonjs/components/Checkbox/index.js.map +1 -1
  14. package/lib/commonjs/components/DeckSwiper/DeckSwiper.js +1 -1
  15. package/lib/commonjs/components/DeckSwiper/DeckSwiper.js.map +1 -1
  16. package/lib/commonjs/components/Picker/Picker.js +13 -4
  17. package/lib/commonjs/components/Picker/Picker.js.map +1 -1
  18. package/lib/commonjs/components/Shadow.js +10 -2
  19. package/lib/commonjs/components/Shadow.js.map +1 -1
  20. package/lib/commonjs/components/StepIndicator.js +18 -57
  21. package/lib/commonjs/components/TabView/TabView.js +8 -15
  22. package/lib/commonjs/components/TabView/TabView.js.map +1 -1
  23. package/lib/commonjs/index.js +7 -0
  24. package/lib/commonjs/index.js.map +1 -1
  25. package/lib/commonjs/mappings/DeckSwiper.js +2 -2
  26. package/lib/commonjs/mappings/DeckSwiper.js.map +1 -1
  27. package/lib/commonjs/mappings/Shadow.js +2 -2
  28. package/lib/commonjs/mappings/Shadow.js.map +1 -1
  29. package/lib/module/components/Accordion/AccordionGroup.js.map +1 -1
  30. package/lib/module/components/ActionSheet/ActionSheetCancel.js.map +1 -1
  31. package/lib/module/components/Banner.js +4 -23
  32. package/lib/module/components/Banner.js.map +1 -1
  33. package/lib/module/components/BottomSheet/BottomSheet.js +81 -0
  34. package/lib/module/components/BottomSheet/BottomSheet.js.map +1 -0
  35. package/lib/module/components/BottomSheet/BottomSheetComponent.js +430 -0
  36. package/lib/module/components/BottomSheet/BottomSheetComponent.js.map +1 -0
  37. package/{src/components/BottomSheet/index.ts.tmp → lib/module/components/BottomSheet/index.js} +1 -0
  38. package/lib/module/components/BottomSheet/index.js.map +1 -0
  39. package/lib/module/components/Card.js.map +1 -1
  40. package/lib/module/components/CircleImage.js +1 -15
  41. package/lib/module/components/CircleImage.js.map +1 -1
  42. package/lib/module/components/Container.js +4 -16
  43. package/lib/module/components/Container.js.map +1 -1
  44. package/lib/module/components/DatePicker/DatePicker.js +13 -9
  45. package/lib/module/components/DatePicker/DatePicker.js.map +1 -1
  46. package/lib/module/components/DatePicker/DatePickerComponent.web.js.map +1 -1
  47. package/lib/module/components/DeckSwiper/DeckSwiper.js +1 -1
  48. package/lib/module/components/DeckSwiper/DeckSwiper.js.map +1 -1
  49. package/lib/module/components/Picker/Picker.js +13 -4
  50. package/lib/module/components/Picker/Picker.js.map +1 -1
  51. package/lib/module/components/Picker/PickerComponent.android.js +3 -21
  52. package/lib/module/components/Picker/PickerComponent.android.js.map +1 -1
  53. package/lib/module/components/Portal/PortalHost.js +14 -44
  54. package/lib/module/components/Portal/PortalHost.js.map +1 -1
  55. package/lib/module/components/ProgressCircle.js.map +1 -1
  56. package/lib/module/components/RadioButton/RadioButtonRow.js +5 -23
  57. package/lib/module/components/RadioButton/RadioButtonRow.js.map +1 -1
  58. package/lib/module/components/RadioButton/index.js.map +1 -1
  59. package/lib/module/components/Row.js.map +1 -1
  60. package/lib/module/components/RowBodyIcon.js.map +1 -1
  61. package/lib/module/components/Shadow.js +10 -2
  62. package/lib/module/components/Shadow.js.map +1 -1
  63. package/lib/module/components/Swiper/SwiperItem.js.map +1 -1
  64. package/lib/module/components/TabView/TabView.js +1 -1
  65. package/lib/module/components/TabView/TabView.js.map +1 -1
  66. package/lib/module/components/Touchable.web.js.map +1 -1
  67. package/lib/module/components/YoutubePlayer/YoutubePlayerProps.js.map +1 -1
  68. package/lib/module/index.js +1 -0
  69. package/lib/module/index.js.map +1 -1
  70. package/lib/module/mappings/AccordionItem.js.map +1 -1
  71. package/lib/module/mappings/AudioPlayer.js.map +1 -1
  72. package/lib/module/mappings/CardInline.js.map +1 -1
  73. package/lib/module/mappings/DeckSwiper.js +3 -3
  74. package/lib/module/mappings/DeckSwiper.js.map +1 -1
  75. package/lib/module/mappings/Divider.js.map +1 -1
  76. package/lib/module/mappings/FlashList.js.map +1 -1
  77. package/lib/module/mappings/ProgressIndicator.js.map +1 -1
  78. package/lib/module/mappings/RadioButtonGroup.js.map +1 -1
  79. package/lib/module/mappings/Shadow.js +3 -3
  80. package/lib/module/mappings/Shadow.js.map +1 -1
  81. package/lib/module/styles/shadow.js.map +1 -1
  82. package/lib/typescript/src/components/BottomSheet/BottomSheet.d.ts +20 -0
  83. package/lib/typescript/src/components/BottomSheet/BottomSheet.d.ts.map +1 -0
  84. package/lib/typescript/src/components/BottomSheet/BottomSheetComponent.d.ts +170 -0
  85. package/lib/typescript/src/components/BottomSheet/BottomSheetComponent.d.ts.map +1 -0
  86. package/lib/typescript/src/components/BottomSheet/index.d.ts +2 -0
  87. package/lib/typescript/src/components/BottomSheet/index.d.ts.map +1 -0
  88. package/lib/typescript/src/components/Picker/Picker.d.ts.map +1 -1
  89. package/lib/typescript/src/components/Shadow.d.ts.map +1 -1
  90. package/lib/typescript/src/index.d.ts +1 -0
  91. package/lib/typescript/src/index.d.ts.map +1 -1
  92. package/lib/typescript/src/mappings/DeckSwiper.d.ts +1 -1
  93. package/lib/typescript/src/mappings/DeckSwiper.d.ts.map +1 -1
  94. package/lib/typescript/src/mappings/Shadow.d.ts.map +1 -1
  95. package/package.json +5 -3
  96. package/src/components/BottomSheet/BottomSheet.js +56 -0
  97. package/src/components/BottomSheet/BottomSheetComponent.js +437 -0
  98. package/src/components/DeckSwiper/DeckSwiper.js +1 -1
  99. package/src/components/DeckSwiper/DeckSwiper.tsx +1 -1
  100. package/src/components/Picker/Picker.js +16 -4
  101. package/src/components/Picker/Picker.tsx +25 -5
  102. package/src/components/Shadow.js +7 -2
  103. package/src/components/Shadow.tsx +10 -3
  104. package/src/components/TabView/TabView.js +1 -1
  105. package/src/components/TabView/TabView.tsx +1 -1
  106. package/src/index.js +1 -0
  107. package/src/index.tsx +2 -0
  108. package/src/mappings/DeckSwiper.js +7 -3
  109. package/src/mappings/DeckSwiper.ts +7 -3
  110. package/src/mappings/Shadow.js +10 -3
  111. package/src/mappings/Shadow.ts +10 -3
  112. package/lib/module/components/BottomSheet/BottomSheet.tsx.tmp +0 -120
  113. package/lib/module/components/BottomSheet/BottomSheetComponent.tsx.tmp +0 -895
  114. package/src/components/BottomSheet/BottomSheet.tsx.tmp +0 -120
  115. package/src/components/BottomSheet/BottomSheetComponent.tsx.tmp +0 -895
  116. /package/{lib/commonjs/components/BottomSheet/BottomSheet.tsx.tmp → src/components/BottomSheet/BottomSheet.tsx} +0 -0
  117. /package/{lib/commonjs/components/BottomSheet/BottomSheetComponent.tsx.tmp → src/components/BottomSheet/BottomSheetComponent.tsx} +0 -0
  118. /package/{lib/commonjs/components/BottomSheet/index.ts.tmp → src/components/BottomSheet/index.js} +0 -0
  119. /package/{lib/module/components/BottomSheet/index.ts.tmp → src/components/BottomSheet/index.ts} +0 -0
@@ -0,0 +1,437 @@
1
+ /**
2
+ * Slightly modfied version as taken from https://github.com/rgommezz/react-native-scroll-bottom-sheet
3
+ * Main previously breaking change:
4
+ * const node = this.props.innerRef.current?.getNode() ==> const node = this.props.innerRef.current as any
5
+ */
6
+ /**
7
+ * Copyright (c) 2020 Raul Gomez Acuna
8
+ *
9
+ * This source code is licensed under the MIT license found in the
10
+ * LICENSE file in the root directory of this source tree.
11
+ *
12
+ */
13
+ import React, { Component } from "react";
14
+ import { Dimensions, FlatList, Platform, ScrollView, SectionList, StyleSheet, View, } from "react-native";
15
+ import Animated, { abs, add, and, call, Clock, clockRunning, cond, Easing as EasingDeprecated,
16
+ // @ts-ignore: this property is only present in Reanimated 2
17
+ EasingNode, eq, event, Extrapolate, greaterOrEq, greaterThan, multiply, not, onChange, or, set, startClock, stopClock, sub, spring, timing, Value, } from "react-native-reanimated";
18
+ import { NativeViewGestureHandler, PanGestureHandler, State as GestureState, TapGestureHandler, } from "react-native-gesture-handler";
19
+ const {
20
+ //@ts-ignore
21
+ interpolate: interpolateDeprecated,
22
+ // @ts-ignore: this property is only present in Reanimated 2
23
+ interpolateNode, } = Animated;
24
+ const interpolate = interpolateNode !== null && interpolateNode !== void 0 ? interpolateNode : interpolateDeprecated;
25
+ //@ts-ignore
26
+ const Easing = EasingNode !== null && EasingNode !== void 0 ? EasingNode : EasingDeprecated;
27
+ const FlatListComponentType = "FlatList";
28
+ const ScrollViewComponentType = "ScrollView";
29
+ const SectionListComponentType = "SectionList";
30
+ const TimingAnimationType = "timing";
31
+ const SpringAnimationType = "spring";
32
+ const DEFAULT_SPRING_PARAMS = {
33
+ damping: 50,
34
+ mass: 0.3,
35
+ stiffness: 121.6,
36
+ overshootClamping: true,
37
+ restSpeedThreshold: 0.3,
38
+ restDisplacementThreshold: 0.3,
39
+ };
40
+ const { height: windowHeight } = Dimensions.get("window");
41
+ const IOS_NORMAL_DECELERATION_RATE = 0.998;
42
+ const ANDROID_NORMAL_DECELERATION_RATE = 0.985;
43
+ const DEFAULT_ANIMATION_DURATION = 250;
44
+ const DEFAULT_EASING = Easing.inOut(Easing.linear);
45
+ const imperativeScrollOptions = {
46
+ [FlatListComponentType]: {
47
+ method: "scrollToIndex",
48
+ args: {
49
+ index: 0,
50
+ viewPosition: 0,
51
+ viewOffset: 1000,
52
+ animated: true,
53
+ },
54
+ },
55
+ [ScrollViewComponentType]: {
56
+ method: "scrollTo",
57
+ args: {
58
+ x: 0,
59
+ y: 0,
60
+ animated: true,
61
+ },
62
+ },
63
+ [SectionListComponentType]: {
64
+ method: "scrollToLocation",
65
+ args: {
66
+ itemIndex: 0,
67
+ sectionIndex: 0,
68
+ viewPosition: 0,
69
+ viewOffset: 1000,
70
+ animated: true,
71
+ },
72
+ },
73
+ };
74
+ export class ScrollBottomSheet extends Component {
75
+ constructor(props) {
76
+ var _a;
77
+ super(props);
78
+ /**
79
+ * Gesture Handler references
80
+ */
81
+ this.masterDrawer = React.createRef();
82
+ this.drawerHandleRef = React.createRef();
83
+ this.drawerContentRef = React.createRef();
84
+ this.scrollComponentRef = React.createRef();
85
+ /**
86
+ * Flag to indicate imperative snapping
87
+ */
88
+ this.isManuallySetValue = new Value(0);
89
+ /**
90
+ * Manual snapping amount
91
+ */
92
+ this.manualYOffset = new Value(0);
93
+ this.prevSnapIndex = -1;
94
+ this.dragY = new Value(0);
95
+ this.prevDragY = new Value(0);
96
+ this.tempDestSnapPoint = new Value(0);
97
+ this.isAndroid = new Value(Number(Platform.OS === "android"));
98
+ this.animationClock = new Clock();
99
+ this.animationPosition = new Value(0);
100
+ this.animationFinished = new Value(0);
101
+ this.animationFrameTime = new Value(0);
102
+ this.velocityY = new Value(0);
103
+ this.lastStartScrollY = new Value(0);
104
+ this.destSnapPoint = new Value(0);
105
+ this.dragWithHandle = new Value(0);
106
+ this.scrollUpAndPullDown = new Value(0);
107
+ this.convertPercentageToDp = (str) => (Number(str.split("%")[0]) * (windowHeight - this.props.topInset)) / 100;
108
+ this.getNormalisedSnapPoints = () => {
109
+ return this.props.snapPoints.map((p) => {
110
+ if (typeof p === "string") {
111
+ return this.convertPercentageToDp(p);
112
+ }
113
+ else if (typeof p === "number") {
114
+ return p;
115
+ }
116
+ throw new Error(`Invalid type for value ${p}: ${typeof p}. It should be either a percentage string or a number`);
117
+ });
118
+ };
119
+ this.getScrollComponent = () => {
120
+ switch (this.props.componentType) {
121
+ case "FlatList":
122
+ return FlatList;
123
+ case "ScrollView":
124
+ return ScrollView;
125
+ case "SectionList":
126
+ return SectionList;
127
+ default:
128
+ throw new Error("Component type not supported: it should be one of `FlatList`, `ScrollView` or `SectionList`");
129
+ }
130
+ };
131
+ this.snapTo = (index) => {
132
+ const snapPoints = this.getNormalisedSnapPoints();
133
+ this.isManuallySetValue.setValue(1);
134
+ this.manualYOffset.setValue(snapPoints[index]);
135
+ this.nextSnapIndex.setValue(index);
136
+ };
137
+ const { initialSnapIndex, animationType } = props;
138
+ const animationDriver = animationType === "timing" ? 0 : 1;
139
+ const animationDuration = (props.animationType === "timing" && ((_a = props.animationConfig) === null || _a === void 0 ? void 0 : _a.duration)) ||
140
+ DEFAULT_ANIMATION_DURATION;
141
+ const ScrollComponent = this.getScrollComponent();
142
+ // @ts-ignore
143
+ this.scrollComponent = Animated.createAnimatedComponent(ScrollComponent);
144
+ const snapPoints = this.getNormalisedSnapPoints();
145
+ const openPosition = snapPoints[0];
146
+ const closedPosition = this.props.enableOverScroll
147
+ ? windowHeight
148
+ : snapPoints[snapPoints.length - 1];
149
+ const initialSnap = snapPoints[initialSnapIndex];
150
+ this.nextSnapIndex = new Value(initialSnapIndex);
151
+ const initialDecelerationRate = Platform.select({
152
+ android: props.initialSnapIndex === 0 ? ANDROID_NORMAL_DECELERATION_RATE : 0,
153
+ ios: IOS_NORMAL_DECELERATION_RATE,
154
+ });
155
+ this.decelerationRate = new Value(initialDecelerationRate);
156
+ //@ts-ignore
157
+ const handleGestureState = new Value(-1);
158
+ //@ts-ignore
159
+ const handleOldGestureState = new Value(-1);
160
+ //@ts-ignore
161
+ const drawerGestureState = new Value(-1);
162
+ //@ts-ignore
163
+ const drawerOldGestureState = new Value(-1);
164
+ const lastSnapInRange = new Value(1);
165
+ this.prevTranslateYOffset = new Value(initialSnap);
166
+ this.translationY = new Value(initialSnap);
167
+ this.lastSnap = new Value(initialSnap);
168
+ this.onHandleGestureEvent = event([
169
+ {
170
+ nativeEvent: {
171
+ translationY: this.dragY,
172
+ oldState: handleOldGestureState,
173
+ state: handleGestureState,
174
+ velocityY: this.velocityY,
175
+ },
176
+ },
177
+ ]);
178
+ this.onDrawerGestureEvent = event([
179
+ {
180
+ nativeEvent: {
181
+ translationY: this.dragY,
182
+ oldState: drawerOldGestureState,
183
+ state: drawerGestureState,
184
+ velocityY: this.velocityY,
185
+ },
186
+ },
187
+ ]);
188
+ this.onScrollBeginDrag = event([
189
+ {
190
+ nativeEvent: {
191
+ contentOffset: { y: this.lastStartScrollY },
192
+ },
193
+ },
194
+ ]);
195
+ const didHandleGestureBegin = eq(handleGestureState, GestureState.ACTIVE);
196
+ const isAnimationInterrupted = and(or(eq(handleGestureState, GestureState.BEGAN), eq(drawerGestureState, GestureState.BEGAN), and(eq(this.isAndroid, 0), eq(animationDriver, 1), or(eq(drawerGestureState, GestureState.ACTIVE), eq(handleGestureState, GestureState.ACTIVE)))), clockRunning(this.animationClock));
197
+ this.didGestureFinish = or(and(eq(handleOldGestureState, GestureState.ACTIVE), eq(handleGestureState, GestureState.END)), and(eq(drawerOldGestureState, GestureState.ACTIVE), eq(drawerGestureState, GestureState.END)));
198
+ // Function that determines if the last snap point is in the range {snapPoints}
199
+ // In the case of interruptions in the middle of an animation, we'll get
200
+ // lastSnap values outside the range
201
+ const isLastSnapPointInRange = (i = 0) => i === snapPoints.length
202
+ ? lastSnapInRange
203
+ : cond(eq(this.lastSnap, snapPoints[i]), [set(lastSnapInRange, 1)], isLastSnapPointInRange(i + 1));
204
+ const scrollY = [
205
+ set(lastSnapInRange, 0),
206
+ isLastSnapPointInRange(),
207
+ cond(or(didHandleGestureBegin, and(this.isManuallySetValue, not(eq(this.manualYOffset, snapPoints[0])))), [set(this.dragWithHandle, 1), 0]),
208
+ cond(
209
+ // This is to account for a continuous scroll on the drawer from a snap point
210
+ // Different than top, bringing the drawer to the top position, so that if we
211
+ // change scroll direction without releasing the gesture, it doesn't pull down the drawer again
212
+ and(eq(this.dragWithHandle, 1), greaterThan(snapPoints[0], add(this.lastSnap, this.dragY)), and(not(eq(this.lastSnap, snapPoints[0])), lastSnapInRange)), [
213
+ set(this.lastSnap, snapPoints[0]),
214
+ set(this.dragWithHandle, 0),
215
+ this.lastStartScrollY,
216
+ ], cond(eq(this.dragWithHandle, 1), 0, this.lastStartScrollY)),
217
+ ];
218
+ this.didScrollUpAndPullDown = cond(and(greaterOrEq(this.dragY, this.lastStartScrollY), greaterThan(this.lastStartScrollY, 0)), set(this.scrollUpAndPullDown, 1));
219
+ this.setTranslationY = cond(and(not(this.dragWithHandle), not(greaterOrEq(this.dragY, this.lastStartScrollY))), set(this.translationY, sub(this.dragY, this.lastStartScrollY)), set(this.translationY, this.dragY));
220
+ this.extraOffset = cond(eq(this.scrollUpAndPullDown, 1), this.lastStartScrollY, 0);
221
+ const endOffsetY = add(this.lastSnap, this.translationY, multiply(1 - props.friction, this.velocityY));
222
+ this.calculateNextSnapPoint = (i = 0) => i === snapPoints.length
223
+ ? this.tempDestSnapPoint
224
+ : cond(greaterThan(abs(sub(this.tempDestSnapPoint, endOffsetY)), abs(sub(add(snapPoints[i], this.extraOffset), endOffsetY))), [
225
+ set(this.tempDestSnapPoint, add(snapPoints[i], this.extraOffset)),
226
+ set(this.nextSnapIndex, i),
227
+ this.calculateNextSnapPoint(i + 1),
228
+ ], this.calculateNextSnapPoint(i + 1));
229
+ const runAnimation = ({ clock, from, to, position, finished, velocity, frameTime, }) => {
230
+ var _a;
231
+ const state = {
232
+ finished,
233
+ velocity: new Value(0),
234
+ position,
235
+ time: new Value(0),
236
+ frameTime,
237
+ };
238
+ const timingConfig = {
239
+ duration: animationDuration,
240
+ easing: (props.animationType === "timing" && ((_a = props.animationConfig) === null || _a === void 0 ? void 0 : _a.easing)) ||
241
+ DEFAULT_EASING,
242
+ toValue: new Value(0),
243
+ };
244
+ const springConfig = {
245
+ ...DEFAULT_SPRING_PARAMS,
246
+ ...((props.animationType === "spring" && props.animationConfig) || {}),
247
+ toValue: new Value(0),
248
+ };
249
+ return [
250
+ cond(and(not(clockRunning(clock)), not(eq(finished, 1))), [
251
+ // If the clock isn't running, we reset all the animation params and start the clock
252
+ set(state.finished, 0),
253
+ set(state.velocity, velocity),
254
+ set(state.time, 0),
255
+ set(state.position, from),
256
+ set(state.frameTime, 0),
257
+ set(timingConfig.toValue, to),
258
+ set(springConfig.toValue, to),
259
+ startClock(clock),
260
+ ]),
261
+ // We run the step here that is going to update position
262
+ cond(eq(animationDriver, 0),
263
+ //@ts-ignore
264
+ timing(clock, state, timingConfig), spring(clock, state, springConfig)),
265
+ cond(state.finished, [
266
+ call([this.nextSnapIndex], ([value]) => {
267
+ var _a, _b;
268
+ if (value !== this.prevSnapIndex) {
269
+ (_b = (_a = this.props).onSettle) === null || _b === void 0 ? void 0 : _b.call(_a, value);
270
+ }
271
+ this.prevSnapIndex = value;
272
+ }),
273
+ // Resetting appropriate values
274
+ set(drawerOldGestureState, GestureState.END),
275
+ set(handleOldGestureState, GestureState.END),
276
+ set(this.prevTranslateYOffset, state.position),
277
+ cond(eq(this.scrollUpAndPullDown, 1), [
278
+ set(this.prevTranslateYOffset, sub(this.prevTranslateYOffset, this.lastStartScrollY)),
279
+ set(this.lastStartScrollY, 0),
280
+ set(this.scrollUpAndPullDown, 0),
281
+ ]),
282
+ cond(eq(this.destSnapPoint, snapPoints[0]), [
283
+ set(this.dragWithHandle, 0),
284
+ ]),
285
+ set(this.isManuallySetValue, 0),
286
+ set(this.manualYOffset, 0),
287
+ stopClock(clock),
288
+ this.prevTranslateYOffset,
289
+ ],
290
+ // We made the block return the updated position,
291
+ state.position),
292
+ ];
293
+ };
294
+ const translateYOffset = cond(isAnimationInterrupted, [
295
+ // set(prevTranslateYOffset, animationPosition) should only run if we are
296
+ // interrupting an animation when the drawer is currently in a different
297
+ // position than the top
298
+ cond(or(this.dragWithHandle, greaterOrEq(abs(this.prevDragY), this.lastStartScrollY)), set(this.prevTranslateYOffset, this.animationPosition)),
299
+ set(this.animationFinished, 1),
300
+ set(this.translationY, 0),
301
+ // Resetting appropriate values
302
+ set(drawerOldGestureState, GestureState.END),
303
+ set(handleOldGestureState, GestureState.END),
304
+ // By forcing that frameTime exceeds duration, it has the effect of stopping the animation
305
+ set(this.animationFrameTime, add(animationDuration, 1000)),
306
+ set(this.velocityY, 0),
307
+ stopClock(this.animationClock),
308
+ this.prevTranslateYOffset,
309
+ ], cond(or(this.didGestureFinish, this.isManuallySetValue, clockRunning(this.animationClock)), [
310
+ runAnimation({
311
+ clock: this.animationClock,
312
+ from: cond(this.isManuallySetValue, this.prevTranslateYOffset, add(this.prevTranslateYOffset, this.translationY)),
313
+ to: this.destSnapPoint,
314
+ position: this.animationPosition,
315
+ finished: this.animationFinished,
316
+ frameTime: this.animationFrameTime,
317
+ velocity: this.velocityY,
318
+ }),
319
+ ], [
320
+ set(this.animationFrameTime, 0),
321
+ set(this.animationFinished, 0),
322
+ // @ts-ignore
323
+ this.prevTranslateYOffset,
324
+ ]));
325
+ this.translateY = interpolate(add(translateYOffset, this.dragY, multiply(scrollY, -1)), {
326
+ inputRange: [openPosition, closedPosition],
327
+ outputRange: [openPosition, closedPosition],
328
+ extrapolate: Extrapolate.CLAMP,
329
+ });
330
+ this.position = interpolate(this.translateY, {
331
+ inputRange: [openPosition, snapPoints[snapPoints.length - 1]],
332
+ outputRange: [1, 0],
333
+ extrapolate: Extrapolate.CLAMP,
334
+ });
335
+ }
336
+ render() {
337
+ const { renderHandle, initialSnapIndex, containerStyle, ...rest } = this.props;
338
+ const AnimatedScrollableComponent = this.scrollComponent;
339
+ const normalisedSnapPoints = this.getNormalisedSnapPoints();
340
+ const initialSnap = normalisedSnapPoints[initialSnapIndex];
341
+ const Content = (React.createElement(Animated.View, { style: [
342
+ StyleSheet.absoluteFillObject,
343
+ containerStyle,
344
+ // @ts-ignore
345
+ {
346
+ transform: [{ translateY: this.translateY }],
347
+ },
348
+ ] },
349
+ React.createElement(PanGestureHandler, { ref: this.drawerHandleRef, shouldCancelWhenOutside: false, simultaneousHandlers: this.masterDrawer, onGestureEvent: this.onHandleGestureEvent, onHandlerStateChange: this.onHandleGestureEvent },
350
+ React.createElement(Animated.View, null, renderHandle())),
351
+ React.createElement(PanGestureHandler, { ref: this.drawerContentRef, simultaneousHandlers: [this.scrollComponentRef, this.masterDrawer], shouldCancelWhenOutside: false, onGestureEvent: this.onDrawerGestureEvent, onHandlerStateChange: this.onDrawerGestureEvent },
352
+ React.createElement(Animated.View, { style: styles.container },
353
+ React.createElement(NativeViewGestureHandler, { ref: this.scrollComponentRef, waitFor: this.masterDrawer, simultaneousHandlers: this.drawerContentRef },
354
+ React.createElement(AnimatedScrollableComponent, { overScrollMode: "never", bounces: false, ...rest, ref: this.props.innerRef,
355
+ // @ts-ignore
356
+ decelerationRate: this.decelerationRate, onScrollBeginDrag: this.onScrollBeginDrag, scrollEventThrottle: 1, contentContainerStyle: [
357
+ rest.contentContainerStyle,
358
+ { paddingBottom: this.getNormalisedSnapPoints()[0] },
359
+ ] })))),
360
+ this.props.animatedPosition && (React.createElement(Animated.Code, { exec: onChange(this.position, set(this.props.animatedPosition, this.position)) })),
361
+ React.createElement(Animated.Code, { exec: onChange(this.dragY, cond(not(eq(this.dragY, 0)), set(this.prevDragY, this.dragY))) }),
362
+ React.createElement(Animated.Code, { exec: onChange(this.didGestureFinish, cond(this.didGestureFinish, [
363
+ this.didScrollUpAndPullDown,
364
+ this.setTranslationY,
365
+ set(this.tempDestSnapPoint, add(normalisedSnapPoints[0], this.extraOffset)),
366
+ set(this.nextSnapIndex, 0),
367
+ set(this.destSnapPoint, this.calculateNextSnapPoint()),
368
+ cond(and(greaterThan(this.dragY, this.lastStartScrollY), this.isAndroid, not(this.dragWithHandle)), call([], () => {
369
+ var _a, _b;
370
+ // This prevents the scroll glide from happening on Android when pulling down with inertia.
371
+ // It's not perfect, but does the job for now
372
+ const { method, args } = imperativeScrollOptions[this.props.componentType];
373
+ // @ts-ignore
374
+ const node = this.props.innerRef.current;
375
+ if (node &&
376
+ node[method] &&
377
+ ((this.props.componentType === "FlatList" &&
378
+ (((_b = (_a = this.props) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.length) || 0) > 0) ||
379
+ (this.props.componentType === "SectionList" &&
380
+ this.props.sections.length > 0) ||
381
+ this.props.componentType === "ScrollView")) {
382
+ node[method](args);
383
+ }
384
+ })),
385
+ set(this.dragY, 0),
386
+ set(this.velocityY, 0),
387
+ set(this.lastSnap, sub(this.destSnapPoint, cond(eq(this.scrollUpAndPullDown, 1), this.lastStartScrollY, 0))),
388
+ call([this.lastSnap], ([value]) => {
389
+ var _a, _b;
390
+ // This is the TapGHandler trick
391
+ // @ts-ignore
392
+ (_b = (_a = this.masterDrawer) === null || _a === void 0 ? void 0 : _a.current) === null || _b === void 0 ? void 0 : _b.setNativeProps({
393
+ maxDeltaY: value - this.getNormalisedSnapPoints()[0],
394
+ });
395
+ }),
396
+ set(this.decelerationRate, cond(eq(this.isAndroid, 1), cond(eq(this.lastSnap, normalisedSnapPoints[0]), ANDROID_NORMAL_DECELERATION_RATE, 0), IOS_NORMAL_DECELERATION_RATE)),
397
+ ])) }),
398
+ React.createElement(Animated.Code, { exec: onChange(this.isManuallySetValue, [
399
+ cond(this.isManuallySetValue, [
400
+ set(this.destSnapPoint, this.manualYOffset),
401
+ set(this.animationFinished, 0),
402
+ set(this.lastSnap, this.manualYOffset),
403
+ call([this.lastSnap], ([value]) => {
404
+ var _a, _b;
405
+ // This is the TapGHandler trick
406
+ // @ts-ignore
407
+ (_b = (_a = this.masterDrawer) === null || _a === void 0 ? void 0 : _a.current) === null || _b === void 0 ? void 0 : _b.setNativeProps({
408
+ maxDeltaY: value - this.getNormalisedSnapPoints()[0],
409
+ });
410
+ }),
411
+ ], [set(this.nextSnapIndex, 0)]),
412
+ ]) })));
413
+ // On Android, having an intermediary view with pointerEvents="box-none", breaks the
414
+ // waitFor logic
415
+ if (Platform.OS === "android") {
416
+ return (React.createElement(TapGestureHandler, { maxDurationMs: 100000, ref: this.masterDrawer, maxDeltaY: initialSnap - this.getNormalisedSnapPoints()[0], shouldCancelWhenOutside: false }, Content));
417
+ }
418
+ // On iOS, We need to wrap the content on a view with PointerEvents box-none
419
+ // So that we can start scrolling automatically when reaching the top without
420
+ // Stopping the gesture
421
+ return (React.createElement(TapGestureHandler, { maxDurationMs: 100000, ref: this.masterDrawer, maxDeltaY: initialSnap - this.getNormalisedSnapPoints()[0] },
422
+ React.createElement(View, { style: StyleSheet.absoluteFillObject, pointerEvents: "box-none" }, Content)));
423
+ }
424
+ }
425
+ ScrollBottomSheet.defaultProps = {
426
+ topInset: 0,
427
+ friction: 0.95,
428
+ animationType: "timing",
429
+ innerRef: React.createRef(),
430
+ enableOverScroll: false,
431
+ };
432
+ export default ScrollBottomSheet;
433
+ const styles = StyleSheet.create({
434
+ container: {
435
+ flex: 1,
436
+ },
437
+ });
@@ -50,7 +50,7 @@ const DeckSwiper = ({ onIndexChanged, onEndReached, startCardIndex = 0, infinite
50
50
  };
51
51
  const styles = StyleSheet.create({
52
52
  cardsContainer: {
53
- width: "100%",
53
+ flex: 1,
54
54
  },
55
55
  card: {
56
56
  left: 0,
@@ -120,7 +120,7 @@ const DeckSwiper = <T extends object>({
120
120
 
121
121
  const styles = StyleSheet.create({
122
122
  cardsContainer: {
123
- width: "100%",
123
+ flex: 1,
124
124
  },
125
125
  card: {
126
126
  left: 0,
@@ -38,7 +38,7 @@ const disabledColor = "rgb(240, 240, 240)";
38
38
  const errorColor = "rgba(255, 69, 100, 1)";
39
39
  //Empty string for 'value' is treated as a non-value
40
40
  //reason: Draftbit uses empty string as initial value for string state*/
41
- const Picker = ({ error, options = [], onValueChange, defaultValue, Icon, style, placeholder = "Select an option", value, disabled = false, assistiveText, label, iconColor = unstyledColor, iconSize = 24, leftIconMode = "inset", leftIconName, placeholderTextColor = unstyledColor, rightIconName, type = "solid", autoDismissKeyboard = true, }) => {
41
+ const Picker = ({ error, options = [], onValueChange, defaultValue, Icon, style, placeholder, value, disabled = false, assistiveText, label, iconColor = unstyledColor, iconSize = 24, leftIconMode = "inset", leftIconName, placeholderTextColor = unstyledColor, rightIconName, type = "solid", autoDismissKeyboard = true, }) => {
42
42
  var _a, _b;
43
43
  const androidPickerRef = React.useRef(undefined);
44
44
  const [internalValue, setInternalValue] = React.useState(value || defaultValue);
@@ -50,6 +50,9 @@ const Picker = ({ error, options = [], onValueChange, defaultValue, Icon, style,
50
50
  if (value != null && value !== "") {
51
51
  setInternalValue(value);
52
52
  }
53
+ else if (value === "") {
54
+ setInternalValue(undefined);
55
+ }
53
56
  }, [value]);
54
57
  React.useEffect(() => {
55
58
  if (defaultValue != null && defaultValue !== "") {
@@ -67,12 +70,21 @@ const Picker = ({ error, options = [], onValueChange, defaultValue, Icon, style,
67
70
  Keyboard.dismiss();
68
71
  }
69
72
  }, [pickerVisible, autoDismissKeyboard]);
70
- const normalizedOptions = normalizeOptions(options);
73
+ const normalizedOptions = React.useMemo(() => normalizeOptions(options), [options]);
71
74
  //Underlying Picker component defaults selection to first element when value is not provided (or undefined)
72
75
  //Placholder must be the 1st option in order to allow selection of the 'actual' 1st option
73
- const pickerOptions = placeholder
76
+ const pickerOptions = React.useMemo(() => placeholder
74
77
  ? [{ label: placeholder, value: placeholder }, ...normalizedOptions]
75
- : normalizedOptions;
78
+ : normalizedOptions, [placeholder, normalizedOptions]);
79
+ //When no placeholder is provided then first item should be marked selected to reflect underlying Picker internal state
80
+ if (!placeholder &&
81
+ pickerOptions.length &&
82
+ !internalValue &&
83
+ internalValue !== pickerOptions[0].value //Prevent infinite state changes incase first value is falsy
84
+ ) {
85
+ onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(pickerOptions[0].value, 0);
86
+ setInternalValue(pickerOptions[0].value);
87
+ }
76
88
  const { viewStyles, textStyles } = extractStyles(style);
77
89
  const additionalBorderStyles = ["backgroundColor"];
78
90
  const additionalMarginStyles = [
@@ -101,7 +101,7 @@ const Picker: React.FC<PickerProps> = ({
101
101
  defaultValue,
102
102
  Icon,
103
103
  style,
104
- placeholder = "Select an option",
104
+ placeholder,
105
105
  value,
106
106
  disabled = false,
107
107
  assistiveText,
@@ -130,6 +130,8 @@ const Picker: React.FC<PickerProps> = ({
130
130
  React.useEffect(() => {
131
131
  if (value != null && value !== "") {
132
132
  setInternalValue(value);
133
+ } else if (value === "") {
134
+ setInternalValue(undefined);
133
135
  }
134
136
  }, [value]);
135
137
 
@@ -151,13 +153,31 @@ const Picker: React.FC<PickerProps> = ({
151
153
  }
152
154
  }, [pickerVisible, autoDismissKeyboard]);
153
155
 
154
- const normalizedOptions = normalizeOptions(options);
156
+ const normalizedOptions = React.useMemo(
157
+ () => normalizeOptions(options),
158
+ [options]
159
+ );
155
160
 
156
161
  //Underlying Picker component defaults selection to first element when value is not provided (or undefined)
157
162
  //Placholder must be the 1st option in order to allow selection of the 'actual' 1st option
158
- const pickerOptions = placeholder
159
- ? [{ label: placeholder, value: placeholder }, ...normalizedOptions]
160
- : normalizedOptions;
163
+ const pickerOptions = React.useMemo(
164
+ () =>
165
+ placeholder
166
+ ? [{ label: placeholder, value: placeholder }, ...normalizedOptions]
167
+ : normalizedOptions,
168
+ [placeholder, normalizedOptions]
169
+ );
170
+
171
+ //When no placeholder is provided then first item should be marked selected to reflect underlying Picker internal state
172
+ if (
173
+ !placeholder &&
174
+ pickerOptions.length &&
175
+ !internalValue &&
176
+ internalValue !== pickerOptions[0].value //Prevent infinite state changes incase first value is falsy
177
+ ) {
178
+ onValueChange?.(pickerOptions[0].value, 0);
179
+ setInternalValue(pickerOptions[0].value);
180
+ }
161
181
 
162
182
  const { viewStyles, textStyles } = extractStyles(style);
163
183
 
@@ -1,6 +1,11 @@
1
1
  import React from "react";
2
+ import { StyleSheet } from "react-native";
2
3
  import { Shadow as ShadowComponent } from "react-native-shadow-2";
3
- const Shadow = ({ offsetX = 0, offsetY = 0, showShadowSideStart = true, showShadowSideEnd = true, showShadowSideTop = true, showShadowSideBottom = true, showShadowCornerTopStart = true, showShadowCornerTopEnd = true, showShadowCornerBottomStart = true, showShadowCornerBottomEnd = true, paintInside = false, style, ...rest }) => {
4
+ import { extractBorderAndMarginStyles } from "../utilities";
5
+ const Shadow = ({ offsetX = 0, offsetY = 0, showShadowSideStart = true, showShadowSideEnd = true, showShadowSideTop = true, showShadowSideBottom = true, showShadowCornerTopStart = true, showShadowCornerTopEnd = true, showShadowCornerBottomStart = true, showShadowCornerBottomEnd = true, paintInside = true, style, ...rest }) => {
6
+ const { borderStyles } = extractBorderAndMarginStyles(style);
7
+ const containerStyle = StyleSheet.flatten(style);
8
+ Object.keys(borderStyles).forEach((key) => delete containerStyle[key]);
4
9
  return (React.createElement(ShadowComponent, { offset: [offsetX, offsetY], sides: {
5
10
  start: showShadowSideStart,
6
11
  end: showShadowSideEnd,
@@ -11,6 +16,6 @@ const Shadow = ({ offsetX = 0, offsetY = 0, showShadowSideStart = true, showShad
11
16
  topEnd: showShadowCornerTopEnd,
12
17
  bottomStart: showShadowCornerBottomStart,
13
18
  bottomEnd: showShadowCornerBottomEnd,
14
- }, containerStyle: style, paintInside: paintInside, ...rest }));
19
+ }, style: borderStyles, containerStyle: containerStyle, paintInside: paintInside, ...rest }));
15
20
  };
16
21
  export default Shadow;
@@ -1,6 +1,7 @@
1
1
  import React from "react";
2
- import { StyleProp, ViewStyle } from "react-native";
2
+ import { StyleProp, ViewStyle, StyleSheet } from "react-native";
3
3
  import { Shadow as ShadowComponent } from "react-native-shadow-2";
4
+ import { extractBorderAndMarginStyles } from "../utilities";
4
5
 
5
6
  interface ShadowProps {
6
7
  disabled?: boolean;
@@ -33,10 +34,15 @@ const Shadow: React.FC<React.PropsWithChildren<ShadowProps>> = ({
33
34
  showShadowCornerTopEnd = true,
34
35
  showShadowCornerBottomStart = true,
35
36
  showShadowCornerBottomEnd = true,
36
- paintInside = false,
37
+ paintInside = true,
37
38
  style,
38
39
  ...rest
39
40
  }) => {
41
+ const { borderStyles } = extractBorderAndMarginStyles(style);
42
+
43
+ const containerStyle = StyleSheet.flatten(style) as StyleProp<any>;
44
+ Object.keys(borderStyles).forEach((key) => delete containerStyle[key]);
45
+
40
46
  return (
41
47
  <ShadowComponent
42
48
  offset={[offsetX, offsetY]}
@@ -52,7 +58,8 @@ const Shadow: React.FC<React.PropsWithChildren<ShadowProps>> = ({
52
58
  bottomStart: showShadowCornerBottomStart,
53
59
  bottomEnd: showShadowCornerBottomEnd,
54
60
  }}
55
- containerStyle={style}
61
+ style={borderStyles}
62
+ containerStyle={containerStyle}
56
63
  paintInside={paintInside}
57
64
  {...rest}
58
65
  />
@@ -39,7 +39,7 @@ const TabViewComponent = ({ Icon, onIndexChanged, onEndReached, tabBarPosition,
39
39
  }
40
40
  };
41
41
  const renderTabBar = (props) => {
42
- return (React.createElement(TabBar, { ...props, activeColor: activeColor || theme.colors.primary, inactiveColor: inactiveColor || theme.colors.divider, pressColor: pressColor || theme.colors.primary, scrollEnabled: scrollEnabled, indicatorStyle: {
42
+ return (React.createElement(TabBar, { ...props, activeColor: activeColor || theme.colors.primary, inactiveColor: inactiveColor || "rgb(200,200,200)", pressColor: pressColor || theme.colors.primary, scrollEnabled: scrollEnabled, indicatorStyle: {
43
43
  backgroundColor: indicatorColor || theme.colors.primary,
44
44
  }, labelStyle: textStyles, renderIcon: ({ route, color }) => (route === null || route === void 0 ? void 0 : route.icon) ? (React.createElement(Icon, { name: route.icon, color: color, size: 16 })) : null, style: {
45
45
  backgroundColor: tabsBackgroundColor || theme.colors.background,
@@ -106,7 +106,7 @@ const TabViewComponent: React.FC<React.PropsWithChildren<TabViewProps>> = ({
106
106
  <TabBar
107
107
  {...props}
108
108
  activeColor={activeColor || theme.colors.primary}
109
- inactiveColor={inactiveColor || theme.colors.divider}
109
+ inactiveColor={inactiveColor || "rgb(200,200,200)"}
110
110
  pressColor={pressColor || theme.colors.primary}
111
111
  scrollEnabled={scrollEnabled}
112
112
  indicatorStyle={{
package/src/index.js CHANGED
@@ -35,6 +35,7 @@ export { default as Shadow } from "./components/Shadow";
35
35
  export { DeckSwiper, DeckSwiperCard } from "./components/DeckSwiper";
36
36
  export { TabView, TabViewItem } from "./components/TabView";
37
37
  export { default as Markdown } from "./components/Markdown";
38
+ export { BottomSheet } from "./components/BottomSheet";
38
39
  export { YoutubePlayer } from "./components/YoutubePlayer";
39
40
  export { Table, TableRow, TableCell } from "./components/Table";
40
41
  /* Deprecated: Fix or Delete! */
package/src/index.tsx CHANGED
@@ -58,6 +58,8 @@ export { DeckSwiper, DeckSwiperCard } from "./components/DeckSwiper";
58
58
  export { TabView, TabViewItem } from "./components/TabView";
59
59
  export { default as Markdown } from "./components/Markdown";
60
60
 
61
+ export { BottomSheet } from "./components/BottomSheet";
62
+
61
63
  export { YoutubePlayer } from "./components/YoutubePlayer";
62
64
 
63
65
  export { Table, TableRow, TableCell } from "./components/Table";