@tamagui/react-native-use-pressable 1.14.1 → 1.14.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.
- package/dist/cjs/PressResponder.js +419 -1
- package/dist/cjs/PressResponder.js.map +2 -2
- package/dist/cjs/index.js +56 -1
- package/dist/cjs/index.js.map +2 -2
- package/dist/esm/PressResponder.js +397 -1
- package/dist/esm/PressResponder.js.map +2 -2
- package/dist/esm/PressResponder.mjs +397 -1
- package/dist/esm/PressResponder.mjs.map +2 -2
- package/dist/esm/index.js +22 -1
- package/dist/esm/index.js.map +2 -2
- package/dist/esm/index.mjs +22 -1
- package/dist/esm/index.mjs.map +2 -2
- package/package.json +2 -2
|
@@ -1,2 +1,398 @@
|
|
|
1
|
-
const
|
|
1
|
+
const DELAY = "DELAY";
|
|
2
|
+
const ERROR = "ERROR";
|
|
3
|
+
const LONG_PRESS_DETECTED = "LONG_PRESS_DETECTED";
|
|
4
|
+
const NOT_RESPONDER = "NOT_RESPONDER";
|
|
5
|
+
const RESPONDER_ACTIVE_LONG_PRESS_START = "RESPONDER_ACTIVE_LONG_PRESS_START";
|
|
6
|
+
const RESPONDER_ACTIVE_PRESS_START = "RESPONDER_ACTIVE_PRESS_START";
|
|
7
|
+
const RESPONDER_INACTIVE_PRESS_START = "RESPONDER_INACTIVE_PRESS_START";
|
|
8
|
+
const RESPONDER_GRANT = "RESPONDER_GRANT";
|
|
9
|
+
const RESPONDER_RELEASE = "RESPONDER_RELEASE";
|
|
10
|
+
const RESPONDER_TERMINATED = "RESPONDER_TERMINATED";
|
|
11
|
+
const Transitions = Object.freeze({
|
|
12
|
+
NOT_RESPONDER: {
|
|
13
|
+
DELAY: ERROR,
|
|
14
|
+
RESPONDER_GRANT: RESPONDER_INACTIVE_PRESS_START,
|
|
15
|
+
RESPONDER_RELEASE: ERROR,
|
|
16
|
+
RESPONDER_TERMINATED: ERROR,
|
|
17
|
+
LONG_PRESS_DETECTED: ERROR
|
|
18
|
+
},
|
|
19
|
+
RESPONDER_INACTIVE_PRESS_START: {
|
|
20
|
+
DELAY: RESPONDER_ACTIVE_PRESS_START,
|
|
21
|
+
RESPONDER_GRANT: ERROR,
|
|
22
|
+
RESPONDER_RELEASE: NOT_RESPONDER,
|
|
23
|
+
RESPONDER_TERMINATED: NOT_RESPONDER,
|
|
24
|
+
LONG_PRESS_DETECTED: ERROR
|
|
25
|
+
},
|
|
26
|
+
RESPONDER_ACTIVE_PRESS_START: {
|
|
27
|
+
DELAY: ERROR,
|
|
28
|
+
RESPONDER_GRANT: ERROR,
|
|
29
|
+
RESPONDER_RELEASE: NOT_RESPONDER,
|
|
30
|
+
RESPONDER_TERMINATED: NOT_RESPONDER,
|
|
31
|
+
LONG_PRESS_DETECTED: RESPONDER_ACTIVE_LONG_PRESS_START
|
|
32
|
+
},
|
|
33
|
+
RESPONDER_ACTIVE_LONG_PRESS_START: {
|
|
34
|
+
DELAY: ERROR,
|
|
35
|
+
RESPONDER_GRANT: ERROR,
|
|
36
|
+
RESPONDER_RELEASE: NOT_RESPONDER,
|
|
37
|
+
RESPONDER_TERMINATED: NOT_RESPONDER,
|
|
38
|
+
LONG_PRESS_DETECTED: RESPONDER_ACTIVE_LONG_PRESS_START
|
|
39
|
+
},
|
|
40
|
+
ERROR: {
|
|
41
|
+
DELAY: NOT_RESPONDER,
|
|
42
|
+
RESPONDER_GRANT: RESPONDER_INACTIVE_PRESS_START,
|
|
43
|
+
RESPONDER_RELEASE: NOT_RESPONDER,
|
|
44
|
+
RESPONDER_TERMINATED: NOT_RESPONDER,
|
|
45
|
+
LONG_PRESS_DETECTED: NOT_RESPONDER
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
const isActiveSignal = (signal) => signal === RESPONDER_ACTIVE_PRESS_START || signal === RESPONDER_ACTIVE_LONG_PRESS_START;
|
|
49
|
+
const isButtonRole = (element) => element.getAttribute("role") === "button";
|
|
50
|
+
const isPressStartSignal = (signal) => signal === RESPONDER_INACTIVE_PRESS_START || signal === RESPONDER_ACTIVE_PRESS_START || signal === RESPONDER_ACTIVE_LONG_PRESS_START;
|
|
51
|
+
const isTerminalSignal = (signal) => signal === RESPONDER_TERMINATED || signal === RESPONDER_RELEASE;
|
|
52
|
+
const isValidKeyPress = (event) => {
|
|
53
|
+
const key = event.key;
|
|
54
|
+
const target = event.target;
|
|
55
|
+
const role = target.getAttribute("role");
|
|
56
|
+
const isSpacebar = key === " " || key === "Spacebar";
|
|
57
|
+
return key === "Enter" || isSpacebar && role === "button";
|
|
58
|
+
};
|
|
59
|
+
const DEFAULT_LONG_PRESS_DELAY_MS = 450;
|
|
60
|
+
const DEFAULT_PRESS_DELAY_MS = 50;
|
|
61
|
+
class PressResponder {
|
|
62
|
+
constructor(config) {
|
|
63
|
+
this._touchActivatePosition = null;
|
|
64
|
+
this._pressDelayTimeout = 0;
|
|
65
|
+
this._selectionTerminated = false;
|
|
66
|
+
this._isPointerTouch = false;
|
|
67
|
+
this._longPressDelayTimeout = 0;
|
|
68
|
+
this._longPressDispatched = false;
|
|
69
|
+
this._pressOutDelayTimeout = 0;
|
|
70
|
+
this._touchState = NOT_RESPONDER;
|
|
71
|
+
this._config = null;
|
|
72
|
+
this._eventHandlers = null;
|
|
73
|
+
this.configure(config);
|
|
74
|
+
}
|
|
75
|
+
configure(config) {
|
|
76
|
+
this._config = config;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Resets any pending timers. This should be called on unmount.
|
|
80
|
+
*/
|
|
81
|
+
reset() {
|
|
82
|
+
this._cancelLongPressDelayTimeout();
|
|
83
|
+
this._cancelPressDelayTimeout();
|
|
84
|
+
this._cancelPressOutDelayTimeout();
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Returns a set of props to spread into the interactive element.
|
|
88
|
+
*/
|
|
89
|
+
getEventHandlers() {
|
|
90
|
+
if (this._eventHandlers == null) {
|
|
91
|
+
this._eventHandlers = this._createEventHandlers();
|
|
92
|
+
}
|
|
93
|
+
return this._eventHandlers;
|
|
94
|
+
}
|
|
95
|
+
_createEventHandlers() {
|
|
96
|
+
const start = (event, shouldDelay) => {
|
|
97
|
+
event.persist();
|
|
98
|
+
this._cancelPressOutDelayTimeout();
|
|
99
|
+
this._longPressDispatched = false;
|
|
100
|
+
this._selectionTerminated = false;
|
|
101
|
+
this._touchState = NOT_RESPONDER;
|
|
102
|
+
this._isPointerTouch = event.nativeEvent.type === "touchstart";
|
|
103
|
+
this._receiveSignal(RESPONDER_GRANT, event);
|
|
104
|
+
const delayPressStart = normalizeDelay(
|
|
105
|
+
this._config.delayPressStart,
|
|
106
|
+
0,
|
|
107
|
+
DEFAULT_PRESS_DELAY_MS
|
|
108
|
+
);
|
|
109
|
+
if (shouldDelay !== false && delayPressStart > 0) {
|
|
110
|
+
this._pressDelayTimeout = setTimeout(() => {
|
|
111
|
+
this._receiveSignal(DELAY, event);
|
|
112
|
+
}, delayPressStart);
|
|
113
|
+
} else {
|
|
114
|
+
this._receiveSignal(DELAY, event);
|
|
115
|
+
}
|
|
116
|
+
const delayLongPress = normalizeDelay(
|
|
117
|
+
this._config.delayLongPress,
|
|
118
|
+
10,
|
|
119
|
+
DEFAULT_LONG_PRESS_DELAY_MS
|
|
120
|
+
);
|
|
121
|
+
this._longPressDelayTimeout = setTimeout(() => {
|
|
122
|
+
this._handleLongPress(event);
|
|
123
|
+
}, delayLongPress + delayPressStart);
|
|
124
|
+
};
|
|
125
|
+
const end = (event) => {
|
|
126
|
+
this._receiveSignal(RESPONDER_RELEASE, event);
|
|
127
|
+
};
|
|
128
|
+
const keyupHandler = (event) => {
|
|
129
|
+
const onPress = this._config.onPress;
|
|
130
|
+
const target = event.target;
|
|
131
|
+
if (this._touchState !== NOT_RESPONDER && isValidKeyPress(event)) {
|
|
132
|
+
end(event);
|
|
133
|
+
document.removeEventListener("keyup", keyupHandler);
|
|
134
|
+
const role = target.getAttribute("role");
|
|
135
|
+
const elementType = target.tagName.toLowerCase();
|
|
136
|
+
const isNativeInteractiveElement = role === "link" || elementType === "a" || elementType === "button" || elementType === "input" || elementType === "select" || elementType === "textarea";
|
|
137
|
+
if (onPress != null && !isNativeInteractiveElement) {
|
|
138
|
+
onPress(event);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
return {
|
|
143
|
+
onStartShouldSetResponder: (event) => {
|
|
144
|
+
const disabled = this._config.disabled;
|
|
145
|
+
if (disabled && isButtonRole(event.currentTarget)) {
|
|
146
|
+
event.stopPropagation();
|
|
147
|
+
}
|
|
148
|
+
if (disabled == null) {
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
return !disabled;
|
|
152
|
+
},
|
|
153
|
+
onKeyDown: (event) => {
|
|
154
|
+
const disabled = this._config.disabled;
|
|
155
|
+
const key = event.key;
|
|
156
|
+
const target = event.target;
|
|
157
|
+
if (!disabled && isValidKeyPress(event)) {
|
|
158
|
+
if (this._touchState === NOT_RESPONDER) {
|
|
159
|
+
start(event, false);
|
|
160
|
+
document.addEventListener("keyup", keyupHandler);
|
|
161
|
+
}
|
|
162
|
+
const role = target.getAttribute("role");
|
|
163
|
+
const isSpacebarKey = key === " " || key === "Spacebar";
|
|
164
|
+
const _isButtonRole = role === "button" || role === "menuitem";
|
|
165
|
+
if (isSpacebarKey && _isButtonRole) {
|
|
166
|
+
event.preventDefault();
|
|
167
|
+
}
|
|
168
|
+
event.stopPropagation();
|
|
169
|
+
}
|
|
170
|
+
},
|
|
171
|
+
onResponderGrant: (event) => start(event),
|
|
172
|
+
onResponderMove: (event) => {
|
|
173
|
+
if (this._config.onPressMove != null) {
|
|
174
|
+
this._config.onPressMove(event);
|
|
175
|
+
}
|
|
176
|
+
const touch = getTouchFromResponderEvent(event);
|
|
177
|
+
if (this._touchActivatePosition != null) {
|
|
178
|
+
const deltaX = this._touchActivatePosition.pageX - touch.pageX;
|
|
179
|
+
const deltaY = this._touchActivatePosition.pageY - touch.pageY;
|
|
180
|
+
if (Math.hypot(deltaX, deltaY) > 10) {
|
|
181
|
+
this._cancelLongPressDelayTimeout();
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
onResponderRelease: (event) => end(event),
|
|
186
|
+
onResponderTerminate: (event) => {
|
|
187
|
+
if (event.nativeEvent.type === "selectionchange") {
|
|
188
|
+
this._selectionTerminated = true;
|
|
189
|
+
}
|
|
190
|
+
this._receiveSignal(RESPONDER_TERMINATED, event);
|
|
191
|
+
},
|
|
192
|
+
onResponderTerminationRequest: (event) => {
|
|
193
|
+
const _this$_config = this._config;
|
|
194
|
+
const cancelable = _this$_config.cancelable;
|
|
195
|
+
const disabled = _this$_config.disabled;
|
|
196
|
+
const onLongPress = _this$_config.onLongPress;
|
|
197
|
+
if (!disabled && onLongPress != null && this._isPointerTouch && event.nativeEvent.type === "contextmenu") {
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
if (cancelable == null) {
|
|
201
|
+
return true;
|
|
202
|
+
}
|
|
203
|
+
return cancelable;
|
|
204
|
+
},
|
|
205
|
+
// NOTE: this diverges from react-native in 3 significant ways:
|
|
206
|
+
// * The `onPress` callback is not connected to the responder system (the native
|
|
207
|
+
// `click` event must be used but is dispatched in many scenarios where no pointers
|
|
208
|
+
// are on the screen.) Therefore, it's possible for `onPress` to be called without
|
|
209
|
+
// `onPress{Start,End}` being called first.
|
|
210
|
+
// * The `onPress` callback is only be called on the first ancestor of the native
|
|
211
|
+
// `click` target that is using the PressResponder.
|
|
212
|
+
// * The event's `nativeEvent` is a `MouseEvent` not a `TouchEvent`.
|
|
213
|
+
onClick: (event) => {
|
|
214
|
+
const _this$_config2 = this._config;
|
|
215
|
+
const disabled = _this$_config2.disabled;
|
|
216
|
+
const onPress = _this$_config2.onPress;
|
|
217
|
+
if (!disabled) {
|
|
218
|
+
event.stopPropagation();
|
|
219
|
+
if (this._longPressDispatched || this._selectionTerminated) {
|
|
220
|
+
event.preventDefault();
|
|
221
|
+
} else if (onPress != null && event.altKey === false) {
|
|
222
|
+
onPress(event);
|
|
223
|
+
}
|
|
224
|
+
} else {
|
|
225
|
+
if (isButtonRole(event.currentTarget)) {
|
|
226
|
+
event.stopPropagation();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
// If `onLongPress` is provided and a touch pointer is being used, prevent the
|
|
231
|
+
// default context menu from opening.
|
|
232
|
+
onContextMenu: (event) => {
|
|
233
|
+
const _this$_config3 = this._config;
|
|
234
|
+
const disabled = _this$_config3.disabled;
|
|
235
|
+
const onLongPress = _this$_config3.onLongPress;
|
|
236
|
+
if (!disabled) {
|
|
237
|
+
if (onLongPress != null && this._isPointerTouch && !event.defaultPrevented) {
|
|
238
|
+
event.preventDefault();
|
|
239
|
+
event.stopPropagation();
|
|
240
|
+
}
|
|
241
|
+
} else {
|
|
242
|
+
if (isButtonRole(event.currentTarget)) {
|
|
243
|
+
event.stopPropagation();
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Receives a state machine signal, performs side effects of the transition
|
|
251
|
+
* and stores the new state. Validates the transition as well.
|
|
252
|
+
*/
|
|
253
|
+
_receiveSignal(signal, event) {
|
|
254
|
+
const prevState = this._touchState;
|
|
255
|
+
let nextState = null;
|
|
256
|
+
if (Transitions[prevState] != null) {
|
|
257
|
+
nextState = Transitions[prevState][signal];
|
|
258
|
+
}
|
|
259
|
+
if (this._touchState === NOT_RESPONDER && signal === RESPONDER_RELEASE) {
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
if (nextState == null || nextState === ERROR) {
|
|
263
|
+
console.error(
|
|
264
|
+
`PressResponder: Invalid signal ${signal} for state ${prevState} on responder`
|
|
265
|
+
);
|
|
266
|
+
} else if (prevState !== nextState) {
|
|
267
|
+
this._performTransitionSideEffects(prevState, nextState, signal, event);
|
|
268
|
+
this._touchState = nextState;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Performs a transition between touchable states and identify any activations
|
|
273
|
+
* or deactivations (and callback invocations).
|
|
274
|
+
*/
|
|
275
|
+
_performTransitionSideEffects(prevState, nextState, signal, event) {
|
|
276
|
+
if (isTerminalSignal(signal)) {
|
|
277
|
+
setTimeout(() => {
|
|
278
|
+
this._isPointerTouch = false;
|
|
279
|
+
}, 0);
|
|
280
|
+
this._touchActivatePosition = null;
|
|
281
|
+
this._cancelLongPressDelayTimeout();
|
|
282
|
+
}
|
|
283
|
+
if (isPressStartSignal(prevState) && signal === LONG_PRESS_DETECTED) {
|
|
284
|
+
const onLongPress = this._config.onLongPress;
|
|
285
|
+
if (onLongPress != null && event.nativeEvent.key == null) {
|
|
286
|
+
onLongPress(event);
|
|
287
|
+
this._longPressDispatched = true;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
const isPrevActive = isActiveSignal(prevState);
|
|
291
|
+
const isNextActive = isActiveSignal(nextState);
|
|
292
|
+
if (!isPrevActive && isNextActive) {
|
|
293
|
+
this._activate(event);
|
|
294
|
+
} else if (isPrevActive && !isNextActive) {
|
|
295
|
+
this._deactivate(event);
|
|
296
|
+
}
|
|
297
|
+
if (isPressStartSignal(prevState) && signal === RESPONDER_RELEASE) {
|
|
298
|
+
const _this$_config4 = this._config;
|
|
299
|
+
const _onLongPress = _this$_config4.onLongPress;
|
|
300
|
+
const onPress = _this$_config4.onPress;
|
|
301
|
+
if (onPress != null) {
|
|
302
|
+
const isPressCanceledByLongPress = _onLongPress != null && prevState === RESPONDER_ACTIVE_LONG_PRESS_START;
|
|
303
|
+
if (!isPressCanceledByLongPress) {
|
|
304
|
+
if (!(isNextActive || isPrevActive)) {
|
|
305
|
+
this._activate(event);
|
|
306
|
+
this._deactivate(event);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
this._cancelPressDelayTimeout();
|
|
312
|
+
}
|
|
313
|
+
_activate(event) {
|
|
314
|
+
const _this$_config5 = this._config;
|
|
315
|
+
const onPressChange = _this$_config5.onPressChange;
|
|
316
|
+
const onPressStart = _this$_config5.onPressStart;
|
|
317
|
+
const touch = getTouchFromResponderEvent(event);
|
|
318
|
+
this._touchActivatePosition = {
|
|
319
|
+
pageX: touch.pageX,
|
|
320
|
+
pageY: touch.pageY
|
|
321
|
+
};
|
|
322
|
+
if (onPressStart != null) {
|
|
323
|
+
onPressStart(event);
|
|
324
|
+
}
|
|
325
|
+
if (onPressChange != null) {
|
|
326
|
+
onPressChange(true);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
_deactivate(event) {
|
|
330
|
+
const _this$_config6 = this._config;
|
|
331
|
+
const onPressChange = _this$_config6.onPressChange;
|
|
332
|
+
const onPressEnd = _this$_config6.onPressEnd;
|
|
333
|
+
function end() {
|
|
334
|
+
if (onPressEnd != null) {
|
|
335
|
+
onPressEnd(event);
|
|
336
|
+
}
|
|
337
|
+
if (onPressChange != null) {
|
|
338
|
+
onPressChange(false);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
const delayPressEnd = normalizeDelay(this._config.delayPressEnd);
|
|
342
|
+
if (delayPressEnd > 0) {
|
|
343
|
+
this._pressOutDelayTimeout = setTimeout(() => {
|
|
344
|
+
end();
|
|
345
|
+
}, delayPressEnd);
|
|
346
|
+
} else {
|
|
347
|
+
end();
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
_handleLongPress(event) {
|
|
351
|
+
if (this._touchState === RESPONDER_ACTIVE_PRESS_START || this._touchState === RESPONDER_ACTIVE_LONG_PRESS_START) {
|
|
352
|
+
this._receiveSignal(LONG_PRESS_DETECTED, event);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
_cancelLongPressDelayTimeout() {
|
|
356
|
+
if (this._longPressDelayTimeout != null) {
|
|
357
|
+
clearTimeout(this._longPressDelayTimeout);
|
|
358
|
+
this._longPressDelayTimeout = null;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
_cancelPressDelayTimeout() {
|
|
362
|
+
if (this._pressDelayTimeout != null) {
|
|
363
|
+
clearTimeout(this._pressDelayTimeout);
|
|
364
|
+
this._pressDelayTimeout = null;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
_cancelPressOutDelayTimeout() {
|
|
368
|
+
if (this._pressOutDelayTimeout != null) {
|
|
369
|
+
clearTimeout(this._pressOutDelayTimeout);
|
|
370
|
+
this._pressOutDelayTimeout = null;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
function normalizeDelay(delay, min, fallback) {
|
|
375
|
+
if (min === void 0) {
|
|
376
|
+
min = 0;
|
|
377
|
+
}
|
|
378
|
+
if (fallback === void 0) {
|
|
379
|
+
fallback = 0;
|
|
380
|
+
}
|
|
381
|
+
return Math.max(min, delay !== null && delay !== void 0 ? delay : fallback);
|
|
382
|
+
}
|
|
383
|
+
function getTouchFromResponderEvent(event) {
|
|
384
|
+
const _event$nativeEvent = event.nativeEvent;
|
|
385
|
+
const changedTouches = _event$nativeEvent.changedTouches;
|
|
386
|
+
const touches = _event$nativeEvent.touches;
|
|
387
|
+
if (touches != null && touches.length > 0) {
|
|
388
|
+
return touches[0];
|
|
389
|
+
}
|
|
390
|
+
if (changedTouches != null && changedTouches.length > 0) {
|
|
391
|
+
return changedTouches[0];
|
|
392
|
+
}
|
|
393
|
+
return event.nativeEvent;
|
|
394
|
+
}
|
|
395
|
+
export {
|
|
396
|
+
PressResponder as default
|
|
397
|
+
};
|
|
2
398
|
//# sourceMappingURL=PressResponder.mjs.map
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/PressResponder.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n *\n * @format\n */\n'use strict'\n\nconst DELAY = 'DELAY'\nconst ERROR = 'ERROR'\nconst LONG_PRESS_DETECTED = 'LONG_PRESS_DETECTED'\nconst NOT_RESPONDER = 'NOT_RESPONDER'\nconst RESPONDER_ACTIVE_LONG_PRESS_START = 'RESPONDER_ACTIVE_LONG_PRESS_START'\nconst RESPONDER_ACTIVE_PRESS_START = 'RESPONDER_ACTIVE_PRESS_START'\nconst RESPONDER_INACTIVE_PRESS_START = 'RESPONDER_INACTIVE_PRESS_START'\nconst RESPONDER_GRANT = 'RESPONDER_GRANT'\nconst RESPONDER_RELEASE = 'RESPONDER_RELEASE'\nconst RESPONDER_TERMINATED = 'RESPONDER_TERMINATED'\nconst Transitions = Object.freeze({\n NOT_RESPONDER: {\n DELAY: ERROR,\n RESPONDER_GRANT: RESPONDER_INACTIVE_PRESS_START,\n RESPONDER_RELEASE: ERROR,\n RESPONDER_TERMINATED: ERROR,\n LONG_PRESS_DETECTED: ERROR,\n },\n RESPONDER_INACTIVE_PRESS_START: {\n DELAY: RESPONDER_ACTIVE_PRESS_START,\n RESPONDER_GRANT: ERROR,\n RESPONDER_RELEASE: NOT_RESPONDER,\n RESPONDER_TERMINATED: NOT_RESPONDER,\n LONG_PRESS_DETECTED: ERROR,\n },\n RESPONDER_ACTIVE_PRESS_START: {\n DELAY: ERROR,\n RESPONDER_GRANT: ERROR,\n RESPONDER_RELEASE: NOT_RESPONDER,\n RESPONDER_TERMINATED: NOT_RESPONDER,\n LONG_PRESS_DETECTED: RESPONDER_ACTIVE_LONG_PRESS_START,\n },\n RESPONDER_ACTIVE_LONG_PRESS_START: {\n DELAY: ERROR,\n RESPONDER_GRANT: ERROR,\n RESPONDER_RELEASE: NOT_RESPONDER,\n RESPONDER_TERMINATED: NOT_RESPONDER,\n LONG_PRESS_DETECTED: RESPONDER_ACTIVE_LONG_PRESS_START,\n },\n ERROR: {\n DELAY: NOT_RESPONDER,\n RESPONDER_GRANT: RESPONDER_INACTIVE_PRESS_START,\n RESPONDER_RELEASE: NOT_RESPONDER,\n RESPONDER_TERMINATED: NOT_RESPONDER,\n LONG_PRESS_DETECTED: NOT_RESPONDER,\n },\n})\n\nconst isActiveSignal = (signal) =>\n signal === RESPONDER_ACTIVE_PRESS_START ||\n signal === RESPONDER_ACTIVE_LONG_PRESS_START\n\nconst isButtonRole = (element) => element.getAttribute('role') === 'button'\n\nconst isPressStartSignal = (signal) =>\n signal === RESPONDER_INACTIVE_PRESS_START ||\n signal === RESPONDER_ACTIVE_PRESS_START ||\n signal === RESPONDER_ACTIVE_LONG_PRESS_START\n\nconst isTerminalSignal = (signal) =>\n signal === RESPONDER_TERMINATED || signal === RESPONDER_RELEASE\n\nconst isValidKeyPress = (event) => {\n const key = event.key\n const target = event.target\n const role = target.getAttribute('role')\n const isSpacebar = key === ' ' || key === 'Spacebar'\n return key === 'Enter' || (isSpacebar && role === 'button')\n}\n\nconst DEFAULT_LONG_PRESS_DELAY_MS = 450 // 500 - 50\n\nconst DEFAULT_PRESS_DELAY_MS = 50\n/**\n * =========================== PressResponder Tutorial ===========================\n *\n * The `PressResponder` class helps you create press interactions by analyzing the\n * geometry of elements and observing when another responder (e.g. ScrollView)\n * has stolen the touch lock. It offers hooks for your component to provide\n * interaction feedback to the user:\n *\n * - When a press has activated (e.g. highlight an element)\n * - When a press has deactivated (e.g. un-highlight an element)\n * - When a press sould trigger an action, meaning it activated and deactivated\n * while within the geometry of the element without the lock being stolen.\n *\n * A high quality interaction isn't as simple as you might think. There should\n * be a slight delay before activation. Moving your finger beyond an element's\n * bounds should trigger deactivation, but moving the same finger back within an\n * element's bounds should trigger reactivation.\n *\n * In order to use `PressResponder`, do the following:\n *\n * const pressResponder = new PressResponder(config);\n *\n * 2. Choose the rendered component who should collect the press events. On that\n * element, spread `pressability.getEventHandlers()` into its props.\n *\n * return (\n * <View {...this.state.pressResponder.getEventHandlers()} />\n * );\n *\n * 3. Reset `PressResponder` when your component unmounts.\n *\n * componentWillUnmount() {\n * this.state.pressResponder.reset();\n * }\n *\n * ==================== Implementation Details ====================\n *\n * `PressResponder` only assumes that there exists a `HitRect` node. The `PressRect`\n * is an abstract box that is extended beyond the `HitRect`.\n *\n * # Geometry\n *\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n * \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 - Presses start anywhere within `HitRect`.\n * \u2502 \u2502 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u2502 \u2502\n * \u2502 \u2502 \u2502 VisualRect \u2502 \u2502 \u2502\n * \u2502 \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502 \u2502 - When pressed down for sufficient amount of time\n * \u2502 \u2502 HitRect \u2502 \u2502 before letting up, `VisualRect` activates.\n * \u2502 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2502\n * \u2502 Out Region o \u2502\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502\u2500\u2500\u2500\u2518\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500 When the press is released outside the `HitRect`,\n * the responder is NOT eligible for a \"press\".\n *\n * # State Machine\n *\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u25C0\u2500\u2500\u2500\u2500 RESPONDER_RELEASE\n * \u2502 NOT_RESPONDER \u2502\n * \u2514\u2500\u2500\u2500\u252C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u25C0\u2500\u2500\u2500\u2500 RESPONDER_TERMINATED\n * \u2502\n * \u2502 RESPONDER_GRANT (HitRect)\n * \u2502\n * \u25BC\n * \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510 \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n * \u2502 RESPONDER_INACTIVE_ \u2502 DELAY \u2502 RESPONDER_ACTIVE_ \u2502 T + DELAY \u2502 RESPONDER_ACTIVE_ \u2502\n * \u2502 PRESS_START \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25B6 \u2502 PRESS_START \u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u25B6 \u2502 LONG_PRESS_START \u2502\n * \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518 \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n *\n * T + DELAY => LONG_PRESS_DELAY + DELAY\n *\n * Not drawn are the side effects of each transition. The most important side\n * effect is the invocation of `onLongPress`. Only when the browser produces a\n * `click` event is `onPress` invoked.\n */\n\nexport default class PressResponder {\n _touchActivatePosition = null as any\n _pressDelayTimeout = 0 as any\n _selectionTerminated = false\n _isPointerTouch = false\n _longPressDelayTimeout = 0 as any\n _longPressDispatched = false\n _pressOutDelayTimeout = 0 as any\n _touchState = NOT_RESPONDER\n _config = null as any\n _eventHandlers = null as any\n\n constructor(config) {\n this.configure(config)\n }\n\n configure(config) {\n this._config = config\n }\n /**\n * Resets any pending timers. This should be called on unmount.\n */\n\n reset() {\n this._cancelLongPressDelayTimeout()\n\n this._cancelPressDelayTimeout()\n\n this._cancelPressOutDelayTimeout()\n }\n /**\n * Returns a set of props to spread into the interactive element.\n */\n\n getEventHandlers() {\n if (this._eventHandlers == null) {\n this._eventHandlers = this._createEventHandlers()\n }\n\n return this._eventHandlers\n }\n\n _createEventHandlers() {\n const start = (event, shouldDelay?: boolean) => {\n event.persist()\n\n this._cancelPressOutDelayTimeout()\n\n this._longPressDispatched = false\n this._selectionTerminated = false\n this._touchState = NOT_RESPONDER\n this._isPointerTouch = event.nativeEvent.type === 'touchstart'\n\n this._receiveSignal(RESPONDER_GRANT, event)\n\n const delayPressStart = normalizeDelay(\n this._config.delayPressStart,\n 0,\n DEFAULT_PRESS_DELAY_MS,\n )\n\n if (shouldDelay !== false && delayPressStart > 0) {\n this._pressDelayTimeout = setTimeout(() => {\n this._receiveSignal(DELAY, event)\n }, delayPressStart)\n } else {\n this._receiveSignal(DELAY, event)\n }\n\n const delayLongPress = normalizeDelay(\n this._config.delayLongPress,\n 10,\n DEFAULT_LONG_PRESS_DELAY_MS,\n )\n this._longPressDelayTimeout = setTimeout(() => {\n this._handleLongPress(event)\n }, delayLongPress + delayPressStart)\n }\n\n const end = (event) => {\n this._receiveSignal(RESPONDER_RELEASE, event)\n }\n\n const keyupHandler = (event) => {\n const onPress = this._config.onPress\n const target = event.target\n\n if (this._touchState !== NOT_RESPONDER && isValidKeyPress(event)) {\n end(event)\n document.removeEventListener('keyup', keyupHandler)\n const role = target.getAttribute('role')\n const elementType = target.tagName.toLowerCase()\n const isNativeInteractiveElement =\n role === 'link' ||\n elementType === 'a' ||\n elementType === 'button' ||\n elementType === 'input' ||\n elementType === 'select' ||\n elementType === 'textarea'\n\n if (onPress != null && !isNativeInteractiveElement) {\n onPress(event)\n }\n }\n }\n\n return {\n onStartShouldSetResponder: (event) => {\n const disabled = this._config.disabled\n\n if (disabled && isButtonRole(event.currentTarget)) {\n event.stopPropagation()\n }\n\n if (disabled == null) {\n return true\n }\n\n return !disabled\n },\n onKeyDown: (event) => {\n const disabled = this._config.disabled\n const key = event.key\n const target = event.target\n\n if (!disabled && isValidKeyPress(event)) {\n if (this._touchState === NOT_RESPONDER) {\n start(event, false) // Listen to 'keyup' on document to account for situations where\n // focus is moved to another element during 'keydown'.\n\n document.addEventListener('keyup', keyupHandler)\n }\n\n const role = target.getAttribute('role')\n const isSpacebarKey = key === ' ' || key === 'Spacebar'\n\n const _isButtonRole = role === 'button' || role === 'menuitem'\n\n if (isSpacebarKey && _isButtonRole) {\n // Prevent spacebar scrolling the window\n event.preventDefault()\n }\n\n event.stopPropagation()\n }\n },\n onResponderGrant: (event) => start(event),\n onResponderMove: (event) => {\n if (this._config.onPressMove != null) {\n this._config.onPressMove(event)\n }\n\n const touch = getTouchFromResponderEvent(event)\n\n if (this._touchActivatePosition != null) {\n const deltaX = this._touchActivatePosition.pageX - touch.pageX\n const deltaY = this._touchActivatePosition.pageY - touch.pageY\n\n if (Math.hypot(deltaX, deltaY) > 10) {\n this._cancelLongPressDelayTimeout()\n }\n }\n },\n onResponderRelease: (event) => end(event),\n onResponderTerminate: (event) => {\n if (event.nativeEvent.type === 'selectionchange') {\n this._selectionTerminated = true\n }\n\n this._receiveSignal(RESPONDER_TERMINATED, event)\n },\n onResponderTerminationRequest: (event) => {\n const _this$_config = this._config\n const cancelable = _this$_config.cancelable\n const disabled = _this$_config.disabled\n const onLongPress = _this$_config.onLongPress // If `onLongPress` is provided, don't terminate on `contextmenu` as default\n // behavior will be prevented for non-mouse pointers.\n\n if (\n !disabled &&\n onLongPress != null &&\n this._isPointerTouch &&\n event.nativeEvent.type === 'contextmenu'\n ) {\n return false\n }\n\n if (cancelable == null) {\n return true\n }\n\n return cancelable\n },\n // NOTE: this diverges from react-native in 3 significant ways:\n // * The `onPress` callback is not connected to the responder system (the native\n // `click` event must be used but is dispatched in many scenarios where no pointers\n // are on the screen.) Therefore, it's possible for `onPress` to be called without\n // `onPress{Start,End}` being called first.\n // * The `onPress` callback is only be called on the first ancestor of the native\n // `click` target that is using the PressResponder.\n // * The event's `nativeEvent` is a `MouseEvent` not a `TouchEvent`.\n onClick: (event) => {\n const _this$_config2 = this._config\n const disabled = _this$_config2.disabled\n const onPress = _this$_config2.onPress\n\n if (!disabled) {\n // If long press dispatched, cancel default click behavior.\n // If the responder terminated because text was selected during the gesture,\n // cancel the default click behavior.\n event.stopPropagation()\n\n if (this._longPressDispatched || this._selectionTerminated) {\n event.preventDefault()\n } else if (onPress != null && event.altKey === false) {\n onPress(event)\n }\n } else {\n if (isButtonRole(event.currentTarget)) {\n event.stopPropagation()\n }\n }\n },\n // If `onLongPress` is provided and a touch pointer is being used, prevent the\n // default context menu from opening.\n onContextMenu: (event) => {\n const _this$_config3 = this._config\n const disabled = _this$_config3.disabled\n const onLongPress = _this$_config3.onLongPress\n\n if (!disabled) {\n if (\n onLongPress != null &&\n this._isPointerTouch &&\n !event.defaultPrevented\n ) {\n event.preventDefault()\n event.stopPropagation()\n }\n } else {\n if (isButtonRole(event.currentTarget)) {\n event.stopPropagation()\n }\n }\n },\n }\n }\n /**\n * Receives a state machine signal, performs side effects of the transition\n * and stores the new state. Validates the transition as well.\n */\n\n _receiveSignal(signal, event) {\n const prevState = this._touchState\n let nextState = null\n\n if (Transitions[prevState] != null) {\n nextState = Transitions[prevState][signal]\n }\n\n if (this._touchState === NOT_RESPONDER && signal === RESPONDER_RELEASE) {\n return\n }\n\n if (nextState == null || nextState === ERROR) {\n // eslint-disable-next-line no-console\n console.error(\n `PressResponder: Invalid signal ${signal} for state ${prevState} on responder`,\n )\n } else if (prevState !== nextState) {\n this._performTransitionSideEffects(prevState, nextState, signal, event)\n\n this._touchState = nextState\n }\n }\n /**\n * Performs a transition between touchable states and identify any activations\n * or deactivations (and callback invocations).\n */\n\n _performTransitionSideEffects(prevState, nextState, signal, event) {\n if (isTerminalSignal(signal)) {\n // Pressable suppression of contextmenu on windows.\n // On Windows, the contextmenu is displayed after pointerup.\n // https://github.com/necolas/react-native-web/issues/2296\n setTimeout(() => {\n this._isPointerTouch = false\n }, 0)\n this._touchActivatePosition = null\n\n this._cancelLongPressDelayTimeout()\n }\n\n if (isPressStartSignal(prevState) && signal === LONG_PRESS_DETECTED) {\n const onLongPress = this._config.onLongPress // Long press is not supported for keyboards because 'click' can be dispatched\n // immediately (and multiple times) after 'keydown'.\n\n if (onLongPress != null && event.nativeEvent.key == null) {\n onLongPress(event)\n this._longPressDispatched = true\n }\n }\n\n const isPrevActive = isActiveSignal(prevState)\n const isNextActive = isActiveSignal(nextState)\n\n if (!isPrevActive && isNextActive) {\n this._activate(event)\n } else if (isPrevActive && !isNextActive) {\n this._deactivate(event)\n }\n\n if (isPressStartSignal(prevState) && signal === RESPONDER_RELEASE) {\n const _this$_config4 = this._config\n const _onLongPress = _this$_config4.onLongPress\n const onPress = _this$_config4.onPress\n\n if (onPress != null) {\n const isPressCanceledByLongPress =\n _onLongPress != null && prevState === RESPONDER_ACTIVE_LONG_PRESS_START\n\n if (!isPressCanceledByLongPress) {\n // If we never activated (due to delays), activate and deactivate now.\n if (!(isNextActive || isPrevActive)) {\n this._activate(event)\n\n this._deactivate(event)\n }\n }\n }\n }\n\n this._cancelPressDelayTimeout()\n }\n\n _activate(event) {\n const _this$_config5 = this._config\n const onPressChange = _this$_config5.onPressChange\n const onPressStart = _this$_config5.onPressStart\n const touch = getTouchFromResponderEvent(event)\n this._touchActivatePosition = {\n pageX: touch.pageX,\n pageY: touch.pageY,\n }\n\n if (onPressStart != null) {\n onPressStart(event)\n }\n\n if (onPressChange != null) {\n onPressChange(true)\n }\n }\n\n _deactivate(event) {\n const _this$_config6 = this._config\n const onPressChange = _this$_config6.onPressChange\n const onPressEnd = _this$_config6.onPressEnd\n\n function end() {\n if (onPressEnd != null) {\n onPressEnd(event)\n }\n\n if (onPressChange != null) {\n onPressChange(false)\n }\n }\n\n const delayPressEnd = normalizeDelay(this._config.delayPressEnd)\n\n if (delayPressEnd > 0) {\n this._pressOutDelayTimeout = setTimeout(() => {\n end()\n }, delayPressEnd)\n } else {\n end()\n }\n }\n\n _handleLongPress(event) {\n if (\n this._touchState === RESPONDER_ACTIVE_PRESS_START ||\n this._touchState === RESPONDER_ACTIVE_LONG_PRESS_START\n ) {\n this._receiveSignal(LONG_PRESS_DETECTED, event)\n }\n }\n\n _cancelLongPressDelayTimeout() {\n if (this._longPressDelayTimeout != null) {\n clearTimeout(this._longPressDelayTimeout)\n this._longPressDelayTimeout = null\n }\n }\n\n _cancelPressDelayTimeout() {\n if (this._pressDelayTimeout != null) {\n clearTimeout(this._pressDelayTimeout)\n this._pressDelayTimeout = null\n }\n }\n\n _cancelPressOutDelayTimeout() {\n if (this._pressOutDelayTimeout != null) {\n clearTimeout(this._pressOutDelayTimeout)\n this._pressOutDelayTimeout = null\n }\n }\n}\n\nfunction normalizeDelay(delay, min?: number, fallback?: any) {\n if (min === void 0) {\n min = 0\n }\n\n if (fallback === void 0) {\n fallback = 0\n }\n\n return Math.max(min, delay !== null && delay !== void 0 ? delay : fallback)\n}\n\nfunction getTouchFromResponderEvent(event) {\n const _event$nativeEvent = event.nativeEvent\n const changedTouches = _event$nativeEvent.changedTouches\n const touches = _event$nativeEvent.touches\n\n if (touches != null && touches.length > 0) {\n return touches[0]\n }\n\n if (changedTouches != null && changedTouches.length > 0) {\n return changedTouches[0]\n }\n\n return event.nativeEvent\n}\n"],
|
|
5
|
-
"mappings": "AAWA,
|
|
6
|
-
"names": [
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
7
|
}
|
package/dist/esm/index.js
CHANGED
|
@@ -1,2 +1,23 @@
|
|
|
1
|
-
import{useDebugValue
|
|
1
|
+
import { useDebugValue, useEffect, useRef } from "react";
|
|
2
|
+
import PressResponder from "./PressResponder";
|
|
3
|
+
function usePressEvents(config) {
|
|
4
|
+
const pressResponderRef = useRef(null);
|
|
5
|
+
if (pressResponderRef.current == null) {
|
|
6
|
+
pressResponderRef.current = new PressResponder(config);
|
|
7
|
+
}
|
|
8
|
+
const pressResponder = pressResponderRef.current;
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
pressResponder.configure(config);
|
|
11
|
+
}, [config, pressResponder]);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
return () => {
|
|
14
|
+
pressResponder.reset();
|
|
15
|
+
};
|
|
16
|
+
}, [pressResponder]);
|
|
17
|
+
useDebugValue(config);
|
|
18
|
+
return pressResponder.getEventHandlers();
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
usePressEvents
|
|
22
|
+
};
|
|
2
23
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n *\n * @format\n */\n'use strict'\n\nimport { useDebugValue, useEffect, useRef } from 'react'\n\nimport PressResponder from './PressResponder'\n\n// todo\nexport type PressResponderConfig = any\n\nexport function usePressEvents(config?: any) {\n const pressResponderRef = useRef<any>(null)\n\n if (pressResponderRef.current == null) {\n pressResponderRef.current = new PressResponder(config)\n }\n\n const pressResponder = pressResponderRef.current // Re-configure to use the current node and configuration.\n\n useEffect(() => {\n pressResponder.configure(config)\n }, [config, pressResponder]) // Reset the `pressResponder` when cleanup needs to occur. This is\n // a separate effect because we do not want to rest the responder when `config` changes.\n\n useEffect(() => {\n return () => {\n pressResponder.reset()\n }\n }, [pressResponder])\n useDebugValue(config)\n return pressResponder.getEventHandlers()\n}\n"],
|
|
5
|
-
"mappings": "AAWA,
|
|
6
|
-
"names": [
|
|
5
|
+
"mappings": "AAWA,SAAS,eAAe,WAAW,cAAc;AAEjD,OAAO,oBAAoB;AAKpB,SAAS,eAAe,QAAc;AAC3C,QAAM,oBAAoB,OAAY,IAAI;AAE1C,MAAI,kBAAkB,WAAW,MAAM;AACrC,sBAAkB,UAAU,IAAI,eAAe,MAAM;AAAA,EACvD;AAEA,QAAM,iBAAiB,kBAAkB;AAEzC,YAAU,MAAM;AACd,mBAAe,UAAU,MAAM;AAAA,EACjC,GAAG,CAAC,QAAQ,cAAc,CAAC;AAG3B,YAAU,MAAM;AACd,WAAO,MAAM;AACX,qBAAe,MAAM;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AACnB,gBAAc,MAAM;AACpB,SAAO,eAAe,iBAAiB;AACzC;",
|
|
6
|
+
"names": []
|
|
7
7
|
}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,2 +1,23 @@
|
|
|
1
|
-
import{useDebugValue
|
|
1
|
+
import { useDebugValue, useEffect, useRef } from "react";
|
|
2
|
+
import PressResponder from "./PressResponder";
|
|
3
|
+
function usePressEvents(config) {
|
|
4
|
+
const pressResponderRef = useRef(null);
|
|
5
|
+
if (pressResponderRef.current == null) {
|
|
6
|
+
pressResponderRef.current = new PressResponder(config);
|
|
7
|
+
}
|
|
8
|
+
const pressResponder = pressResponderRef.current;
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
pressResponder.configure(config);
|
|
11
|
+
}, [config, pressResponder]);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
return () => {
|
|
14
|
+
pressResponder.reset();
|
|
15
|
+
};
|
|
16
|
+
}, [pressResponder]);
|
|
17
|
+
useDebugValue(config);
|
|
18
|
+
return pressResponder.getEventHandlers();
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
usePressEvents
|
|
22
|
+
};
|
|
2
23
|
//# sourceMappingURL=index.mjs.map
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
4
|
"sourcesContent": ["/**\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n *\n * @format\n */\n'use strict'\n\nimport { useDebugValue, useEffect, useRef } from 'react'\n\nimport PressResponder from './PressResponder'\n\n// todo\nexport type PressResponderConfig = any\n\nexport function usePressEvents(config?: any) {\n const pressResponderRef = useRef<any>(null)\n\n if (pressResponderRef.current == null) {\n pressResponderRef.current = new PressResponder(config)\n }\n\n const pressResponder = pressResponderRef.current // Re-configure to use the current node and configuration.\n\n useEffect(() => {\n pressResponder.configure(config)\n }, [config, pressResponder]) // Reset the `pressResponder` when cleanup needs to occur. This is\n // a separate effect because we do not want to rest the responder when `config` changes.\n\n useEffect(() => {\n return () => {\n pressResponder.reset()\n }\n }, [pressResponder])\n useDebugValue(config)\n return pressResponder.getEventHandlers()\n}\n"],
|
|
5
|
-
"mappings": "AAWA,
|
|
6
|
-
"names": [
|
|
5
|
+
"mappings": "AAWA,SAAS,eAAe,WAAW,cAAc;AAEjD,OAAO,oBAAoB;AAKpB,SAAS,eAAe,QAAc;AAC3C,QAAM,oBAAoB,OAAY,IAAI;AAE1C,MAAI,kBAAkB,WAAW,MAAM;AACrC,sBAAkB,UAAU,IAAI,eAAe,MAAM;AAAA,EACvD;AAEA,QAAM,iBAAiB,kBAAkB;AAEzC,YAAU,MAAM;AACd,mBAAe,UAAU,MAAM;AAAA,EACjC,GAAG,CAAC,QAAQ,cAAc,CAAC;AAG3B,YAAU,MAAM;AACd,WAAO,MAAM;AACX,qBAAe,MAAM;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,cAAc,CAAC;AACnB,gBAAc,MAAM;AACpB,SAAO,eAAe,iBAAiB;AACzC;",
|
|
6
|
+
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tamagui/react-native-use-pressable",
|
|
3
|
-
"version": "1.14.
|
|
3
|
+
"version": "1.14.2",
|
|
4
4
|
"types": "./types/index.d.ts",
|
|
5
5
|
"main": "dist/cjs",
|
|
6
6
|
"module": "dist/esm",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"react": "*"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@tamagui/build": "1.14.
|
|
32
|
+
"@tamagui/build": "1.14.2",
|
|
33
33
|
"@types/react": "^18.0.15",
|
|
34
34
|
"react": "^18.2.0"
|
|
35
35
|
},
|