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.
- package/LICENSE +20 -0
- package/README.md +113 -0
- package/android/Android.mk +45 -0
- package/android/build.gradle +139 -0
- package/android/gradle.properties +5 -0
- package/android/registration.cpp +18 -0
- package/android/src/main/AndroidManifest.xml +4 -0
- package/android/src/main/java/com/externalkeyboard/A11yKeyboardModule.java +46 -0
- package/android/src/main/java/com/externalkeyboard/ExternalKeyboardViewPackage.java +63 -0
- package/android/src/main/java/com/externalkeyboard/events/FocusChangeEvent.java +39 -0
- package/android/src/main/java/com/externalkeyboard/events/KeyPressDownEvent.java +49 -0
- package/android/src/main/java/com/externalkeyboard/events/KeyPressUpEvent.java +49 -0
- package/android/src/main/java/com/externalkeyboard/services/KeyboardKeyPressHandler.java +56 -0
- package/android/src/main/java/com/externalkeyboard/services/KeyboardService.java +52 -0
- package/android/src/main/java/com/externalkeyboard/views/ExternalKeyboardView/ExternalKeyboardView.java +28 -0
- package/android/src/main/java/com/externalkeyboard/views/ExternalKeyboardView/ExternalKeyboardViewManager.java +101 -0
- package/android/src/newarch/A11yKeyboardModuleSpec.java +9 -0
- package/android/src/newarch/ExternalKeyboardViewManagerSpec.java +31 -0
- package/android/src/oldarch/A11yKeyboardModuleSpec.java +15 -0
- package/android/src/oldarch/ExternalKeyboardViewManagerSpec.java +9 -0
- package/ios/ExternalKeyboard.xcodeproj/project.pbxproj +384 -0
- package/ios/ExternalKeyboard.xcodeproj/project.xcworkspace/contents.xcworkspacedata +4 -0
- package/ios/ExternalKeyboard.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/ios/ExternalKeyboard.xcodeproj/project.xcworkspace/xcuserdata/Artur_Kalach.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/ExternalKeyboard.xcodeproj/xcuserdata/Artur_Kalach.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +24 -0
- package/ios/ExternalKeyboard.xcodeproj/xcuserdata/Artur_Kalach.xcuserdatad/xcschemes/xcschememanagement.plist +14 -0
- package/ios/ExternalKeyboardView/ExternalKeyboardView.h +41 -0
- package/ios/ExternalKeyboardView/ExternalKeyboardView.mm +186 -0
- package/ios/Helpers/FocusWrapper/FocusWrapper.h +32 -0
- package/ios/Helpers/FocusWrapper/FocusWrapper.mm +63 -0
- package/ios/Helpers/KeyboardKeyPressHandler/KeyboardKeyPressHandler.h +27 -0
- package/ios/Helpers/KeyboardKeyPressHandler/KeyboardKeyPressHandler.mm +73 -0
- package/ios/Modules/A11yKeyboardModule/A11yKeyboardModule.h +20 -0
- package/ios/Modules/A11yKeyboardModule/A11yKeyboardModule.mm +86 -0
- package/ios/ViewManagers/ExternalKeyboardViewManager/ExternalKeyboardViewManager.h +16 -0
- package/ios/ViewManagers/ExternalKeyboardViewManager/ExternalKeyboardViewManager.mm +29 -0
- package/lib/commonjs/NativeModules/A11yKeyboardModule/A11yKeyboardModule.js +33 -0
- package/lib/commonjs/NativeModules/A11yKeyboardModule/A11yKeyboardModule.js.map +1 -0
- package/lib/commonjs/NativeModules/A11yKeyboardModule/index.js +13 -0
- package/lib/commonjs/NativeModules/A11yKeyboardModule/index.js.map +1 -0
- package/lib/commonjs/NativeModules/index.js +13 -0
- package/lib/commonjs/NativeModules/index.js.map +1 -0
- package/lib/commonjs/components/KeyboardFocusView/KeyboardFocusView.android.js +41 -0
- package/lib/commonjs/components/KeyboardFocusView/KeyboardFocusView.android.js.map +1 -0
- package/lib/commonjs/components/KeyboardFocusView/KeyboardFocusView.d.js +6 -0
- package/lib/commonjs/components/KeyboardFocusView/KeyboardFocusView.d.js.map +1 -0
- package/lib/commonjs/components/KeyboardFocusView/KeyboardFocusView.ios.js +46 -0
- package/lib/commonjs/components/KeyboardFocusView/KeyboardFocusView.ios.js.map +1 -0
- package/lib/commonjs/components/KeyboardFocusView/hooks/index.js +13 -0
- package/lib/commonjs/components/KeyboardFocusView/hooks/index.js.map +1 -0
- package/lib/commonjs/components/KeyboardFocusView/hooks/useFocusStyle/index.js +13 -0
- package/lib/commonjs/components/KeyboardFocusView/hooks/useFocusStyle/index.js.map +1 -0
- package/lib/commonjs/components/KeyboardFocusView/hooks/useFocusStyle/useFocusStyle.js +33 -0
- package/lib/commonjs/components/KeyboardFocusView/hooks/useFocusStyle/useFocusStyle.js.map +1 -0
- package/lib/commonjs/components/KeyboardFocusView/index.js +13 -0
- package/lib/commonjs/components/KeyboardFocusView/index.js.map +1 -0
- package/lib/commonjs/components/Pressable/Pressable.android.js +76 -0
- package/lib/commonjs/components/Pressable/Pressable.android.js.map +1 -0
- package/lib/commonjs/components/Pressable/Pressable.d.js +6 -0
- package/lib/commonjs/components/Pressable/Pressable.d.js.map +1 -0
- package/lib/commonjs/components/Pressable/Pressable.ios.js +157 -0
- package/lib/commonjs/components/Pressable/Pressable.ios.js.map +1 -0
- package/lib/commonjs/components/Pressable/index.js +13 -0
- package/lib/commonjs/components/Pressable/index.js.map +1 -0
- package/lib/commonjs/components/index.js +20 -0
- package/lib/commonjs/components/index.js.map +1 -0
- package/lib/commonjs/index.js +46 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/nativeSpec/ExternalKeyboardViewNativeComponent.js +11 -0
- package/lib/commonjs/nativeSpec/ExternalKeyboardViewNativeComponent.js.map +1 -0
- package/lib/commonjs/nativeSpec/NativeKeyboardModule.js +10 -0
- package/lib/commonjs/nativeSpec/NativeKeyboardModule.js.map +1 -0
- package/lib/commonjs/nativeSpec/index.js +21 -0
- package/lib/commonjs/nativeSpec/index.js.map +1 -0
- package/lib/commonjs/services/A11yModule/A11yModule.android.js +22 -0
- package/lib/commonjs/services/A11yModule/A11yModule.android.js.map +1 -0
- package/lib/commonjs/services/A11yModule/A11yModule.d.js +6 -0
- package/lib/commonjs/services/A11yModule/A11yModule.d.js.map +1 -0
- package/lib/commonjs/services/A11yModule/A11yModule.ios.js +28 -0
- package/lib/commonjs/services/A11yModule/A11yModule.ios.js.map +1 -0
- package/lib/commonjs/services/A11yModule/A11yModule.types.js +6 -0
- package/lib/commonjs/services/A11yModule/A11yModule.types.js.map +1 -0
- package/lib/commonjs/services/A11yModule/index.js +13 -0
- package/lib/commonjs/services/A11yModule/index.js.map +1 -0
- package/lib/commonjs/services/index.js +13 -0
- package/lib/commonjs/services/index.js.map +1 -0
- package/lib/commonjs/types/FocusStyle.js +6 -0
- package/lib/commonjs/types/FocusStyle.js.map +1 -0
- package/lib/commonjs/types/KeyboardFocusView.types.js +6 -0
- package/lib/commonjs/types/KeyboardFocusView.types.js.map +1 -0
- package/lib/commonjs/types/index.js +38 -0
- package/lib/commonjs/types/index.js.map +1 -0
- package/lib/module/NativeModules/A11yKeyboardModule/A11yKeyboardModule.js +26 -0
- package/lib/module/NativeModules/A11yKeyboardModule/A11yKeyboardModule.js.map +1 -0
- package/lib/module/NativeModules/A11yKeyboardModule/index.js +2 -0
- package/lib/module/NativeModules/A11yKeyboardModule/index.js.map +1 -0
- package/lib/module/NativeModules/index.js +2 -0
- package/lib/module/NativeModules/index.js.map +1 -0
- package/lib/module/components/KeyboardFocusView/KeyboardFocusView.android.js +33 -0
- package/lib/module/components/KeyboardFocusView/KeyboardFocusView.android.js.map +1 -0
- package/lib/module/components/KeyboardFocusView/KeyboardFocusView.d.js +2 -0
- package/lib/module/components/KeyboardFocusView/KeyboardFocusView.d.js.map +1 -0
- package/lib/module/components/KeyboardFocusView/KeyboardFocusView.ios.js +37 -0
- package/lib/module/components/KeyboardFocusView/KeyboardFocusView.ios.js.map +1 -0
- package/lib/module/components/KeyboardFocusView/hooks/index.js +2 -0
- package/lib/module/components/KeyboardFocusView/hooks/index.js.map +1 -0
- package/lib/module/components/KeyboardFocusView/hooks/useFocusStyle/index.js +2 -0
- package/lib/module/components/KeyboardFocusView/hooks/useFocusStyle/index.js.map +1 -0
- package/lib/module/components/KeyboardFocusView/hooks/useFocusStyle/useFocusStyle.js +26 -0
- package/lib/module/components/KeyboardFocusView/hooks/useFocusStyle/useFocusStyle.js.map +1 -0
- package/lib/module/components/KeyboardFocusView/index.js +2 -0
- package/lib/module/components/KeyboardFocusView/index.js.map +1 -0
- package/lib/module/components/Pressable/Pressable.android.js +70 -0
- package/lib/module/components/Pressable/Pressable.android.js.map +1 -0
- package/lib/module/components/Pressable/Pressable.d.js +2 -0
- package/lib/module/components/Pressable/Pressable.d.js.map +1 -0
- package/lib/module/components/Pressable/Pressable.ios.js +148 -0
- package/lib/module/components/Pressable/Pressable.ios.js.map +1 -0
- package/lib/module/components/Pressable/index.js +2 -0
- package/lib/module/components/Pressable/index.js.map +1 -0
- package/lib/module/components/index.js +3 -0
- package/lib/module/components/index.js.map +1 -0
- package/lib/module/index.js +5 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/nativeSpec/ExternalKeyboardViewNativeComponent.js +3 -0
- package/lib/module/nativeSpec/ExternalKeyboardViewNativeComponent.js.map +1 -0
- package/lib/module/nativeSpec/NativeKeyboardModule.js +3 -0
- package/lib/module/nativeSpec/NativeKeyboardModule.js.map +1 -0
- package/lib/module/nativeSpec/index.js +4 -0
- package/lib/module/nativeSpec/index.js.map +1 -0
- package/lib/module/services/A11yModule/A11yModule.android.js +15 -0
- package/lib/module/services/A11yModule/A11yModule.android.js.map +1 -0
- package/lib/module/services/A11yModule/A11yModule.d.js +2 -0
- package/lib/module/services/A11yModule/A11yModule.d.js.map +1 -0
- package/lib/module/services/A11yModule/A11yModule.ios.js +21 -0
- package/lib/module/services/A11yModule/A11yModule.ios.js.map +1 -0
- package/lib/module/services/A11yModule/A11yModule.types.js +2 -0
- package/lib/module/services/A11yModule/A11yModule.types.js.map +1 -0
- package/lib/module/services/A11yModule/index.js +2 -0
- package/lib/module/services/A11yModule/index.js.map +1 -0
- package/lib/module/services/index.js +2 -0
- package/lib/module/services/index.js.map +1 -0
- package/lib/module/types/FocusStyle.js +2 -0
- package/lib/module/types/FocusStyle.js.map +1 -0
- package/lib/module/types/KeyboardFocusView.types.js +2 -0
- package/lib/module/types/KeyboardFocusView.types.js.map +1 -0
- package/lib/module/types/index.js +3 -0
- package/lib/module/types/index.js.map +1 -0
- package/lib/typescript/NativeModules/A11yKeyboardModule/A11yKeyboardModule.d.ts +5 -0
- package/lib/typescript/NativeModules/A11yKeyboardModule/A11yKeyboardModule.d.ts.map +1 -0
- package/lib/typescript/NativeModules/A11yKeyboardModule/index.d.ts +2 -0
- package/lib/typescript/NativeModules/A11yKeyboardModule/index.d.ts.map +1 -0
- package/lib/typescript/NativeModules/index.d.ts +2 -0
- package/lib/typescript/NativeModules/index.d.ts.map +1 -0
- package/lib/typescript/components/KeyboardFocusView/KeyboardFocusView.android.d.ts +14 -0
- package/lib/typescript/components/KeyboardFocusView/KeyboardFocusView.android.d.ts.map +1 -0
- package/lib/typescript/components/KeyboardFocusView/KeyboardFocusView.ios.d.ts +14 -0
- package/lib/typescript/components/KeyboardFocusView/KeyboardFocusView.ios.d.ts.map +1 -0
- package/lib/typescript/components/KeyboardFocusView/hooks/index.d.ts +2 -0
- package/lib/typescript/components/KeyboardFocusView/hooks/index.d.ts.map +1 -0
- package/lib/typescript/components/KeyboardFocusView/hooks/useFocusStyle/index.d.ts +2 -0
- package/lib/typescript/components/KeyboardFocusView/hooks/useFocusStyle/index.d.ts.map +1 -0
- package/lib/typescript/components/KeyboardFocusView/hooks/useFocusStyle/useFocusStyle.d.ts +8 -0
- package/lib/typescript/components/KeyboardFocusView/hooks/useFocusStyle/useFocusStyle.d.ts.map +1 -0
- package/lib/typescript/components/KeyboardFocusView/index.d.ts +2 -0
- package/lib/typescript/components/KeyboardFocusView/index.d.ts.map +1 -0
- package/lib/typescript/components/Pressable/Pressable.android.d.ts +24 -0
- package/lib/typescript/components/Pressable/Pressable.android.d.ts.map +1 -0
- package/lib/typescript/components/Pressable/Pressable.ios.d.ts +88 -0
- package/lib/typescript/components/Pressable/Pressable.ios.d.ts.map +1 -0
- package/lib/typescript/components/Pressable/index.d.ts +2 -0
- package/lib/typescript/components/Pressable/index.d.ts.map +1 -0
- package/lib/typescript/components/index.d.ts +3 -0
- package/lib/typescript/components/index.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +5 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/nativeSpec/ExternalKeyboardViewNativeComponent.d.ts +30 -0
- package/lib/typescript/nativeSpec/ExternalKeyboardViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/nativeSpec/NativeKeyboardModule.d.ts +8 -0
- package/lib/typescript/nativeSpec/NativeKeyboardModule.d.ts.map +1 -0
- package/lib/typescript/nativeSpec/index.d.ts +5 -0
- package/lib/typescript/nativeSpec/index.d.ts.map +1 -0
- package/lib/typescript/services/A11yModule/A11yModule.android.d.ts +9 -0
- package/lib/typescript/services/A11yModule/A11yModule.android.d.ts.map +1 -0
- package/lib/typescript/services/A11yModule/A11yModule.ios.d.ts +10 -0
- package/lib/typescript/services/A11yModule/A11yModule.ios.d.ts.map +1 -0
- package/lib/typescript/services/A11yModule/A11yModule.types.d.ts +12 -0
- package/lib/typescript/services/A11yModule/A11yModule.types.d.ts.map +1 -0
- package/lib/typescript/services/A11yModule/index.d.ts +2 -0
- package/lib/typescript/services/A11yModule/index.d.ts.map +1 -0
- package/lib/typescript/services/index.d.ts +2 -0
- package/lib/typescript/services/index.d.ts.map +1 -0
- package/lib/typescript/types/FocusStyle.d.ts +6 -0
- package/lib/typescript/types/FocusStyle.d.ts.map +1 -0
- package/lib/typescript/types/KeyboardFocusView.types.d.ts +36 -0
- package/lib/typescript/types/KeyboardFocusView.types.d.ts.map +1 -0
- package/lib/typescript/types/index.d.ts +3 -0
- package/lib/typescript/types/index.d.ts.map +1 -0
- package/package.json +165 -0
- package/react-native-external-keyboard.podspec +36 -0
- package/src/NativeModules/A11yKeyboardModule/A11yKeyboardModule.ts +37 -0
- package/src/NativeModules/A11yKeyboardModule/index.ts +1 -0
- package/src/NativeModules/index.ts +1 -0
- package/src/components/KeyboardFocusView/KeyboardFocusView.android.tsx +41 -0
- package/src/components/KeyboardFocusView/KeyboardFocusView.d.ts +7 -0
- package/src/components/KeyboardFocusView/KeyboardFocusView.ios.tsx +51 -0
- package/src/components/KeyboardFocusView/hooks/index.ts +1 -0
- package/src/components/KeyboardFocusView/hooks/useFocusStyle/index.ts +1 -0
- package/src/components/KeyboardFocusView/hooks/useFocusStyle/useFocusStyle.ts +31 -0
- package/src/components/KeyboardFocusView/index.ts +1 -0
- package/src/components/Pressable/Pressable.android.tsx +95 -0
- package/src/components/Pressable/Pressable.d.ts +7 -0
- package/src/components/Pressable/Pressable.ios.tsx +282 -0
- package/src/components/Pressable/index.ts +1 -0
- package/src/components/index.ts +2 -0
- package/src/index.tsx +5 -0
- package/src/nativeSpec/ExternalKeyboardViewNativeComponent.ts +37 -0
- package/src/nativeSpec/NativeKeyboardModule.ts +9 -0
- package/src/nativeSpec/index.ts +6 -0
- package/src/services/A11yModule/A11yModule.android.ts +20 -0
- package/src/services/A11yModule/A11yModule.d.ts +3 -0
- package/src/services/A11yModule/A11yModule.ios.ts +33 -0
- package/src/services/A11yModule/A11yModule.types.ts +15 -0
- package/src/services/A11yModule/index.ts +1 -0
- package/src/services/index.ts +1 -0
- package/src/types/FocusStyle.ts +10 -0
- package/src/types/KeyboardFocusView.types.ts +43 -0
- 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';
|
package/src/index.tsx
ADDED
|
@@ -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,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
|
+
};
|