react-native-external-keyboard 0.6.7 → 0.6.8-rc1

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/README.md CHANGED
@@ -97,7 +97,7 @@ Linking is one of the best ways to set up focus order. However, there may be cas
97
97
  </View>
98
98
  </KeyboardOrderFocusGroup>
99
99
  ```
100
- Indexing requres `orderGroup` param for proper order set, you can use `KeyboardOrderFocusGroup` or provide `orderGroup` to the component.
100
+ Indexing requires `orderGroup` param for proper order set, you can use `KeyboardOrderFocusGroup` or provide `orderGroup` to the component.
101
101
 
102
102
  ```tsx
103
103
  <Pressable
@@ -324,7 +324,7 @@ containerStyle | Style for the container | StyleProp<ViewStyle>
324
324
  containerFocusStyle?: | Style applied to the container when focused | `FocusStyle`
325
325
  tintType?: | Tint behavior type | `'default' \\| 'hover' \\| 'background' \\| 'none'`
326
326
  FocusHoverComponent?: | Component displayed on focus | `\\| ReactElement  \\| FunctionComponent  \\| (() => ReactElement);`
327
- onSubmitEditing?: | Extended `onSubmitEditing` for mulitline input | `(e: NativeSyntheticEvent<TextInputSubmitEditingEventData>) => void)`
327
+ onSubmitEditing?: | Extended `onSubmitEditing` for multiline input | `(e: NativeSyntheticEvent<TextInputSubmitEditingEventData>) => void)`
328
328
  ...rest | Remaining TextInput props  | `TextInputProps`
329
329
 
330
330
 
@@ -336,7 +336,7 @@ import { KeyboardExtendedBaseView } from 'react-native-external-keyboard';
336
336
  <KeyboardExtendedBaseView
337
337
  onKeyDownPress={...}
338
338
  onKeyUpPress={...}
339
- focussable
339
+ focusable
340
340
  >
341
341
  <Text>Content</Text>
342
342
  </KeyboardExtendedBaseView>
@@ -13,46 +13,83 @@
13
13
  #import "RNCEKVFocusEffectUtility.h"
14
14
 
15
15
  @implementation RNCEKVFocusDelegate{
16
- UIView<RNCEKVFocusProtocol>* _delegate;
16
+ UIView<RNCEKVFocusProtocol>* _delegate;
17
17
  }
18
18
 
19
19
  - (instancetype _Nonnull )initWithView:(UIView<RNCEKVFocusProtocol> *_Nonnull)delegate{
20
- self = [super init];
21
- if (self) {
22
- _delegate = delegate;
20
+ self = [super init];
21
+ if (self) {
22
+ _delegate = delegate;
23
+ }
24
+ return self;
25
+ }
26
+
27
+ - (UIView*)getFirstFocusable:(UIView*)view {
28
+ if(view.subviews.count == 0) return nil;
29
+ UIView* child = view.subviews[0];
30
+ if(child.canBecomeFocused) {
31
+ return child;
32
+ } else {
33
+ return [self getFirstFocusable: child];
34
+ }
35
+ }
36
+
37
+
38
+ - (UIView *)focusingViewForGestureHandler {
39
+ UIView *view = _delegate.subviews.firstObject;
40
+ // Handle the special case for RNGestureHandlerButtonComponentView
41
+ if (view && [NSStringFromClass([view class]) isEqualToString:@"RNGestureHandlerButtonComponentView"] &&
42
+ view.subviews.count > 0) {
43
+ return view.subviews.firstObject;
44
+ }
45
+ return nil;
46
+ }
47
+
48
+ - (UIView *)firstObject {
49
+ UIView *firstChild = _delegate.subviews.firstObject;
50
+ if (firstChild && firstChild.canBecomeFocused) {
51
+ return firstChild;
23
52
  }
24
- return self;
53
+ return nil;
25
54
  }
26
55
 
56
+
57
+
27
58
  // ToDo RNCEKV-2, Double check condition, count more then 1 means that a view can be a ViewGroup, bun when we use hover component it can be considered as ViewGroup instead of touchable component, it can be improved by flag, or by removing hover component from js implementation
28
- - (UIView*)getFocusingView {
29
- if(_delegate.isGroup) {
59
+ - (UIView *)getFocusingView {
60
+ if (_delegate.isGroup) {
30
61
  return _delegate;
31
62
  }
32
63
 
33
- if(_delegate.subviews.count > 0 && _delegate.subviews[0].canBecomeFocused) {
34
- return _delegate.subviews[0];
64
+ UIView *gestureHandlerView = [self focusingViewForGestureHandler];
65
+ if (gestureHandlerView) {
66
+ return gestureHandlerView;
67
+ }
68
+
69
+ UIView *firstObject = [self firstObject];
70
+ if (firstObject) {
71
+ return firstObject;
35
72
  }
36
73
 
37
74
  return _delegate;
38
75
  }
39
76
 
40
77
  - (BOOL)canBecomeFocused {
41
- if(!_delegate.canBeFocused) {
42
- return false;
43
- }
44
- return [self getFocusingView] == _delegate;
78
+ if(!_delegate.canBeFocused) {
79
+ return false;
80
+ }
81
+ return [self getFocusingView] == _delegate;
45
82
  }
46
83
 
47
84
  - (NSNumber*)isFocusChanged:(UIFocusUpdateContext *)context {
48
- UIView* view = [self getFocusingView];
49
- if(context.nextFocusedView == view) {
50
- return @YES;
51
- } else if (context.previouslyFocusedView == view) {
52
- return @NO;
53
- }
54
-
55
- return nil;
85
+ UIView* view = [self getFocusingView];
86
+ if(context.nextFocusedView == view) {
87
+ return @YES;
88
+ } else if (context.previouslyFocusedView == view) {
89
+ return @NO;
90
+ }
91
+
92
+ return nil;
56
93
  }
57
94
 
58
95
 
@@ -10,13 +10,23 @@
10
10
 
11
11
  #import "RCTEnhancedScrollView.h"
12
12
  #import "RNCEKVSwizzleInstanceMethod.h"
13
+ #import "RCTScrollViewComponentView.h"
13
14
 
14
15
  @implementation RCTEnhancedScrollView (RNCEKVExternalKeyboard)
15
16
 
16
17
  - (NSArray<id<UIFocusEnvironment>> *)preferredFocusEnvironments {
17
- if(self.subviews.count) {
18
- return @[self.subviews[0]];
18
+ @try {
19
+ BOOL isScrollViewComponent = self.superview &&
20
+ [self.superview isKindOfClass:[RCTScrollViewComponentView class]];
21
+
22
+ if (isScrollViewComponent) {
23
+ RCTScrollViewComponentView *scrollViewComponent = (RCTScrollViewComponentView *)self.superview;
24
+ return @[scrollViewComponent.containerView];
25
+ }
19
26
  }
27
+ @catch (NSException *exception) {
28
+ }
29
+
20
30
  return [super preferredFocusEnvironments];
21
31
  }
22
32
 
@@ -9,7 +9,15 @@ const ANDROID_SPACE_KEY_CODE = exports.ANDROID_SPACE_KEY_CODE = 62;
9
9
  const ANDROID_DPAD_CENTER_CODE = exports.ANDROID_DPAD_CENTER_CODE = 23;
10
10
  const ANDROID_ENTER_CODE = exports.ANDROID_ENTER_CODE = 66;
11
11
  const ANDROID_TRIGGER_CODES = exports.ANDROID_TRIGGER_CODES = [ANDROID_SPACE_KEY_CODE, ANDROID_DPAD_CENTER_CODE, ANDROID_ENTER_CODE];
12
- const MILLISECOND_THRESHOLD = 20;
12
+ const useDebouncedCallback = (callback, delay) => {
13
+ const timeoutRef = (0, _react.useRef)();
14
+ return (0, _react.useCallback)((...args) => {
15
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
16
+ timeoutRef.current = setTimeout(() => {
17
+ callback(...args);
18
+ }, delay);
19
+ }, [callback, delay]);
20
+ };
13
21
  const useKeyboardPress = ({
14
22
  onKeyUpPress,
15
23
  onKeyDownPress,
@@ -19,7 +27,15 @@ const useKeyboardPress = ({
19
27
  onLongPress,
20
28
  triggerCodes = ANDROID_TRIGGER_CODES
21
29
  }) => {
22
- const thresholdTime = (0, _react.useRef)(0);
30
+ const isLongPressRef = (0, _react.useRef)(false);
31
+ const debouncedOnPress = useDebouncedCallback(event => {
32
+ if (isLongPressRef.current) {
33
+ onLongPress === null || onLongPress === void 0 || onLongPress();
34
+ } else {
35
+ onPress === null || onPress === void 0 || onPress(event);
36
+ }
37
+ isLongPressRef.current = false;
38
+ }, 40);
23
39
  const onKeyUpPressHandler = (0, _react.useCallback)(e => {
24
40
  const {
25
41
  nativeEvent: {
@@ -31,11 +47,11 @@ const useKeyboardPress = ({
31
47
  onKeyUpPress === null || onKeyUpPress === void 0 || onKeyUpPress(e);
32
48
  if (triggerCodes.includes(keyCode)) {
33
49
  if (isLongPress) {
34
- thresholdTime.current = e === null || e === void 0 ? void 0 : e.timeStamp;
35
- onLongPress === null || onLongPress === void 0 || onLongPress({});
50
+ isLongPressRef.current = true;
51
+ debouncedOnPress();
36
52
  }
37
53
  }
38
- }, [onPressOut, onKeyUpPress, triggerCodes, onLongPress]);
54
+ }, [onPressOut, onKeyUpPress, triggerCodes, debouncedOnPress]);
39
55
  const onKeyDownPressHandler = (0, _react.useMemo)(() => {
40
56
  if (!onPressIn) return onKeyDownPress;
41
57
  return e => {
@@ -46,16 +62,13 @@ const useKeyboardPress = ({
46
62
  };
47
63
  }, [onKeyDownPress, onPressIn, triggerCodes]);
48
64
  const onPressHandler = (0, _react.useCallback)(event => {
49
- const pressThreshold = ((event === null || event === void 0 ? void 0 : event.timeStamp) ?? 0) - thresholdTime.current;
50
- if (pressThreshold > MILLISECOND_THRESHOLD) {
51
- onPress === null || onPress === void 0 || onPress(event);
52
- }
53
- }, [onPress]);
65
+ debouncedOnPress(event);
66
+ }, [debouncedOnPress]);
54
67
  const hasHandler = onPressOut || onKeyUpPress || onLongPress || onPress;
55
68
  return {
56
- onKeyUpPressHandler: hasHandler && onKeyUpPressHandler,
69
+ onKeyUpPressHandler: hasHandler ? onKeyUpPressHandler : undefined,
57
70
  onKeyDownPressHandler,
58
- onPressHandler: onPress && onPressHandler
71
+ onPressHandler: onPress ? onPressHandler : undefined
59
72
  };
60
73
  };
61
74
  exports.useKeyboardPress = useKeyboardPress;
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","ANDROID_SPACE_KEY_CODE","exports","ANDROID_DPAD_CENTER_CODE","ANDROID_ENTER_CODE","ANDROID_TRIGGER_CODES","MILLISECOND_THRESHOLD","useKeyboardPress","onKeyUpPress","onKeyDownPress","onPressIn","onPressOut","onPress","onLongPress","triggerCodes","thresholdTime","useRef","onKeyUpPressHandler","useCallback","e","nativeEvent","keyCode","isLongPress","includes","current","timeStamp","onKeyDownPressHandler","useMemo","onPressHandler","event","pressThreshold","hasHandler"],"sourceRoot":"../../../../src","sources":["utils/useKeyboardPress/useKeyboardPress.android.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAKO,MAAMC,sBAAsB,GAAAC,OAAA,CAAAD,sBAAA,GAAG,EAAE;AACjC,MAAME,wBAAwB,GAAAD,OAAA,CAAAC,wBAAA,GAAG,EAAE;AACnC,MAAMC,kBAAkB,GAAAF,OAAA,CAAAE,kBAAA,GAAG,EAAE;AAE7B,MAAMC,qBAAqB,GAAAH,OAAA,CAAAG,qBAAA,GAAG,CACnCJ,sBAAsB,EACtBE,wBAAwB,EACxBC,kBAAkB,CACnB;AAED,MAAME,qBAAqB,GAAG,EAAE;AAEzB,MAAMC,gBAAgB,GAAGA,CAG9B;EACAC,YAAY;EACZC,cAAc;EACdC,SAAS;EACTC,UAAU;EACVC,OAAO;EACPC,WAAW;EACXC,YAAY,GAAGT;AACY,CAAC,KAAK;EACjC,MAAMU,aAAa,GAAG,IAAAC,aAAM,EAAC,CAAC,CAAC;EAC/B,MAAMC,mBAAmB,GAAG,IAAAC,kBAAW,EACpCC,CAAC,IAAK;IACL,MAAM;MACJC,WAAW,EAAE;QAAEC,OAAO;QAAEC;MAAY;IACtC,CAAC,GAAGH,CAAC;IAELR,UAAU,aAAVA,UAAU,eAAVA,UAAU,CAAGQ,CAAqC,CAAC;IACnDX,YAAY,aAAZA,YAAY,eAAZA,YAAY,CAAGW,CAAC,CAAC;IAEjB,IAAIL,YAAY,CAACS,QAAQ,CAACF,OAAO,CAAC,EAAE;MAClC,IAAIC,WAAW,EAAE;QACfP,aAAa,CAACS,OAAO,GAAGL,CAAC,aAADA,CAAC,uBAADA,CAAC,CAAEM,SAAS;QACpCZ,WAAW,aAAXA,WAAW,eAAXA,WAAW,CAAG,CAAC,CAA0B,CAAC;MAC5C;IACF;EACF,CAAC,EACD,CAACF,UAAU,EAAEH,YAAY,EAAEM,YAAY,EAAED,WAAW,CACtD,CAAC;EAED,MAAMa,qBAAqB,GAAG,IAAAC,cAAO,EAAC,MAAM;IAC1C,IAAI,CAACjB,SAAS,EAAE,OAAOD,cAAc;IACrC,OAAQU,CAAa,IAAK;MACxBV,cAAc,aAAdA,cAAc,eAAdA,cAAc,CAAGU,CAAC,CAAC;MACnB,IAAIL,YAAY,CAACS,QAAQ,CAACJ,CAAC,CAACC,WAAW,CAACC,OAAO,CAAC,EAAE;QAChDX,SAAS,aAATA,SAAS,eAATA,SAAS,CAAGS,CAAqC,CAAC;MACpD;IACF,CAAC;EACH,CAAC,EAAE,CAACV,cAAc,EAAEC,SAAS,EAAEI,YAAY,CAAC,CAAC;EAE7C,MAAMc,cAAc,GAAG,IAAAV,kBAAW,EAC/BW,KAA4B,IAAK;IAChC,MAAMC,cAAc,GAAG,CAAC,CAAAD,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEJ,SAAS,KAAI,CAAC,IAAIV,aAAa,CAACS,OAAO;IACtE,IAAIM,cAAc,GAAGxB,qBAAqB,EAAE;MAC1CM,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAGiB,KAAK,CAAC;IAClB;EACF,CAAC,EACD,CAACjB,OAAO,CACV,CAAC;EAED,MAAMmB,UAAU,GAAGpB,UAAU,IAAIH,YAAY,IAAIK,WAAW,IAAID,OAAO;EACvE,OAAO;IACLK,mBAAmB,EAAEc,UAAU,IAAId,mBAAmB;IACtDS,qBAAqB;IACrBE,cAAc,EAAEhB,OAAO,IAAIgB;EAC7B,CAAC;AACH,CAAC;AAAC1B,OAAA,CAAAK,gBAAA,GAAAA,gBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","ANDROID_SPACE_KEY_CODE","exports","ANDROID_DPAD_CENTER_CODE","ANDROID_ENTER_CODE","ANDROID_TRIGGER_CODES","useDebouncedCallback","callback","delay","timeoutRef","useRef","useCallback","args","current","clearTimeout","setTimeout","useKeyboardPress","onKeyUpPress","onKeyDownPress","onPressIn","onPressOut","onPress","onLongPress","triggerCodes","isLongPressRef","debouncedOnPress","event","onKeyUpPressHandler","e","nativeEvent","keyCode","isLongPress","includes","onKeyDownPressHandler","useMemo","onPressHandler","hasHandler","undefined"],"sourceRoot":"../../../../src","sources":["utils/useKeyboardPress/useKeyboardPress.android.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAKO,MAAMC,sBAAsB,GAAAC,OAAA,CAAAD,sBAAA,GAAG,EAAE;AACjC,MAAME,wBAAwB,GAAAD,OAAA,CAAAC,wBAAA,GAAG,EAAE;AACnC,MAAMC,kBAAkB,GAAAF,OAAA,CAAAE,kBAAA,GAAG,EAAE;AAE7B,MAAMC,qBAAqB,GAAAH,OAAA,CAAAG,qBAAA,GAAG,CACnCJ,sBAAsB,EACtBE,wBAAwB,EACxBC,kBAAkB,CACnB;AAED,MAAME,oBAAoB,GAAGA,CAC3BC,QAAW,EACXC,KAAa,KACV;EACH,MAAMC,UAAU,GAAG,IAAAC,aAAM,EAAgC,CAAC;EAC1D,OAAO,IAAAC,kBAAW,EAChB,CAAC,GAAGC,IAAmB,KAAK;IAC1B,IAAIH,UAAU,CAACI,OAAO,EAAEC,YAAY,CAACL,UAAU,CAACI,OAAO,CAAC;IACxDJ,UAAU,CAACI,OAAO,GAAGE,UAAU,CAAC,MAAM;MACpCR,QAAQ,CAAC,GAAGK,IAAI,CAAC;IACnB,CAAC,EAAEJ,KAAK,CAAC;EACX,CAAC,EACD,CAACD,QAAQ,EAAEC,KAAK,CAClB,CAAC;AACH,CAAC;AAEM,MAAMQ,gBAAgB,GAAGA,CAG9B;EACAC,YAAY;EACZC,cAAc;EACdC,SAAS;EACTC,UAAU;EACVC,OAAO;EACPC,WAAW;EACXC,YAAY,GAAGlB;AACY,CAAC,KAAK;EACjC,MAAMmB,cAAc,GAAG,IAAAd,aAAM,EAAC,KAAK,CAAC;EAEpC,MAAMe,gBAAgB,GAAGnB,oBAAoB,CAC1CoB,KAA6B,IAAK;IACjC,IAAIF,cAAc,CAACX,OAAO,EAAE;MAC1BS,WAAW,aAAXA,WAAW,eAAXA,WAAW,CAAG,CAAC;IACjB,CAAC,MAAM;MACLD,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAGK,KAAK,CAAC;IAClB;IACAF,cAAc,CAACX,OAAO,GAAG,KAAK;EAChC,CAAC,EACD,EACF,CAAC;EAED,MAAMc,mBAAmB,GAAG,IAAAhB,kBAAW,EACpCiB,CAAC,IAAK;IACL,MAAM;MACJC,WAAW,EAAE;QAAEC,OAAO;QAAEC;MAAY;IACtC,CAAC,GAAGH,CAAC;IAELR,UAAU,aAAVA,UAAU,eAAVA,UAAU,CAAGQ,CAAqC,CAAC;IACnDX,YAAY,aAAZA,YAAY,eAAZA,YAAY,CAAGW,CAAC,CAAC;IAEjB,IAAIL,YAAY,CAACS,QAAQ,CAACF,OAAO,CAAC,EAAE;MAClC,IAAIC,WAAW,EAAE;QACfP,cAAc,CAACX,OAAO,GAAG,IAAI;QAC7BY,gBAAgB,CAAC,CAAC;MACpB;IACF;EACF,CAAC,EACD,CAACL,UAAU,EAAEH,YAAY,EAAEM,YAAY,EAAEE,gBAAgB,CAC3D,CAAC;EAED,MAAMQ,qBAAqB,GAAG,IAAAC,cAAO,EAAC,MAAM;IAC1C,IAAI,CAACf,SAAS,EAAE,OAAOD,cAAc;IACrC,OAAQU,CAAa,IAAK;MACxBV,cAAc,aAAdA,cAAc,eAAdA,cAAc,CAAGU,CAAC,CAAC;MACnB,IAAIL,YAAY,CAACS,QAAQ,CAACJ,CAAC,CAACC,WAAW,CAACC,OAAO,CAAC,EAAE;QAChDX,SAAS,aAATA,SAAS,eAATA,SAAS,CAAGS,CAAqC,CAAC;MACpD;IACF,CAAC;EACH,CAAC,EAAE,CAACV,cAAc,EAAEC,SAAS,EAAEI,YAAY,CAAC,CAAC;EAE7C,MAAMY,cAAc,GAAG,IAAAxB,kBAAW,EAC/Be,KAA4B,IAAK;IAChCD,gBAAgB,CAACC,KAAK,CAAC;EACzB,CAAC,EACD,CAACD,gBAAgB,CACnB,CAAC;EAED,MAAMW,UAAU,GAAGhB,UAAU,IAAIH,YAAY,IAAIK,WAAW,IAAID,OAAO;EACvE,OAAO;IACLM,mBAAmB,EAAES,UAAU,GAAGT,mBAAmB,GAAGU,SAAS;IACjEJ,qBAAqB;IACrBE,cAAc,EAAEd,OAAO,GAAGc,cAAc,GAAGE;EAC7C,CAAC;AACH,CAAC;AAACnC,OAAA,CAAAc,gBAAA,GAAAA,gBAAA","ignoreList":[]}
@@ -3,7 +3,15 @@ export const ANDROID_SPACE_KEY_CODE = 62;
3
3
  export const ANDROID_DPAD_CENTER_CODE = 23;
4
4
  export const ANDROID_ENTER_CODE = 66;
5
5
  export const ANDROID_TRIGGER_CODES = [ANDROID_SPACE_KEY_CODE, ANDROID_DPAD_CENTER_CODE, ANDROID_ENTER_CODE];
6
- const MILLISECOND_THRESHOLD = 20;
6
+ const useDebouncedCallback = (callback, delay) => {
7
+ const timeoutRef = useRef();
8
+ return useCallback((...args) => {
9
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
10
+ timeoutRef.current = setTimeout(() => {
11
+ callback(...args);
12
+ }, delay);
13
+ }, [callback, delay]);
14
+ };
7
15
  export const useKeyboardPress = ({
8
16
  onKeyUpPress,
9
17
  onKeyDownPress,
@@ -13,7 +21,15 @@ export const useKeyboardPress = ({
13
21
  onLongPress,
14
22
  triggerCodes = ANDROID_TRIGGER_CODES
15
23
  }) => {
16
- const thresholdTime = useRef(0);
24
+ const isLongPressRef = useRef(false);
25
+ const debouncedOnPress = useDebouncedCallback(event => {
26
+ if (isLongPressRef.current) {
27
+ onLongPress === null || onLongPress === void 0 || onLongPress();
28
+ } else {
29
+ onPress === null || onPress === void 0 || onPress(event);
30
+ }
31
+ isLongPressRef.current = false;
32
+ }, 40);
17
33
  const onKeyUpPressHandler = useCallback(e => {
18
34
  const {
19
35
  nativeEvent: {
@@ -25,11 +41,11 @@ export const useKeyboardPress = ({
25
41
  onKeyUpPress === null || onKeyUpPress === void 0 || onKeyUpPress(e);
26
42
  if (triggerCodes.includes(keyCode)) {
27
43
  if (isLongPress) {
28
- thresholdTime.current = e === null || e === void 0 ? void 0 : e.timeStamp;
29
- onLongPress === null || onLongPress === void 0 || onLongPress({});
44
+ isLongPressRef.current = true;
45
+ debouncedOnPress();
30
46
  }
31
47
  }
32
- }, [onPressOut, onKeyUpPress, triggerCodes, onLongPress]);
48
+ }, [onPressOut, onKeyUpPress, triggerCodes, debouncedOnPress]);
33
49
  const onKeyDownPressHandler = useMemo(() => {
34
50
  if (!onPressIn) return onKeyDownPress;
35
51
  return e => {
@@ -40,16 +56,13 @@ export const useKeyboardPress = ({
40
56
  };
41
57
  }, [onKeyDownPress, onPressIn, triggerCodes]);
42
58
  const onPressHandler = useCallback(event => {
43
- const pressThreshold = ((event === null || event === void 0 ? void 0 : event.timeStamp) ?? 0) - thresholdTime.current;
44
- if (pressThreshold > MILLISECOND_THRESHOLD) {
45
- onPress === null || onPress === void 0 || onPress(event);
46
- }
47
- }, [onPress]);
59
+ debouncedOnPress(event);
60
+ }, [debouncedOnPress]);
48
61
  const hasHandler = onPressOut || onKeyUpPress || onLongPress || onPress;
49
62
  return {
50
- onKeyUpPressHandler: hasHandler && onKeyUpPressHandler,
63
+ onKeyUpPressHandler: hasHandler ? onKeyUpPressHandler : undefined,
51
64
  onKeyDownPressHandler,
52
- onPressHandler: onPress && onPressHandler
65
+ onPressHandler: onPress ? onPressHandler : undefined
53
66
  };
54
67
  };
55
68
  //# sourceMappingURL=useKeyboardPress.android.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useMemo","useRef","ANDROID_SPACE_KEY_CODE","ANDROID_DPAD_CENTER_CODE","ANDROID_ENTER_CODE","ANDROID_TRIGGER_CODES","MILLISECOND_THRESHOLD","useKeyboardPress","onKeyUpPress","onKeyDownPress","onPressIn","onPressOut","onPress","onLongPress","triggerCodes","thresholdTime","onKeyUpPressHandler","e","nativeEvent","keyCode","isLongPress","includes","current","timeStamp","onKeyDownPressHandler","onPressHandler","event","pressThreshold","hasHandler"],"sourceRoot":"../../../../src","sources":["utils/useKeyboardPress/useKeyboardPress.android.ts"],"mappings":"AAAA,SAASA,WAAW,EAAEC,OAAO,EAAEC,MAAM,QAAQ,OAAO;AAKpD,OAAO,MAAMC,sBAAsB,GAAG,EAAE;AACxC,OAAO,MAAMC,wBAAwB,GAAG,EAAE;AAC1C,OAAO,MAAMC,kBAAkB,GAAG,EAAE;AAEpC,OAAO,MAAMC,qBAAqB,GAAG,CACnCH,sBAAsB,EACtBC,wBAAwB,EACxBC,kBAAkB,CACnB;AAED,MAAME,qBAAqB,GAAG,EAAE;AAEhC,OAAO,MAAMC,gBAAgB,GAAGA,CAG9B;EACAC,YAAY;EACZC,cAAc;EACdC,SAAS;EACTC,UAAU;EACVC,OAAO;EACPC,WAAW;EACXC,YAAY,GAAGT;AACY,CAAC,KAAK;EACjC,MAAMU,aAAa,GAAGd,MAAM,CAAC,CAAC,CAAC;EAC/B,MAAMe,mBAAmB,GAAGjB,WAAW,CACpCkB,CAAC,IAAK;IACL,MAAM;MACJC,WAAW,EAAE;QAAEC,OAAO;QAAEC;MAAY;IACtC,CAAC,GAAGH,CAAC;IAELN,UAAU,aAAVA,UAAU,eAAVA,UAAU,CAAGM,CAAqC,CAAC;IACnDT,YAAY,aAAZA,YAAY,eAAZA,YAAY,CAAGS,CAAC,CAAC;IAEjB,IAAIH,YAAY,CAACO,QAAQ,CAACF,OAAO,CAAC,EAAE;MAClC,IAAIC,WAAW,EAAE;QACfL,aAAa,CAACO,OAAO,GAAGL,CAAC,aAADA,CAAC,uBAADA,CAAC,CAAEM,SAAS;QACpCV,WAAW,aAAXA,WAAW,eAAXA,WAAW,CAAG,CAAC,CAA0B,CAAC;MAC5C;IACF;EACF,CAAC,EACD,CAACF,UAAU,EAAEH,YAAY,EAAEM,YAAY,EAAED,WAAW,CACtD,CAAC;EAED,MAAMW,qBAAqB,GAAGxB,OAAO,CAAC,MAAM;IAC1C,IAAI,CAACU,SAAS,EAAE,OAAOD,cAAc;IACrC,OAAQQ,CAAa,IAAK;MACxBR,cAAc,aAAdA,cAAc,eAAdA,cAAc,CAAGQ,CAAC,CAAC;MACnB,IAAIH,YAAY,CAACO,QAAQ,CAACJ,CAAC,CAACC,WAAW,CAACC,OAAO,CAAC,EAAE;QAChDT,SAAS,aAATA,SAAS,eAATA,SAAS,CAAGO,CAAqC,CAAC;MACpD;IACF,CAAC;EACH,CAAC,EAAE,CAACR,cAAc,EAAEC,SAAS,EAAEI,YAAY,CAAC,CAAC;EAE7C,MAAMW,cAAc,GAAG1B,WAAW,CAC/B2B,KAA4B,IAAK;IAChC,MAAMC,cAAc,GAAG,CAAC,CAAAD,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEH,SAAS,KAAI,CAAC,IAAIR,aAAa,CAACO,OAAO;IACtE,IAAIK,cAAc,GAAGrB,qBAAqB,EAAE;MAC1CM,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAGc,KAAK,CAAC;IAClB;EACF,CAAC,EACD,CAACd,OAAO,CACV,CAAC;EAED,MAAMgB,UAAU,GAAGjB,UAAU,IAAIH,YAAY,IAAIK,WAAW,IAAID,OAAO;EACvE,OAAO;IACLI,mBAAmB,EAAEY,UAAU,IAAIZ,mBAAmB;IACtDQ,qBAAqB;IACrBC,cAAc,EAAEb,OAAO,IAAIa;EAC7B,CAAC;AACH,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useMemo","useRef","ANDROID_SPACE_KEY_CODE","ANDROID_DPAD_CENTER_CODE","ANDROID_ENTER_CODE","ANDROID_TRIGGER_CODES","useDebouncedCallback","callback","delay","timeoutRef","args","current","clearTimeout","setTimeout","useKeyboardPress","onKeyUpPress","onKeyDownPress","onPressIn","onPressOut","onPress","onLongPress","triggerCodes","isLongPressRef","debouncedOnPress","event","onKeyUpPressHandler","e","nativeEvent","keyCode","isLongPress","includes","onKeyDownPressHandler","onPressHandler","hasHandler","undefined"],"sourceRoot":"../../../../src","sources":["utils/useKeyboardPress/useKeyboardPress.android.ts"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"useKeyboardPress.android.d.ts","sourceRoot":"","sources":["../../../../../src/utils/useKeyboardPress/useKeyboardPress.android.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE7E,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,eAAO,MAAM,qBAAqB,UAIjC,CAAC;AAIF,eAAO,MAAM,gBAAgB,GAC3B,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,IAAI,EAC/B,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,IAAI,EAC/B,8FAQC,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC;;;6BAgClB,qBAAqB;CAehC,CAAC"}
1
+ {"version":3,"file":"useKeyboardPress.android.d.ts","sourceRoot":"","sources":["../../../../../src/utils/useKeyboardPress/useKeyboardPress.android.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE7E,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,eAAO,MAAM,qBAAqB,UAIjC,CAAC;AAkBF,eAAO,MAAM,gBAAgB,GAC3B,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,IAAI,EAC/B,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,IAAI,EAC/B,8FAQC,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC;;;6BA6ClB,qBAAqB;CAYhC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-external-keyboard",
3
- "version": "0.6.7",
3
+ "version": "0.6.8-rc1",
4
4
  "description": "Toolkit for improving physical keyboard support in React Native",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -62,7 +62,7 @@
62
62
  "@evilmartians/lefthook": "^1.5.0",
63
63
  "@react-native-community/cli": "15.0.1",
64
64
  "@react-native/eslint-config": "^0.73.1",
65
- "@release-it/conventional-changelog": "^9.0.2",
65
+ "@release-it/conventional-changelog": "^10.0.1",
66
66
  "@types/jest": "^29.5.5",
67
67
  "@types/react": "^18.2.44",
68
68
  "commitlint": "^17.0.2",
@@ -75,7 +75,7 @@
75
75
  "react": "18.3.1",
76
76
  "react-native": "0.76.5",
77
77
  "react-native-builder-bob": "^0.20.4",
78
- "release-it": "^17.10.0",
78
+ "release-it": "^19.0.5",
79
79
  "turbo": "^1.10.7",
80
80
  "typescript": "^5.2.2"
81
81
  },
@@ -13,7 +13,21 @@ export const ANDROID_TRIGGER_CODES = [
13
13
  ANDROID_ENTER_CODE,
14
14
  ];
15
15
 
16
- const MILLISECOND_THRESHOLD = 20;
16
+ const useDebouncedCallback = <T extends (...args: any[]) => void>(
17
+ callback: T,
18
+ delay: number
19
+ ) => {
20
+ const timeoutRef = useRef<ReturnType<typeof setTimeout>>();
21
+ return useCallback(
22
+ (...args: Parameters<T>) => {
23
+ if (timeoutRef.current) clearTimeout(timeoutRef.current);
24
+ timeoutRef.current = setTimeout(() => {
25
+ callback(...args);
26
+ }, delay);
27
+ },
28
+ [callback, delay]
29
+ );
30
+ };
17
31
 
18
32
  export const useKeyboardPress = <
19
33
  T extends (event?: any) => void,
@@ -27,7 +41,20 @@ export const useKeyboardPress = <
27
41
  onLongPress,
28
42
  triggerCodes = ANDROID_TRIGGER_CODES,
29
43
  }: UseKeyboardPressProps<T, K>) => {
30
- const thresholdTime = useRef(0);
44
+ const isLongPressRef = useRef(false);
45
+
46
+ const debouncedOnPress = useDebouncedCallback(
47
+ (event?: GestureResponderEvent) => {
48
+ if (isLongPressRef.current) {
49
+ onLongPress?.();
50
+ } else {
51
+ onPress?.(event);
52
+ }
53
+ isLongPressRef.current = false;
54
+ },
55
+ 40
56
+ );
57
+
31
58
  const onKeyUpPressHandler = useCallback<OnKeyPressFn>(
32
59
  (e) => {
33
60
  const {
@@ -39,12 +66,12 @@ export const useKeyboardPress = <
39
66
 
40
67
  if (triggerCodes.includes(keyCode)) {
41
68
  if (isLongPress) {
42
- thresholdTime.current = e?.timeStamp;
43
- onLongPress?.({} as GestureResponderEvent);
69
+ isLongPressRef.current = true;
70
+ debouncedOnPress();
44
71
  }
45
72
  }
46
73
  },
47
- [onPressOut, onKeyUpPress, triggerCodes, onLongPress]
74
+ [onPressOut, onKeyUpPress, triggerCodes, debouncedOnPress]
48
75
  );
49
76
 
50
77
  const onKeyDownPressHandler = useMemo(() => {
@@ -59,18 +86,15 @@ export const useKeyboardPress = <
59
86
 
60
87
  const onPressHandler = useCallback(
61
88
  (event: GestureResponderEvent) => {
62
- const pressThreshold = (event?.timeStamp ?? 0) - thresholdTime.current;
63
- if (pressThreshold > MILLISECOND_THRESHOLD) {
64
- onPress?.(event);
65
- }
89
+ debouncedOnPress(event);
66
90
  },
67
- [onPress]
91
+ [debouncedOnPress]
68
92
  );
69
93
 
70
94
  const hasHandler = onPressOut || onKeyUpPress || onLongPress || onPress;
71
95
  return {
72
- onKeyUpPressHandler: hasHandler && onKeyUpPressHandler,
96
+ onKeyUpPressHandler: hasHandler ? onKeyUpPressHandler : undefined,
73
97
  onKeyDownPressHandler,
74
- onPressHandler: onPress && onPressHandler,
98
+ onPressHandler: onPress ? onPressHandler : undefined,
75
99
  };
76
100
  };