react-native-external-keyboard 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +113 -0
  3. package/android/Android.mk +45 -0
  4. package/android/build.gradle +139 -0
  5. package/android/gradle.properties +5 -0
  6. package/android/registration.cpp +18 -0
  7. package/android/src/main/AndroidManifest.xml +4 -0
  8. package/android/src/main/java/com/externalkeyboard/A11yKeyboardModule.java +46 -0
  9. package/android/src/main/java/com/externalkeyboard/ExternalKeyboardViewPackage.java +63 -0
  10. package/android/src/main/java/com/externalkeyboard/events/FocusChangeEvent.java +39 -0
  11. package/android/src/main/java/com/externalkeyboard/events/KeyPressDownEvent.java +49 -0
  12. package/android/src/main/java/com/externalkeyboard/events/KeyPressUpEvent.java +49 -0
  13. package/android/src/main/java/com/externalkeyboard/services/KeyboardKeyPressHandler.java +56 -0
  14. package/android/src/main/java/com/externalkeyboard/services/KeyboardService.java +52 -0
  15. package/android/src/main/java/com/externalkeyboard/views/ExternalKeyboardView/ExternalKeyboardView.java +28 -0
  16. package/android/src/main/java/com/externalkeyboard/views/ExternalKeyboardView/ExternalKeyboardViewManager.java +101 -0
  17. package/android/src/newarch/A11yKeyboardModuleSpec.java +9 -0
  18. package/android/src/newarch/ExternalKeyboardViewManagerSpec.java +31 -0
  19. package/android/src/oldarch/A11yKeyboardModuleSpec.java +15 -0
  20. package/android/src/oldarch/ExternalKeyboardViewManagerSpec.java +9 -0
  21. package/ios/ExternalKeyboard.xcodeproj/project.pbxproj +384 -0
  22. package/ios/ExternalKeyboard.xcodeproj/project.xcworkspace/contents.xcworkspacedata +4 -0
  23. package/ios/ExternalKeyboard.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  24. package/ios/ExternalKeyboard.xcodeproj/project.xcworkspace/xcuserdata/Artur_Kalach.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  25. package/ios/ExternalKeyboard.xcodeproj/xcuserdata/Artur_Kalach.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +24 -0
  26. package/ios/ExternalKeyboard.xcodeproj/xcuserdata/Artur_Kalach.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
  27. package/ios/ExternalKeyboardView/ExternalKeyboardView.h +41 -0
  28. package/ios/ExternalKeyboardView/ExternalKeyboardView.mm +186 -0
  29. package/ios/Helpers/FocusWrapper/FocusWrapper.h +32 -0
  30. package/ios/Helpers/FocusWrapper/FocusWrapper.mm +63 -0
  31. package/ios/Helpers/KeyboardKeyPressHandler/KeyboardKeyPressHandler.h +27 -0
  32. package/ios/Helpers/KeyboardKeyPressHandler/KeyboardKeyPressHandler.mm +73 -0
  33. package/ios/Modules/A11yKeyboardModule/A11yKeyboardModule.h +20 -0
  34. package/ios/Modules/A11yKeyboardModule/A11yKeyboardModule.mm +86 -0
  35. package/ios/ViewManagers/ExternalKeyboardViewManager/ExternalKeyboardViewManager.h +16 -0
  36. package/ios/ViewManagers/ExternalKeyboardViewManager/ExternalKeyboardViewManager.mm +29 -0
  37. package/lib/commonjs/NativeModules/A11yKeyboardModule/A11yKeyboardModule.js +33 -0
  38. package/lib/commonjs/NativeModules/A11yKeyboardModule/A11yKeyboardModule.js.map +1 -0
  39. package/lib/commonjs/NativeModules/A11yKeyboardModule/index.js +13 -0
  40. package/lib/commonjs/NativeModules/A11yKeyboardModule/index.js.map +1 -0
  41. package/lib/commonjs/NativeModules/index.js +13 -0
  42. package/lib/commonjs/NativeModules/index.js.map +1 -0
  43. package/lib/commonjs/components/KeyboardFocusView/KeyboardFocusView.android.js +41 -0
  44. package/lib/commonjs/components/KeyboardFocusView/KeyboardFocusView.android.js.map +1 -0
  45. package/lib/commonjs/components/KeyboardFocusView/KeyboardFocusView.d.js +6 -0
  46. package/lib/commonjs/components/KeyboardFocusView/KeyboardFocusView.d.js.map +1 -0
  47. package/lib/commonjs/components/KeyboardFocusView/KeyboardFocusView.ios.js +46 -0
  48. package/lib/commonjs/components/KeyboardFocusView/KeyboardFocusView.ios.js.map +1 -0
  49. package/lib/commonjs/components/KeyboardFocusView/hooks/index.js +13 -0
  50. package/lib/commonjs/components/KeyboardFocusView/hooks/index.js.map +1 -0
  51. package/lib/commonjs/components/KeyboardFocusView/hooks/useFocusStyle/index.js +13 -0
  52. package/lib/commonjs/components/KeyboardFocusView/hooks/useFocusStyle/index.js.map +1 -0
  53. package/lib/commonjs/components/KeyboardFocusView/hooks/useFocusStyle/useFocusStyle.js +33 -0
  54. package/lib/commonjs/components/KeyboardFocusView/hooks/useFocusStyle/useFocusStyle.js.map +1 -0
  55. package/lib/commonjs/components/KeyboardFocusView/index.js +13 -0
  56. package/lib/commonjs/components/KeyboardFocusView/index.js.map +1 -0
  57. package/lib/commonjs/components/Pressable/Pressable.android.js +76 -0
  58. package/lib/commonjs/components/Pressable/Pressable.android.js.map +1 -0
  59. package/lib/commonjs/components/Pressable/Pressable.d.js +6 -0
  60. package/lib/commonjs/components/Pressable/Pressable.d.js.map +1 -0
  61. package/lib/commonjs/components/Pressable/Pressable.ios.js +157 -0
  62. package/lib/commonjs/components/Pressable/Pressable.ios.js.map +1 -0
  63. package/lib/commonjs/components/Pressable/index.js +13 -0
  64. package/lib/commonjs/components/Pressable/index.js.map +1 -0
  65. package/lib/commonjs/components/index.js +20 -0
  66. package/lib/commonjs/components/index.js.map +1 -0
  67. package/lib/commonjs/index.js +46 -0
  68. package/lib/commonjs/index.js.map +1 -0
  69. package/lib/commonjs/nativeSpec/ExternalKeyboardViewNativeComponent.js +11 -0
  70. package/lib/commonjs/nativeSpec/ExternalKeyboardViewNativeComponent.js.map +1 -0
  71. package/lib/commonjs/nativeSpec/NativeKeyboardModule.js +10 -0
  72. package/lib/commonjs/nativeSpec/NativeKeyboardModule.js.map +1 -0
  73. package/lib/commonjs/nativeSpec/index.js +21 -0
  74. package/lib/commonjs/nativeSpec/index.js.map +1 -0
  75. package/lib/commonjs/services/A11yModule/A11yModule.android.js +22 -0
  76. package/lib/commonjs/services/A11yModule/A11yModule.android.js.map +1 -0
  77. package/lib/commonjs/services/A11yModule/A11yModule.d.js +6 -0
  78. package/lib/commonjs/services/A11yModule/A11yModule.d.js.map +1 -0
  79. package/lib/commonjs/services/A11yModule/A11yModule.ios.js +28 -0
  80. package/lib/commonjs/services/A11yModule/A11yModule.ios.js.map +1 -0
  81. package/lib/commonjs/services/A11yModule/A11yModule.types.js +6 -0
  82. package/lib/commonjs/services/A11yModule/A11yModule.types.js.map +1 -0
  83. package/lib/commonjs/services/A11yModule/index.js +13 -0
  84. package/lib/commonjs/services/A11yModule/index.js.map +1 -0
  85. package/lib/commonjs/services/index.js +13 -0
  86. package/lib/commonjs/services/index.js.map +1 -0
  87. package/lib/commonjs/types/FocusStyle.js +6 -0
  88. package/lib/commonjs/types/FocusStyle.js.map +1 -0
  89. package/lib/commonjs/types/KeyboardFocusView.types.js +6 -0
  90. package/lib/commonjs/types/KeyboardFocusView.types.js.map +1 -0
  91. package/lib/commonjs/types/index.js +38 -0
  92. package/lib/commonjs/types/index.js.map +1 -0
  93. package/lib/module/NativeModules/A11yKeyboardModule/A11yKeyboardModule.js +26 -0
  94. package/lib/module/NativeModules/A11yKeyboardModule/A11yKeyboardModule.js.map +1 -0
  95. package/lib/module/NativeModules/A11yKeyboardModule/index.js +2 -0
  96. package/lib/module/NativeModules/A11yKeyboardModule/index.js.map +1 -0
  97. package/lib/module/NativeModules/index.js +2 -0
  98. package/lib/module/NativeModules/index.js.map +1 -0
  99. package/lib/module/components/KeyboardFocusView/KeyboardFocusView.android.js +33 -0
  100. package/lib/module/components/KeyboardFocusView/KeyboardFocusView.android.js.map +1 -0
  101. package/lib/module/components/KeyboardFocusView/KeyboardFocusView.d.js +2 -0
  102. package/lib/module/components/KeyboardFocusView/KeyboardFocusView.d.js.map +1 -0
  103. package/lib/module/components/KeyboardFocusView/KeyboardFocusView.ios.js +37 -0
  104. package/lib/module/components/KeyboardFocusView/KeyboardFocusView.ios.js.map +1 -0
  105. package/lib/module/components/KeyboardFocusView/hooks/index.js +2 -0
  106. package/lib/module/components/KeyboardFocusView/hooks/index.js.map +1 -0
  107. package/lib/module/components/KeyboardFocusView/hooks/useFocusStyle/index.js +2 -0
  108. package/lib/module/components/KeyboardFocusView/hooks/useFocusStyle/index.js.map +1 -0
  109. package/lib/module/components/KeyboardFocusView/hooks/useFocusStyle/useFocusStyle.js +26 -0
  110. package/lib/module/components/KeyboardFocusView/hooks/useFocusStyle/useFocusStyle.js.map +1 -0
  111. package/lib/module/components/KeyboardFocusView/index.js +2 -0
  112. package/lib/module/components/KeyboardFocusView/index.js.map +1 -0
  113. package/lib/module/components/Pressable/Pressable.android.js +70 -0
  114. package/lib/module/components/Pressable/Pressable.android.js.map +1 -0
  115. package/lib/module/components/Pressable/Pressable.d.js +2 -0
  116. package/lib/module/components/Pressable/Pressable.d.js.map +1 -0
  117. package/lib/module/components/Pressable/Pressable.ios.js +148 -0
  118. package/lib/module/components/Pressable/Pressable.ios.js.map +1 -0
  119. package/lib/module/components/Pressable/index.js +2 -0
  120. package/lib/module/components/Pressable/index.js.map +1 -0
  121. package/lib/module/components/index.js +3 -0
  122. package/lib/module/components/index.js.map +1 -0
  123. package/lib/module/index.js +5 -0
  124. package/lib/module/index.js.map +1 -0
  125. package/lib/module/nativeSpec/ExternalKeyboardViewNativeComponent.js +3 -0
  126. package/lib/module/nativeSpec/ExternalKeyboardViewNativeComponent.js.map +1 -0
  127. package/lib/module/nativeSpec/NativeKeyboardModule.js +3 -0
  128. package/lib/module/nativeSpec/NativeKeyboardModule.js.map +1 -0
  129. package/lib/module/nativeSpec/index.js +4 -0
  130. package/lib/module/nativeSpec/index.js.map +1 -0
  131. package/lib/module/services/A11yModule/A11yModule.android.js +15 -0
  132. package/lib/module/services/A11yModule/A11yModule.android.js.map +1 -0
  133. package/lib/module/services/A11yModule/A11yModule.d.js +2 -0
  134. package/lib/module/services/A11yModule/A11yModule.d.js.map +1 -0
  135. package/lib/module/services/A11yModule/A11yModule.ios.js +21 -0
  136. package/lib/module/services/A11yModule/A11yModule.ios.js.map +1 -0
  137. package/lib/module/services/A11yModule/A11yModule.types.js +2 -0
  138. package/lib/module/services/A11yModule/A11yModule.types.js.map +1 -0
  139. package/lib/module/services/A11yModule/index.js +2 -0
  140. package/lib/module/services/A11yModule/index.js.map +1 -0
  141. package/lib/module/services/index.js +2 -0
  142. package/lib/module/services/index.js.map +1 -0
  143. package/lib/module/types/FocusStyle.js +2 -0
  144. package/lib/module/types/FocusStyle.js.map +1 -0
  145. package/lib/module/types/KeyboardFocusView.types.js +2 -0
  146. package/lib/module/types/KeyboardFocusView.types.js.map +1 -0
  147. package/lib/module/types/index.js +3 -0
  148. package/lib/module/types/index.js.map +1 -0
  149. package/lib/typescript/NativeModules/A11yKeyboardModule/A11yKeyboardModule.d.ts +5 -0
  150. package/lib/typescript/NativeModules/A11yKeyboardModule/A11yKeyboardModule.d.ts.map +1 -0
  151. package/lib/typescript/NativeModules/A11yKeyboardModule/index.d.ts +2 -0
  152. package/lib/typescript/NativeModules/A11yKeyboardModule/index.d.ts.map +1 -0
  153. package/lib/typescript/NativeModules/index.d.ts +2 -0
  154. package/lib/typescript/NativeModules/index.d.ts.map +1 -0
  155. package/lib/typescript/components/KeyboardFocusView/KeyboardFocusView.android.d.ts +14 -0
  156. package/lib/typescript/components/KeyboardFocusView/KeyboardFocusView.android.d.ts.map +1 -0
  157. package/lib/typescript/components/KeyboardFocusView/KeyboardFocusView.ios.d.ts +14 -0
  158. package/lib/typescript/components/KeyboardFocusView/KeyboardFocusView.ios.d.ts.map +1 -0
  159. package/lib/typescript/components/KeyboardFocusView/hooks/index.d.ts +2 -0
  160. package/lib/typescript/components/KeyboardFocusView/hooks/index.d.ts.map +1 -0
  161. package/lib/typescript/components/KeyboardFocusView/hooks/useFocusStyle/index.d.ts +2 -0
  162. package/lib/typescript/components/KeyboardFocusView/hooks/useFocusStyle/index.d.ts.map +1 -0
  163. package/lib/typescript/components/KeyboardFocusView/hooks/useFocusStyle/useFocusStyle.d.ts +8 -0
  164. package/lib/typescript/components/KeyboardFocusView/hooks/useFocusStyle/useFocusStyle.d.ts.map +1 -0
  165. package/lib/typescript/components/KeyboardFocusView/index.d.ts +2 -0
  166. package/lib/typescript/components/KeyboardFocusView/index.d.ts.map +1 -0
  167. package/lib/typescript/components/Pressable/Pressable.android.d.ts +24 -0
  168. package/lib/typescript/components/Pressable/Pressable.android.d.ts.map +1 -0
  169. package/lib/typescript/components/Pressable/Pressable.ios.d.ts +88 -0
  170. package/lib/typescript/components/Pressable/Pressable.ios.d.ts.map +1 -0
  171. package/lib/typescript/components/Pressable/index.d.ts +2 -0
  172. package/lib/typescript/components/Pressable/index.d.ts.map +1 -0
  173. package/lib/typescript/components/index.d.ts +3 -0
  174. package/lib/typescript/components/index.d.ts.map +1 -0
  175. package/lib/typescript/index.d.ts +5 -0
  176. package/lib/typescript/index.d.ts.map +1 -0
  177. package/lib/typescript/nativeSpec/ExternalKeyboardViewNativeComponent.d.ts +30 -0
  178. package/lib/typescript/nativeSpec/ExternalKeyboardViewNativeComponent.d.ts.map +1 -0
  179. package/lib/typescript/nativeSpec/NativeKeyboardModule.d.ts +8 -0
  180. package/lib/typescript/nativeSpec/NativeKeyboardModule.d.ts.map +1 -0
  181. package/lib/typescript/nativeSpec/index.d.ts +5 -0
  182. package/lib/typescript/nativeSpec/index.d.ts.map +1 -0
  183. package/lib/typescript/services/A11yModule/A11yModule.android.d.ts +9 -0
  184. package/lib/typescript/services/A11yModule/A11yModule.android.d.ts.map +1 -0
  185. package/lib/typescript/services/A11yModule/A11yModule.ios.d.ts +10 -0
  186. package/lib/typescript/services/A11yModule/A11yModule.ios.d.ts.map +1 -0
  187. package/lib/typescript/services/A11yModule/A11yModule.types.d.ts +12 -0
  188. package/lib/typescript/services/A11yModule/A11yModule.types.d.ts.map +1 -0
  189. package/lib/typescript/services/A11yModule/index.d.ts +2 -0
  190. package/lib/typescript/services/A11yModule/index.d.ts.map +1 -0
  191. package/lib/typescript/services/index.d.ts +2 -0
  192. package/lib/typescript/services/index.d.ts.map +1 -0
  193. package/lib/typescript/types/FocusStyle.d.ts +6 -0
  194. package/lib/typescript/types/FocusStyle.d.ts.map +1 -0
  195. package/lib/typescript/types/KeyboardFocusView.types.d.ts +36 -0
  196. package/lib/typescript/types/KeyboardFocusView.types.d.ts.map +1 -0
  197. package/lib/typescript/types/index.d.ts +3 -0
  198. package/lib/typescript/types/index.d.ts.map +1 -0
  199. package/package.json +165 -0
  200. package/react-native-external-keyboard.podspec +36 -0
  201. package/src/NativeModules/A11yKeyboardModule/A11yKeyboardModule.ts +37 -0
  202. package/src/NativeModules/A11yKeyboardModule/index.ts +1 -0
  203. package/src/NativeModules/index.ts +1 -0
  204. package/src/components/KeyboardFocusView/KeyboardFocusView.android.tsx +41 -0
  205. package/src/components/KeyboardFocusView/KeyboardFocusView.d.ts +7 -0
  206. package/src/components/KeyboardFocusView/KeyboardFocusView.ios.tsx +51 -0
  207. package/src/components/KeyboardFocusView/hooks/index.ts +1 -0
  208. package/src/components/KeyboardFocusView/hooks/useFocusStyle/index.ts +1 -0
  209. package/src/components/KeyboardFocusView/hooks/useFocusStyle/useFocusStyle.ts +31 -0
  210. package/src/components/KeyboardFocusView/index.ts +1 -0
  211. package/src/components/Pressable/Pressable.android.tsx +95 -0
  212. package/src/components/Pressable/Pressable.d.ts +7 -0
  213. package/src/components/Pressable/Pressable.ios.tsx +282 -0
  214. package/src/components/Pressable/index.ts +1 -0
  215. package/src/components/index.ts +2 -0
  216. package/src/index.tsx +5 -0
  217. package/src/nativeSpec/ExternalKeyboardViewNativeComponent.ts +37 -0
  218. package/src/nativeSpec/NativeKeyboardModule.ts +9 -0
  219. package/src/nativeSpec/index.ts +6 -0
  220. package/src/services/A11yModule/A11yModule.android.ts +20 -0
  221. package/src/services/A11yModule/A11yModule.d.ts +3 -0
  222. package/src/services/A11yModule/A11yModule.ios.ts +33 -0
  223. package/src/services/A11yModule/A11yModule.types.ts +15 -0
  224. package/src/services/A11yModule/index.ts +1 -0
  225. package/src/services/index.ts +1 -0
  226. package/src/types/FocusStyle.ts +10 -0
  227. package/src/types/KeyboardFocusView.types.ts +43 -0
  228. package/src/types/index.ts +6 -0
@@ -0,0 +1,282 @@
1
+ import React, { useMemo, useState, useRef, useImperativeHandle } from 'react';
2
+ import type { GestureResponderEvent, PressableProps, View } from 'react-native';
3
+
4
+ // @ts-ignore: import from origin pressable
5
+ import { normalizeRect } from 'react-native/Libraries/StyleSheet/Rect';
6
+ // @ts-ignore: import from origin pressable
7
+ import usePressability from 'react-native/Libraries/Pressability/usePressability';
8
+ // @ts-ignore: import from origin pressable
9
+ import useAndroidRippleForView from 'react-native/Libraries/Components/Pressable/useAndroidRippleForView';
10
+
11
+ import { KeyboardFocusView } from '../KeyboardFocusView';
12
+ import type { OnKeyPressFn, KeyboardFocusViewProps } from '../../types';
13
+
14
+ export type SyntheticEvent<T> = {
15
+ bubbles?: boolean;
16
+ cancelable?: boolean;
17
+ currentTarget: number | unknown;
18
+ defaultPrevented?: boolean;
19
+ dispatchConfig: {
20
+ registrationName: string;
21
+ };
22
+ eventPhase?: number;
23
+ preventDefault: () => void;
24
+ isDefaultPrevented: () => boolean;
25
+ stopPropagation: () => void;
26
+ isPropagationStopped: () => boolean;
27
+ isTrusted?: boolean;
28
+ nativeEvent: T;
29
+ persist: () => void;
30
+ target?: number | unknown;
31
+ timeStamp: number;
32
+ type?: string;
33
+ };
34
+
35
+ export type ResponderSyntheticEvent<T> = SyntheticEvent<T> & {
36
+ touchHistory: {
37
+ indexOfSingleActiveTouch: number;
38
+ mostRecentTimeStamp: number;
39
+ numberActiveTouches: number;
40
+ touchBank: Array<{
41
+ touchActive: boolean;
42
+ startPageX: number;
43
+ startPageY: number;
44
+ startTimeStamp: number;
45
+ currentPageX: number;
46
+ currentPageY: number;
47
+ currentTimeStamp: number;
48
+ previousPageX: number;
49
+ previousPageY: number;
50
+ previousTimeStamp: number;
51
+ }>;
52
+ };
53
+ };
54
+
55
+ export type PressEvent = ResponderSyntheticEvent<{
56
+ force?: number;
57
+ identifier: number;
58
+ locationX: number;
59
+ locationY: number;
60
+ pageX: number;
61
+ pageY: number;
62
+ target?: number;
63
+ timestamp: number;
64
+ }>;
65
+
66
+ type CombinedPressEvent = GestureResponderEvent | PressEvent;
67
+
68
+ type NAProps = {
69
+ 'onPressOut': (event: CombinedPressEvent) => void;
70
+ 'onPressIn': (event: CombinedPressEvent) => void;
71
+ 'aria-live'?: 'polite' | 'assertive' | 'off';
72
+ 'aria-busy'?: boolean;
73
+ 'aria-checked'?: boolean;
74
+ 'aria-disabled'?: boolean;
75
+ 'aria-expanded'?: boolean;
76
+ 'aria-label'?: string;
77
+ 'aria-selected'?: boolean;
78
+ 'aria-valuemax'?: number;
79
+ 'aria-valuemin'?: number;
80
+ 'aria-valuenow'?: number;
81
+ 'aria-modal'?: boolean;
82
+ 'aria-valuetext'?: string;
83
+ };
84
+
85
+ type Props = PressableProps &
86
+ NAProps &
87
+ KeyboardFocusViewProps & {
88
+ unstable_pressDelay?: number;
89
+ delayHoverIn: unknown;
90
+ delayHoverOut: unknown;
91
+ onHoverIn: unknown;
92
+ onHoverOut: unknown;
93
+ };
94
+
95
+ const IOS_SPACE_KEY_CODE = 44;
96
+
97
+ export const Pressable = React.memo(
98
+ React.forwardRef<View, Props>((props: Props, forwardedRef) => {
99
+ const {
100
+ accessibilityState,
101
+ 'aria-live': ariaLive,
102
+ android_disableSound,
103
+ android_ripple,
104
+ 'aria-busy': ariaBusy,
105
+ 'aria-checked': ariaChecked,
106
+ 'aria-disabled': ariaDisabled,
107
+ 'aria-expanded': ariaExpanded,
108
+ 'aria-label': ariaLabel,
109
+ 'aria-selected': ariaSelected,
110
+ cancelable,
111
+ children,
112
+ delayHoverIn,
113
+ delayHoverOut,
114
+ delayLongPress,
115
+ disabled,
116
+ focusable,
117
+ onHoverIn,
118
+ onHoverOut,
119
+ onLongPress,
120
+ onPress,
121
+ onPressIn,
122
+ onPressOut,
123
+ pressRetentionOffset,
124
+ style,
125
+ testOnly_pressed,
126
+ unstable_pressDelay,
127
+ canBeFocused,
128
+ onFocusChange,
129
+ ...restProps
130
+ } = props;
131
+
132
+ const viewRef = useRef<View>(null);
133
+ useImperativeHandle(forwardedRef, () => viewRef.current as View);
134
+
135
+ const hitSlop = normalizeRect(restProps?.hitSlop);
136
+
137
+ const android_rippleConfig = useAndroidRippleForView(
138
+ android_ripple,
139
+ viewRef
140
+ );
141
+
142
+ const [pressed, setPressed] = usePressState(testOnly_pressed === true);
143
+
144
+ let _accessibilityState = {
145
+ busy: ariaBusy ?? accessibilityState?.busy,
146
+ checked: ariaChecked ?? accessibilityState?.checked,
147
+ disabled: ariaDisabled ?? accessibilityState?.disabled,
148
+ expanded: ariaExpanded ?? accessibilityState?.expanded,
149
+ selected: ariaSelected ?? accessibilityState?.selected,
150
+ };
151
+
152
+ _accessibilityState =
153
+ disabled != null
154
+ ? { ..._accessibilityState, disabled }
155
+ : _accessibilityState;
156
+
157
+ const accessibilityValue = {
158
+ max: props['aria-valuemax'] ?? props.accessibilityValue?.max,
159
+ min: props['aria-valuemin'] ?? props.accessibilityValue?.min,
160
+ now: props['aria-valuenow'] ?? props.accessibilityValue?.now,
161
+ text: props['aria-valuetext'] ?? props.accessibilityValue?.text,
162
+ };
163
+
164
+ const accessibilityLiveRegion =
165
+ ariaLive === 'off' ? 'none' : ariaLive ?? props.accessibilityLiveRegion;
166
+
167
+ const accessibilityLabel = ariaLabel ?? props.accessibilityLabel;
168
+ const restPropsWithDefaults = {
169
+ ...restProps,
170
+ ...android_rippleConfig?.viewProps,
171
+ accessibilityState: _accessibilityState,
172
+ accessibilityValue,
173
+ accessibilityViewIsModal:
174
+ restProps['aria-modal'] ?? restProps.accessibilityViewIsModal,
175
+ accessibilityLiveRegion,
176
+ accessibilityLabel,
177
+ focusable: focusable !== false,
178
+ hitSlop,
179
+ };
180
+
181
+ const config = useMemo(
182
+ () => ({
183
+ cancelable,
184
+ disabled,
185
+ hitSlop,
186
+ pressRectOffset: pressRetentionOffset,
187
+ android_disableSound,
188
+ delayHoverIn,
189
+ delayHoverOut,
190
+ delayLongPress,
191
+ delayPressIn: unstable_pressDelay,
192
+ onHoverIn,
193
+ onHoverOut,
194
+ onLongPress,
195
+ onPress,
196
+ onPressIn(event: GestureResponderEvent | PressEvent): void {
197
+ if (android_rippleConfig != null) {
198
+ android_rippleConfig.onPressIn(event);
199
+ }
200
+ setPressed(true);
201
+ if (onPressIn != null) {
202
+ onPressIn(event);
203
+ }
204
+ },
205
+ onPressMove: android_rippleConfig?.onPressMove,
206
+ onPressOut(event: GestureResponderEvent | PressEvent): void {
207
+ if (android_rippleConfig != null) {
208
+ android_rippleConfig.onPressOut(event);
209
+ }
210
+ setPressed(false);
211
+ if (onPressOut != null) {
212
+ onPressOut(event);
213
+ }
214
+ },
215
+ }),
216
+ [
217
+ android_disableSound,
218
+ android_rippleConfig,
219
+ cancelable,
220
+ delayHoverIn,
221
+ delayHoverOut,
222
+ delayLongPress,
223
+ disabled,
224
+ hitSlop,
225
+ onHoverIn,
226
+ onHoverOut,
227
+ onLongPress,
228
+ onPress,
229
+ onPressIn,
230
+ onPressOut,
231
+ pressRetentionOffset,
232
+ setPressed,
233
+ unstable_pressDelay,
234
+ ]
235
+ );
236
+ const eventHandlers = usePressability(config);
237
+
238
+ const onKeyUpPress = React.useCallback<OnKeyPressFn>(
239
+ (e) => {
240
+ if (e.nativeEvent.keyCode === IOS_SPACE_KEY_CODE) {
241
+ onPressOut(e as unknown as GestureResponderEvent);
242
+ if (e.nativeEvent.isLongPress) {
243
+ onLongPress?.(e);
244
+ } else {
245
+ onPress?.(e);
246
+ }
247
+ }
248
+ },
249
+ [onLongPress, onPress, onPressOut]
250
+ );
251
+
252
+ const onKeyDownPress = React.useCallback<OnKeyPressFn>(
253
+ (e) => {
254
+ if (e.nativeEvent.keyCode === IOS_SPACE_KEY_CODE) {
255
+ onPressIn(e as unknown as GestureResponderEvent);
256
+ }
257
+ },
258
+ [onPressIn]
259
+ );
260
+
261
+ return (
262
+ <KeyboardFocusView
263
+ {...restPropsWithDefaults}
264
+ {...eventHandlers}
265
+ canBeFocused={canBeFocused}
266
+ onFocusChange={onFocusChange}
267
+ onKeyUpPress={onKeyUpPress}
268
+ onKeyDownPress={onKeyDownPress}
269
+ ref={viewRef}
270
+ style={typeof style === 'function' ? style({ pressed }) : style}
271
+ collapsable={false}
272
+ >
273
+ {typeof children === 'function' ? children({ pressed }) : children}
274
+ </KeyboardFocusView>
275
+ );
276
+ })
277
+ );
278
+
279
+ function usePressState(forcePressed: boolean): [boolean, (v: boolean) => void] {
280
+ const [pressed, setPressed] = useState(false);
281
+ return [pressed || forcePressed, setPressed];
282
+ }
@@ -0,0 +1 @@
1
+ export { Pressable } from './Pressable';
@@ -0,0 +1,2 @@
1
+ export { KeyboardFocusView } from './KeyboardFocusView';
2
+ export { Pressable } from './Pressable';
package/src/index.tsx ADDED
@@ -0,0 +1,5 @@
1
+ export { A11yKeyboardModule } from './NativeModules';
2
+ export { ExternalKeyboardView, KeyPress } from './nativeSpec';
3
+
4
+ export { KeyboardFocusView, Pressable } from './components';
5
+ export { A11yModule } from './services';
@@ -0,0 +1,37 @@
1
+ import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';
2
+ import type { ViewProps } from 'react-native';
3
+ import type {
4
+ BubblingEventHandler,
5
+ Int32,
6
+ } from 'react-native/Libraries/Types/CodegenTypes';
7
+
8
+ export type FocusChange = Readonly<{
9
+ isFocused: boolean;
10
+ }>;
11
+
12
+ export type EnterPress = Readonly<{
13
+ isShiftPressed: boolean;
14
+ isAltPressed: boolean;
15
+ isEnterPress: boolean;
16
+ }>;
17
+
18
+ export type KeyPress = Readonly<{
19
+ keyCode: Int32;
20
+ isLongPress: boolean;
21
+ isAltPressed: boolean;
22
+ isShiftPressed: boolean;
23
+ isCtrlPressed: boolean;
24
+ isCapsLockOn: boolean;
25
+ hasNoModifiers: boolean;
26
+ }>;
27
+
28
+ export interface ExternalKeyboardNativeProps extends ViewProps {
29
+ onFocusChange?: BubblingEventHandler<FocusChange>;
30
+ onKeyUpPress?: BubblingEventHandler<KeyPress>;
31
+ onKeyDownPress?: BubblingEventHandler<KeyPress>;
32
+ canBeFocused?: boolean;
33
+ }
34
+
35
+ export default codegenNativeComponent<ExternalKeyboardNativeProps>(
36
+ 'ExternalKeyboardView'
37
+ );
@@ -0,0 +1,9 @@
1
+ import type { TurboModule } from 'react-native';
2
+ import { TurboModuleRegistry } from 'react-native';
3
+
4
+ export interface Spec extends TurboModule {
5
+ setKeyboardFocus: (nativeTag: number, nextTag: number) => void;
6
+ setPreferredKeyboardFocus: (nativeTag: number, nextTag: number) => void;
7
+ }
8
+
9
+ export default TurboModuleRegistry.get<Spec>('A11yKeyboardModule');
@@ -0,0 +1,6 @@
1
+ import ExternalKeyboardView from './ExternalKeyboardViewNativeComponent';
2
+ import NativeKeyboardModule from './NativeKeyboardModule';
3
+
4
+ import type { KeyPress } from './ExternalKeyboardViewNativeComponent';
5
+
6
+ export { ExternalKeyboardView, NativeKeyboardModule, KeyPress };
@@ -0,0 +1,20 @@
1
+ import type React from 'react';
2
+ import { findNodeHandle, InteractionManager } from 'react-native';
3
+ import type { IA11yModule } from './A11yModule.types';
4
+
5
+ import { A11yKeyboardModule } from '../../NativeModules';
6
+
7
+ class A11yAndroidImpl implements IA11yModule {
8
+ setKeyboardFocus(ref: React.RefObject<React.Component>) {
9
+ const tag = findNodeHandle(ref.current);
10
+ if (tag) {
11
+ InteractionManager.runAfterInteractions(() => {
12
+ A11yKeyboardModule.setKeyboardFocus(tag);
13
+ });
14
+ }
15
+ }
16
+
17
+ setPreferredKeyboardFocus = () => {};
18
+ }
19
+
20
+ export const A11yModule = new A11yAndroidImpl();
@@ -0,0 +1,3 @@
1
+ import { IA11yModule } from './A11yModule.types';
2
+
3
+ declare const A11yModule: IA11yModule;
@@ -0,0 +1,33 @@
1
+ import { findNodeHandle } from 'react-native';
2
+
3
+ import type { IA11yModule, RefObjType } from './A11yModule.types';
4
+ import { A11yKeyboardModule } from '../../NativeModules';
5
+
6
+ class A11yModuleIOSImpl implements IA11yModule {
7
+ private _currentFocusedTag: number | null = null;
8
+
9
+ set currentFocusedTag(value: number) {
10
+ this._currentFocusedTag = value;
11
+ }
12
+
13
+ setPreferredKeyboardFocus = (tag: number, targetTag: number) => {
14
+ if (Number.isInteger(tag) && Number.isInteger(targetTag)) {
15
+ A11yKeyboardModule.setPreferredKeyboardFocus(tag, targetTag);
16
+ }
17
+ };
18
+
19
+ setKeyboardFocus = (ref: RefObjType) => {
20
+ const tag = findNodeHandle(ref.current);
21
+
22
+ if (
23
+ this._currentFocusedTag &&
24
+ tag &&
25
+ Number.isInteger(this._currentFocusedTag) &&
26
+ Number.isInteger(tag)
27
+ ) {
28
+ A11yKeyboardModule.setKeyboardFocus(this._currentFocusedTag, tag);
29
+ }
30
+ };
31
+ }
32
+
33
+ export const A11yModule = new A11yModuleIOSImpl();
@@ -0,0 +1,15 @@
1
+ import type { RefObject } from 'react';
2
+
3
+ export type A11yNativeModule = {
4
+ setKeyboardFocus: (nativeTag: number, nextTag?: number) => void;
5
+ setPreferredKeyboardFocus: (nativeTag: number, nextTag: number) => void;
6
+ };
7
+
8
+ export type RefObjType = RefObject<React.Component<{}, {}, unknown>>;
9
+
10
+ export interface IA11yModule {
11
+ currentFocusedTag?: number;
12
+
13
+ setPreferredKeyboardFocus: (nativeTag: number, nextTag: number) => void;
14
+ setKeyboardFocus: (ref: RefObjType) => void;
15
+ }
@@ -0,0 +1 @@
1
+ export { A11yModule } from './A11yModule';
@@ -0,0 +1 @@
1
+ export { A11yModule } from './A11yModule';
@@ -0,0 +1,10 @@
1
+ import type { StyleProp, ViewStyle } from 'react-native';
2
+
3
+ export type FocusStateCallbackType = {
4
+ readonly focused: boolean;
5
+ };
6
+
7
+ export type FocusStyle =
8
+ | StyleProp<ViewStyle>
9
+ | ((state: FocusStateCallbackType) => StyleProp<ViewStyle>)
10
+ | undefined;
@@ -0,0 +1,43 @@
1
+ import type { GestureResponderEvent } from 'react-native';
2
+
3
+ import type { NativeSyntheticEvent, ViewProps } from 'react-native';
4
+ import type { FocusStyle } from './FocusStyle';
5
+
6
+ export type KeyboardFocusEvent = NativeSyntheticEvent<{
7
+ isFocused: boolean;
8
+ }>;
9
+
10
+ export type OnKeyPress = NativeSyntheticEvent<{
11
+ keyCode: number;
12
+ isLongPress: boolean;
13
+ isAltPressed: boolean;
14
+ isShiftPressed: boolean;
15
+ isCtrlPressed: boolean;
16
+ isCapsLockOn: boolean;
17
+ hasNoModifiers: boolean;
18
+ }>;
19
+
20
+ export type OnKeyPressFn = (e: OnKeyPress) => void;
21
+ export type OnFocusChangeFn = (e: KeyboardFocusEvent) => void;
22
+
23
+ export type FocusWrapperProps = ViewProps & {
24
+ onFocusChange?: OnFocusChangeFn;
25
+ onKeyUpPress?: OnKeyPressFn;
26
+ onKeyDownPress?: OnKeyPressFn;
27
+ canBeFocused?: boolean;
28
+ };
29
+
30
+ export type FocusStateCallbackType = {
31
+ readonly focused: boolean;
32
+ };
33
+
34
+ export type KeyboardFocusViewProps = FocusWrapperProps & {
35
+ focusStyle?: FocusStyle;
36
+ onPress?: (e: GestureResponderEvent | OnKeyPress) => void;
37
+ onLongPress?: (e: GestureResponderEvent | OnKeyPress) => void;
38
+
39
+ /**
40
+ * @platform android
41
+ */
42
+ withView?: boolean;
43
+ };
@@ -0,0 +1,6 @@
1
+ export {
2
+ KeyboardFocusViewProps,
3
+ OnFocusChangeFn,
4
+ OnKeyPressFn,
5
+ } from './KeyboardFocusView.types';
6
+ export { FocusStateCallbackType, FocusStyle } from './FocusStyle';