@react-native-oh-tpl/react-native-gesture-handler 2.12.6-1 → 2.12.6-2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. package/harmony/gesture_handler/LICENSE +21 -0
  2. package/harmony/gesture_handler/OAT.xml +44 -0
  3. package/harmony/gesture_handler/README.OpenSource +11 -0
  4. package/harmony/gesture_handler/README.md +1 -0
  5. package/harmony/gesture_handler/build-profile.json5 +7 -7
  6. package/harmony/gesture_handler/hvigorfile.ts +2 -2
  7. package/harmony/gesture_handler/index.ets +2 -2
  8. package/harmony/gesture_handler/oh-package.json5 +13 -11
  9. package/harmony/gesture_handler/src/main/cpp/CMakeLists.txt +8 -8
  10. package/harmony/gesture_handler/src/main/cpp/GestureHandlerPackage.cpp +33 -33
  11. package/harmony/gesture_handler/src/main/cpp/GestureHandlerPackage.h +14 -14
  12. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerButtonComponentDescriptor.h +60 -60
  13. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerModule.cpp +17 -17
  14. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerModule.h +11 -11
  15. package/harmony/gesture_handler/src/main/cpp/RNGestureHandlerRootViewComponentDescriptor.h +60 -60
  16. package/harmony/gesture_handler/src/main/ets/CircularBuffer.ts +42 -42
  17. package/harmony/gesture_handler/src/main/ets/Event.ts +67 -67
  18. package/harmony/gesture_handler/src/main/ets/EventDispatcher.ts +37 -37
  19. package/harmony/gesture_handler/src/main/ets/GestureHandler.ts +663 -663
  20. package/harmony/gesture_handler/src/main/ets/GestureHandlerArkUIAdapter.ets +201 -201
  21. package/harmony/gesture_handler/src/main/ets/GestureHandlerFactory.ts +44 -44
  22. package/harmony/gesture_handler/src/main/ets/GestureHandlerOrchestrator.ts +280 -280
  23. package/harmony/gesture_handler/src/main/ets/GestureHandlerPackage.ts +22 -22
  24. package/harmony/gesture_handler/src/main/ets/GestureHandlerRegistry.ts +27 -27
  25. package/harmony/gesture_handler/src/main/ets/InteractionManager.ts +108 -108
  26. package/harmony/gesture_handler/src/main/ets/LeastSquareSolver.ts +182 -182
  27. package/harmony/gesture_handler/src/main/ets/NativeViewGestureHandler.ts +114 -114
  28. package/harmony/gesture_handler/src/main/ets/OutgoingEvent.ts +33 -33
  29. package/harmony/gesture_handler/src/main/ets/PanGestureHandler.ts +327 -327
  30. package/harmony/gesture_handler/src/main/ets/PointerTracker.ts +239 -239
  31. package/harmony/gesture_handler/src/main/ets/RNGHError.ts +4 -4
  32. package/harmony/gesture_handler/src/main/ets/RNGHLogger.ts +28 -28
  33. package/harmony/gesture_handler/src/main/ets/RNGHRootTouchHandler.ets +57 -57
  34. package/harmony/gesture_handler/src/main/ets/RNGestureHandlerButton.ets +36 -36
  35. package/harmony/gesture_handler/src/main/ets/RNGestureHandlerModule.ts +125 -125
  36. package/harmony/gesture_handler/src/main/ets/RNGestureHandlerRootView.ets +56 -55
  37. package/harmony/gesture_handler/src/main/ets/RNOHScrollLocker.ts +10 -10
  38. package/harmony/gesture_handler/src/main/ets/State.ts +46 -46
  39. package/harmony/gesture_handler/src/main/ets/TapGestureHandler.ts +205 -205
  40. package/harmony/gesture_handler/src/main/ets/Vector2D.ts +36 -36
  41. package/harmony/gesture_handler/src/main/ets/VelocityTracker.ts +98 -98
  42. package/harmony/gesture_handler/src/main/ets/View.ts +70 -70
  43. package/harmony/gesture_handler/src/main/ets/ViewRegistry.ts +42 -42
  44. package/harmony/gesture_handler/src/main/ets/pages/Index.ets +16 -16
  45. package/harmony/gesture_handler/src/main/ets/webviewability/WebviewAbility.ts +41 -41
  46. package/harmony/gesture_handler/src/main/module.json5 +6 -6
  47. package/harmony/gesture_handler/src/main/resources/base/element/color.json +7 -7
  48. package/harmony/gesture_handler/src/main/resources/base/element/string.json +15 -15
  49. package/harmony/gesture_handler/src/main/resources/base/profile/main_pages.json +5 -5
  50. package/harmony/gesture_handler/src/main/resources/en_US/element/string.json +15 -15
  51. package/harmony/gesture_handler/src/main/resources/zh_CN/element/string.json +15 -15
  52. package/harmony/gesture_handler.har +0 -0
  53. package/lib/commonjs/components/touchables/GenericTouchable.js +9 -9
  54. package/lib/commonjs/components/touchables/TouchableOpacity.js +2 -2
  55. package/lib/commonjs/handlers/createNativeWrapper.js +6 -6
  56. package/lib/commonjs/handlers/gestures/GestureDetector.js +3 -3
  57. package/lib/module/components/touchables/GenericTouchable.js +9 -9
  58. package/lib/module/components/touchables/TouchableOpacity.js +2 -2
  59. package/lib/module/handlers/createNativeWrapper.js +6 -6
  60. package/lib/module/handlers/gestures/GestureDetector.js +3 -3
  61. package/package.json +70 -70
  62. package/src/RNGestureHandlerModule.ts +6 -6
  63. package/src/components/GestureButtons.tsx +334 -334
  64. package/src/components/GestureHandlerButton.tsx +5 -5
  65. package/src/components/GestureHandlerRootView.tsx +34 -34
  66. package/src/components/RNGestureHandlerButton.tsx +23 -23
  67. package/src/components/touchables/GenericTouchable.tsx +301 -301
  68. package/src/components/touchables/TouchableOpacity.tsx +76 -76
  69. package/src/components/touchables/TouchableWithoutFeedback.tsx +14 -14
  70. package/src/components/touchables/index.ts +7 -7
  71. package/src/handlers/NativeViewGestureHandler.ts +55 -55
  72. package/src/handlers/PanGestureHandler.ts +327 -327
  73. package/src/handlers/TapGestureHandler.ts +95 -95
  74. package/src/handlers/createHandler.tsx +535 -535
  75. package/src/handlers/createNativeWrapper.tsx +81 -81
  76. package/src/handlers/gestureHandlerCommon.ts +15 -15
  77. package/src/handlers/gestures/GestureDetector.tsx +823 -823
  78. package/src/index.ts +172 -172
  79. package/src/init.ts +18 -18
@@ -1,334 +1,334 @@
1
- import * as React from 'react';
2
- import {
3
- Animated,
4
- Platform,
5
- processColor,
6
- StyleSheet,
7
- StyleProp,
8
- ViewStyle,
9
- } from 'react-native';
10
-
11
- import createNativeWrapper from '../handlers/createNativeWrapper';
12
- import GestureHandlerButton from './GestureHandlerButton';
13
- import { State } from 'react-native-gesture-handler/src/State';
14
-
15
- import {
16
- GestureEvent,
17
- HandlerStateChangeEvent,
18
- } from 'react-native-gesture-handler/src/handlers/gestureHandlerCommon';
19
- import {
20
- NativeViewGestureHandlerPayload,
21
- NativeViewGestureHandlerProps,
22
- } from 'react-native-gesture-handler/src/handlers/NativeViewGestureHandler';
23
-
24
- export interface RawButtonProps extends NativeViewGestureHandlerProps {
25
- /**
26
- * Defines if more than one button could be pressed simultaneously. By default
27
- * set true.
28
- */
29
- exclusive?: boolean;
30
- // TODO: we should transform props in `createNativeWrapper`
31
-
32
- /**
33
- * Android only.
34
- *
35
- * Defines color of native ripple animation used since API level 21.
36
- */
37
- rippleColor?: any; // it was present in BaseButtonProps before but is used here in code
38
-
39
- /**
40
- * Android only.
41
- *
42
- * Defines radius of native ripple animation used since API level 21.
43
- */
44
- rippleRadius?: number | null;
45
-
46
- /**
47
- * Android only.
48
- *
49
- * Set this to true if you want the ripple animation to render outside the view bounds.
50
- */
51
- borderless?: boolean;
52
-
53
- /**
54
- * Android only.
55
- *
56
- * Defines whether the ripple animation should be drawn on the foreground of the view.
57
- */
58
- foreground?: boolean;
59
-
60
- /**
61
- * Android only.
62
- *
63
- * Set this to true if you don't want the system to play sound when the button is pressed.
64
- */
65
- touchSoundDisabled?: boolean;
66
- }
67
-
68
- export interface BaseButtonProps extends RawButtonProps {
69
- /**
70
- * Called when the button gets pressed (analogous to `onPress` in
71
- * `TouchableHighlight` from RN core).
72
- */
73
- onPress?: (pointerInside: boolean) => void;
74
-
75
- /**
76
- * Called when the button gets pressed and is held for `delayLongPress`
77
- * milliseconds.
78
- */
79
- onLongPress?: () => void;
80
-
81
- /**
82
- * Called when button changes from inactive to active and vice versa. It
83
- * passes active state as a boolean variable as a first parameter for that
84
- * method.
85
- */
86
- onActiveStateChange?: (active: boolean) => void;
87
- style?: StyleProp<ViewStyle>;
88
- testID?: string;
89
-
90
- /**
91
- * Delay, in milliseconds, after which the `onLongPress` callback gets called.
92
- * Defaults to 600.
93
- */
94
- delayLongPress?: number;
95
- }
96
-
97
- export interface RectButtonProps extends BaseButtonProps {
98
- /**
99
- * Background color that will be dimmed when button is in active state.
100
- */
101
- underlayColor?: string;
102
-
103
- /**
104
- * iOS only.
105
- *
106
- * Opacity applied to the underlay when button is in active state.
107
- */
108
- activeOpacity?: number;
109
- }
110
-
111
- export interface BorderlessButtonProps extends BaseButtonProps {
112
- /**
113
- * iOS only.
114
- *
115
- * Opacity applied to the button when it is in an active state.
116
- */
117
- activeOpacity?: number;
118
- }
119
-
120
- export const RawButton = createNativeWrapper(GestureHandlerButton, {
121
- shouldCancelWhenOutside: false,
122
- shouldActivateOnStart: false,
123
- });
124
-
125
- export class BaseButton extends React.Component<BaseButtonProps> {
126
- static defaultProps = {
127
- delayLongPress: 600,
128
- };
129
-
130
- private lastActive: boolean;
131
- private longPressTimeout: ReturnType<typeof setTimeout> | undefined;
132
- private longPressDetected: boolean;
133
-
134
- constructor(props: BaseButtonProps) {
135
- super(props);
136
- this.lastActive = false;
137
- this.longPressDetected = false;
138
- }
139
-
140
- private handleEvent = ({
141
- nativeEvent,
142
- }: HandlerStateChangeEvent<NativeViewGestureHandlerPayload>) => {
143
- const { state, oldState, pointerInside } = nativeEvent;
144
- const active = pointerInside && state === State.ACTIVE;
145
-
146
- if (active !== this.lastActive && this.props.onActiveStateChange) {
147
- this.props.onActiveStateChange(active);
148
- }
149
-
150
- if (
151
- !this.longPressDetected &&
152
- oldState === State.ACTIVE &&
153
- state !== State.CANCELLED &&
154
- this.lastActive &&
155
- this.props.onPress
156
- ) {
157
- this.props.onPress(active);
158
- }
159
-
160
- if (
161
- !this.lastActive &&
162
- // NativeViewGestureHandler sends different events based on platform
163
- state === (Platform.OS !== 'android' ? State.ACTIVE : State.BEGAN) &&
164
- pointerInside
165
- ) {
166
- this.longPressDetected = false;
167
- if (this.props.onLongPress) {
168
- this.longPressTimeout = setTimeout(
169
- this.onLongPress,
170
- this.props.delayLongPress
171
- );
172
- }
173
- } else if (
174
- // cancel longpress timeout if it's set and the finger moved out of the view
175
- state === State.ACTIVE &&
176
- !pointerInside &&
177
- this.longPressTimeout !== undefined
178
- ) {
179
- clearTimeout(this.longPressTimeout);
180
- this.longPressTimeout = undefined;
181
- } else if (
182
- // cancel longpress timeout if it's set and the gesture has finished
183
- this.longPressTimeout !== undefined &&
184
- (state === State.END ||
185
- state === State.CANCELLED ||
186
- state === State.FAILED)
187
- ) {
188
- clearTimeout(this.longPressTimeout);
189
- this.longPressTimeout = undefined;
190
- }
191
-
192
- this.lastActive = active;
193
- };
194
-
195
- private onLongPress = () => {
196
- this.longPressDetected = true;
197
- this.props.onLongPress?.();
198
- };
199
-
200
- // Normally, the parent would execute it's handler first, then forward the
201
- // event to listeners. However, here our handler is virtually only forwarding
202
- // events to listeners, so we reverse the order to keep the proper order of
203
- // the callbacks (from "raw" ones to "processed").
204
- private onHandlerStateChange = (
205
- e: HandlerStateChangeEvent<NativeViewGestureHandlerPayload>
206
- ) => {
207
- this.props.onHandlerStateChange?.(e);
208
- this.handleEvent(e);
209
- };
210
-
211
- private onGestureEvent = (
212
- e: GestureEvent<NativeViewGestureHandlerPayload>
213
- ) => {
214
- this.props.onGestureEvent?.(e);
215
- this.handleEvent(
216
- e as HandlerStateChangeEvent<NativeViewGestureHandlerPayload>
217
- ); // TODO: maybe it is not correct
218
- };
219
-
220
- render() {
221
- const { rippleColor, ...rest } = this.props;
222
-
223
- return (
224
- <RawButton
225
- rippleColor={processColor(rippleColor)}
226
- {...rest}
227
- onGestureEvent={this.onGestureEvent}
228
- onHandlerStateChange={this.onHandlerStateChange}
229
- />
230
- );
231
- }
232
- }
233
-
234
- const AnimatedBaseButton = Animated.createAnimatedComponent(BaseButton);
235
-
236
- const btnStyles = StyleSheet.create({
237
- underlay: {
238
- position: 'absolute',
239
- left: 0,
240
- right: 0,
241
- bottom: 0,
242
- top: 0,
243
- },
244
- });
245
-
246
- export class RectButton extends React.Component<RectButtonProps> {
247
- static defaultProps = {
248
- activeOpacity: 0.105,
249
- underlayColor: 'black',
250
- };
251
-
252
- private opacity: Animated.Value;
253
-
254
- constructor(props: RectButtonProps) {
255
- super(props);
256
- this.opacity = new Animated.Value(0);
257
- }
258
-
259
- private onActiveStateChange = (active: boolean) => {
260
- if (Platform.OS !== 'android') {
261
- this.opacity.setValue(active ? this.props.activeOpacity! : 0);
262
- }
263
-
264
- this.props.onActiveStateChange?.(active);
265
- };
266
-
267
- render() {
268
- const { children, style, ...rest } = this.props;
269
-
270
- const resolvedStyle = StyleSheet.flatten(style ?? {});
271
-
272
- return (
273
- <BaseButton
274
- {...rest}
275
- style={resolvedStyle}
276
- onActiveStateChange={this.onActiveStateChange}
277
- >
278
- <Animated.View
279
- style={[
280
- btnStyles.underlay,
281
- {
282
- opacity: this.opacity,
283
- backgroundColor: this.props.underlayColor,
284
- borderRadius: resolvedStyle.borderRadius,
285
- borderTopLeftRadius: resolvedStyle.borderTopLeftRadius,
286
- borderTopRightRadius: resolvedStyle.borderTopRightRadius,
287
- borderBottomLeftRadius: resolvedStyle.borderBottomLeftRadius,
288
- borderBottomRightRadius: resolvedStyle.borderBottomRightRadius,
289
- },
290
- ]}
291
- />
292
- {children}
293
- </BaseButton>
294
- );
295
- }
296
- }
297
-
298
- export class BorderlessButton extends React.Component<BorderlessButtonProps> {
299
- static defaultProps = {
300
- activeOpacity: 0.3,
301
- borderless: true,
302
- };
303
-
304
- private opacity: Animated.Value;
305
-
306
- constructor(props: BorderlessButtonProps) {
307
- super(props);
308
- this.opacity = new Animated.Value(1);
309
- }
310
-
311
- private onActiveStateChange = (active: boolean) => {
312
- if (Platform.OS !== 'android') {
313
- this.opacity.setValue(active ? this.props.activeOpacity! : 1);
314
- }
315
-
316
- this.props.onActiveStateChange?.(active);
317
- };
318
-
319
- render() {
320
- const { children, style, ...rest } = this.props;
321
-
322
- return (
323
- <AnimatedBaseButton
324
- {...rest}
325
- onActiveStateChange={this.onActiveStateChange}
326
- style={[style, Platform.OS === 'ios' && { opacity: this.opacity }]}
327
- >
328
- {children}
329
- </AnimatedBaseButton>
330
- );
331
- }
332
- }
333
-
334
- export { default as PureNativeButton } from './GestureHandlerButton';
1
+ import * as React from 'react';
2
+ import {
3
+ Animated,
4
+ Platform,
5
+ processColor,
6
+ StyleSheet,
7
+ StyleProp,
8
+ ViewStyle,
9
+ } from 'react-native';
10
+
11
+ import createNativeWrapper from '../handlers/createNativeWrapper';
12
+ import GestureHandlerButton from './GestureHandlerButton';
13
+ import { State } from 'react-native-gesture-handler/src/State';
14
+
15
+ import {
16
+ GestureEvent,
17
+ HandlerStateChangeEvent,
18
+ } from 'react-native-gesture-handler/src/handlers/gestureHandlerCommon';
19
+ import {
20
+ NativeViewGestureHandlerPayload,
21
+ NativeViewGestureHandlerProps,
22
+ } from 'react-native-gesture-handler/src/handlers/NativeViewGestureHandler';
23
+
24
+ export interface RawButtonProps extends NativeViewGestureHandlerProps {
25
+ /**
26
+ * Defines if more than one button could be pressed simultaneously. By default
27
+ * set true.
28
+ */
29
+ exclusive?: boolean;
30
+ // TODO: we should transform props in `createNativeWrapper`
31
+
32
+ /**
33
+ * Android only.
34
+ *
35
+ * Defines color of native ripple animation used since API level 21.
36
+ */
37
+ rippleColor?: any; // it was present in BaseButtonProps before but is used here in code
38
+
39
+ /**
40
+ * Android only.
41
+ *
42
+ * Defines radius of native ripple animation used since API level 21.
43
+ */
44
+ rippleRadius?: number | null;
45
+
46
+ /**
47
+ * Android only.
48
+ *
49
+ * Set this to true if you want the ripple animation to render outside the view bounds.
50
+ */
51
+ borderless?: boolean;
52
+
53
+ /**
54
+ * Android only.
55
+ *
56
+ * Defines whether the ripple animation should be drawn on the foreground of the view.
57
+ */
58
+ foreground?: boolean;
59
+
60
+ /**
61
+ * Android only.
62
+ *
63
+ * Set this to true if you don't want the system to play sound when the button is pressed.
64
+ */
65
+ touchSoundDisabled?: boolean;
66
+ }
67
+
68
+ export interface BaseButtonProps extends RawButtonProps {
69
+ /**
70
+ * Called when the button gets pressed (analogous to `onPress` in
71
+ * `TouchableHighlight` from RN core).
72
+ */
73
+ onPress?: (pointerInside: boolean) => void;
74
+
75
+ /**
76
+ * Called when the button gets pressed and is held for `delayLongPress`
77
+ * milliseconds.
78
+ */
79
+ onLongPress?: () => void;
80
+
81
+ /**
82
+ * Called when button changes from inactive to active and vice versa. It
83
+ * passes active state as a boolean variable as a first parameter for that
84
+ * method.
85
+ */
86
+ onActiveStateChange?: (active: boolean) => void;
87
+ style?: StyleProp<ViewStyle>;
88
+ testID?: string;
89
+
90
+ /**
91
+ * Delay, in milliseconds, after which the `onLongPress` callback gets called.
92
+ * Defaults to 600.
93
+ */
94
+ delayLongPress?: number;
95
+ }
96
+
97
+ export interface RectButtonProps extends BaseButtonProps {
98
+ /**
99
+ * Background color that will be dimmed when button is in active state.
100
+ */
101
+ underlayColor?: string;
102
+
103
+ /**
104
+ * iOS only.
105
+ *
106
+ * Opacity applied to the underlay when button is in active state.
107
+ */
108
+ activeOpacity?: number;
109
+ }
110
+
111
+ export interface BorderlessButtonProps extends BaseButtonProps {
112
+ /**
113
+ * iOS only.
114
+ *
115
+ * Opacity applied to the button when it is in an active state.
116
+ */
117
+ activeOpacity?: number;
118
+ }
119
+
120
+ export const RawButton = createNativeWrapper(GestureHandlerButton, {
121
+ shouldCancelWhenOutside: false,
122
+ shouldActivateOnStart: false,
123
+ });
124
+
125
+ export class BaseButton extends React.Component<BaseButtonProps> {
126
+ static defaultProps = {
127
+ delayLongPress: 600,
128
+ };
129
+
130
+ private lastActive: boolean;
131
+ private longPressTimeout: ReturnType<typeof setTimeout> | undefined;
132
+ private longPressDetected: boolean;
133
+
134
+ constructor(props: BaseButtonProps) {
135
+ super(props);
136
+ this.lastActive = false;
137
+ this.longPressDetected = false;
138
+ }
139
+
140
+ private handleEvent = ({
141
+ nativeEvent,
142
+ }: HandlerStateChangeEvent<NativeViewGestureHandlerPayload>) => {
143
+ const { state, oldState, pointerInside } = nativeEvent;
144
+ const active = pointerInside && state === State.ACTIVE;
145
+
146
+ if (active !== this.lastActive && this.props.onActiveStateChange) {
147
+ this.props.onActiveStateChange(active);
148
+ }
149
+
150
+ if (
151
+ !this.longPressDetected &&
152
+ oldState === State.ACTIVE &&
153
+ state !== State.CANCELLED &&
154
+ this.lastActive &&
155
+ this.props.onPress
156
+ ) {
157
+ this.props.onPress(active);
158
+ }
159
+
160
+ if (
161
+ !this.lastActive &&
162
+ // NativeViewGestureHandler sends different events based on platform
163
+ state === (Platform.OS !== 'android' ? State.ACTIVE : State.BEGAN) &&
164
+ pointerInside
165
+ ) {
166
+ this.longPressDetected = false;
167
+ if (this.props.onLongPress) {
168
+ this.longPressTimeout = setTimeout(
169
+ this.onLongPress,
170
+ this.props.delayLongPress
171
+ );
172
+ }
173
+ } else if (
174
+ // cancel longpress timeout if it's set and the finger moved out of the view
175
+ state === State.ACTIVE &&
176
+ !pointerInside &&
177
+ this.longPressTimeout !== undefined
178
+ ) {
179
+ clearTimeout(this.longPressTimeout);
180
+ this.longPressTimeout = undefined;
181
+ } else if (
182
+ // cancel longpress timeout if it's set and the gesture has finished
183
+ this.longPressTimeout !== undefined &&
184
+ (state === State.END ||
185
+ state === State.CANCELLED ||
186
+ state === State.FAILED)
187
+ ) {
188
+ clearTimeout(this.longPressTimeout);
189
+ this.longPressTimeout = undefined;
190
+ }
191
+
192
+ this.lastActive = active;
193
+ };
194
+
195
+ private onLongPress = () => {
196
+ this.longPressDetected = true;
197
+ this.props.onLongPress?.();
198
+ };
199
+
200
+ // Normally, the parent would execute it's handler first, then forward the
201
+ // event to listeners. However, here our handler is virtually only forwarding
202
+ // events to listeners, so we reverse the order to keep the proper order of
203
+ // the callbacks (from "raw" ones to "processed").
204
+ private onHandlerStateChange = (
205
+ e: HandlerStateChangeEvent<NativeViewGestureHandlerPayload>
206
+ ) => {
207
+ this.props.onHandlerStateChange?.(e);
208
+ this.handleEvent(e);
209
+ };
210
+
211
+ private onGestureEvent = (
212
+ e: GestureEvent<NativeViewGestureHandlerPayload>
213
+ ) => {
214
+ this.props.onGestureEvent?.(e);
215
+ this.handleEvent(
216
+ e as HandlerStateChangeEvent<NativeViewGestureHandlerPayload>
217
+ ); // TODO: maybe it is not correct
218
+ };
219
+
220
+ render() {
221
+ const { rippleColor, ...rest } = this.props;
222
+
223
+ return (
224
+ <RawButton
225
+ rippleColor={processColor(rippleColor)}
226
+ {...rest}
227
+ onGestureEvent={this.onGestureEvent}
228
+ onHandlerStateChange={this.onHandlerStateChange}
229
+ />
230
+ );
231
+ }
232
+ }
233
+
234
+ const AnimatedBaseButton = Animated.createAnimatedComponent(BaseButton);
235
+
236
+ const btnStyles = StyleSheet.create({
237
+ underlay: {
238
+ position: 'absolute',
239
+ left: 0,
240
+ right: 0,
241
+ bottom: 0,
242
+ top: 0,
243
+ },
244
+ });
245
+
246
+ export class RectButton extends React.Component<RectButtonProps> {
247
+ static defaultProps = {
248
+ activeOpacity: 0.105,
249
+ underlayColor: 'black',
250
+ };
251
+
252
+ private opacity: Animated.Value;
253
+
254
+ constructor(props: RectButtonProps) {
255
+ super(props);
256
+ this.opacity = new Animated.Value(0);
257
+ }
258
+
259
+ private onActiveStateChange = (active: boolean) => {
260
+ if (Platform.OS !== 'android') {
261
+ this.opacity.setValue(active ? this.props.activeOpacity! : 0);
262
+ }
263
+
264
+ this.props.onActiveStateChange?.(active);
265
+ };
266
+
267
+ render() {
268
+ const { children, style, ...rest } = this.props;
269
+
270
+ const resolvedStyle = StyleSheet.flatten(style ?? {});
271
+
272
+ return (
273
+ <BaseButton
274
+ {...rest}
275
+ style={resolvedStyle}
276
+ onActiveStateChange={this.onActiveStateChange}
277
+ >
278
+ <Animated.View
279
+ style={[
280
+ btnStyles.underlay,
281
+ {
282
+ opacity: this.opacity,
283
+ backgroundColor: this.props.underlayColor,
284
+ borderRadius: resolvedStyle.borderRadius,
285
+ borderTopLeftRadius: resolvedStyle.borderTopLeftRadius,
286
+ borderTopRightRadius: resolvedStyle.borderTopRightRadius,
287
+ borderBottomLeftRadius: resolvedStyle.borderBottomLeftRadius,
288
+ borderBottomRightRadius: resolvedStyle.borderBottomRightRadius,
289
+ },
290
+ ]}
291
+ />
292
+ {children}
293
+ </BaseButton>
294
+ );
295
+ }
296
+ }
297
+
298
+ export class BorderlessButton extends React.Component<BorderlessButtonProps> {
299
+ static defaultProps = {
300
+ activeOpacity: 0.3,
301
+ borderless: true,
302
+ };
303
+
304
+ private opacity: Animated.Value;
305
+
306
+ constructor(props: BorderlessButtonProps) {
307
+ super(props);
308
+ this.opacity = new Animated.Value(1);
309
+ }
310
+
311
+ private onActiveStateChange = (active: boolean) => {
312
+ if (Platform.OS !== 'android') {
313
+ this.opacity.setValue(active ? this.props.activeOpacity! : 1);
314
+ }
315
+
316
+ this.props.onActiveStateChange?.(active);
317
+ };
318
+
319
+ render() {
320
+ const { children, style, ...rest } = this.props;
321
+
322
+ return (
323
+ <AnimatedBaseButton
324
+ {...rest}
325
+ onActiveStateChange={this.onActiveStateChange}
326
+ style={[style, Platform.OS === 'ios' && { opacity: this.opacity }]}
327
+ >
328
+ {children}
329
+ </AnimatedBaseButton>
330
+ );
331
+ }
332
+ }
333
+
334
+ export { default as PureNativeButton } from './GestureHandlerButton';
@@ -1,5 +1,5 @@
1
- import { HostComponent } from 'react-native';
2
- import { RawButtonProps } from 'react-native-gesture-handler/src/components/GestureButtons';
3
- import { RNGestureHandlerButton } from './RNGestureHandlerButton';
4
-
5
- export default RNGestureHandlerButton as HostComponent<RawButtonProps>;
1
+ import { HostComponent } from 'react-native';
2
+ import { RawButtonProps } from 'react-native-gesture-handler/src/components/GestureButtons';
3
+ import { RNGestureHandlerButton } from './RNGestureHandlerButton';
4
+
5
+ export default RNGestureHandlerButton as HostComponent<RawButtonProps>;