@@ -23,6 +23,25 @@ import {
2323 View ,
2424} from 'react-native' ;
2525
26+ function formatKeyEvent ( event ) {
27+ const modifiers = [ ] ;
28+ if ( event . metaKey ) {
29+ modifiers . push ( 'Cmd' ) ;
30+ }
31+ if ( event . ctrlKey ) {
32+ modifiers . push ( 'Ctrl' ) ;
33+ }
34+ if ( event . altKey ) {
35+ modifiers . push ( 'Alt' ) ;
36+ }
37+ if ( event . shiftKey ) {
38+ modifiers . push ( 'Shift' ) ;
39+ }
40+
41+ const modifierPrefix = modifiers . length > 0 ? `${ modifiers . join ( '+' ) } +` : '' ;
42+ return `${ modifierPrefix } ${ event . key } ` ;
43+ }
44+
2645function BubblingExample ( ) : React . Node {
2746 const ref = React . useRef < React . ElementRef < typeof Pressable > | null > ( null ) ;
2847 const [ eventLog , setEventLog ] = React . useState < Array < string >> ( [ ] ) ;
@@ -51,14 +70,19 @@ function BubblingExample(): React.Node {
5170 style = { styles . boxOuter }
5271 nativeID = "Box 3"
5372 onKeyDown = { ev => {
54- appendEvent ( `keyDown: ${ ev . nativeEvent . key } ` , 'Box 3' ) ;
73+ const keyDisplay = formatKeyEvent ( ev . nativeEvent ) ;
74+ appendEvent ( `keyDown: ${ keyDisplay } ` , 'Box 3' ) ;
5575 } } >
5676 < View
5777 style = { styles . boxMiddle }
5878 nativeID = "Box 2"
5979 onKeyDown = { ev => {
80+ const blockedKeys = [ 'f' , 'g' ] ;
81+ const isBlocked = blockedKeys . includes ( ev . nativeEvent . key ) ;
82+ const suffix = isBlocked ? ' (blocked)' : '' ;
83+ const keyDisplay = formatKeyEvent ( ev . nativeEvent ) ;
6084 appendEvent (
61- `keyDown: ${ ev . nativeEvent . key } ` ,
85+ `keyDown: ${ keyDisplay } ${ suffix } ` ,
6286 'Box 2 keyDownEvents=[f,g]' ,
6387 ) ;
6488 if ( stopPropagationEnabled ) {
@@ -71,7 +95,8 @@ function BubblingExample(): React.Node {
7195 style = { styles . boxInner }
7296 nativeID = "Box 1"
7397 onKeyDown = { ev => {
74- appendEvent ( `keyDown: ${ ev . nativeEvent . key } ` , 'Box 1' ) ;
98+ const keyDisplay = formatKeyEvent ( ev . nativeEvent ) ;
99+ appendEvent ( `keyDown: ${ keyDisplay } ` , 'Box 1' ) ;
75100 } } >
76101 < View style = { [ styles . centered ] } >
77102 < Pressable
@@ -86,7 +111,8 @@ function BubblingExample(): React.Node {
86111 ref . current ?. focus ( ) ;
87112 } }
88113 onKeyDown = { ev => {
89- appendEvent ( `keyDown: ${ ev . nativeEvent . key } ` , 'Focusable' ) ;
114+ const keyDisplay = formatKeyEvent ( ev . nativeEvent ) ;
115+ appendEvent ( `keyDown: ${ keyDisplay } ` , 'Focusable' ) ;
90116 if (
91117 ev . nativeEvent . key === 'k' &&
92118 ev . nativeEvent . metaKey === true
@@ -127,7 +153,6 @@ function BubblingExample(): React.Node {
127153}
128154
129155function KeyboardEventExample ( ) : React . Node {
130- const pressableRef = React . useRef < React . ElementRef < typeof Pressable > | null > ( null ) ;
131156 const [ eventLog , setEventLog ] = React . useState < Array < string >> ( [ ] ) ;
132157
133158 function appendEvent ( eventName : string , source ?: string ) {
@@ -138,47 +163,70 @@ function KeyboardEventExample(): React.Node {
138163 } ) ;
139164 }
140165
166+ function isKeyBlocked ( event , keyEvents ) {
167+ return keyEvents . some ( ( { key, metaKey, ctrlKey, altKey, shiftKey} ) => {
168+ return event . key === key &&
169+ ( metaKey ?? event . metaKey ) === event . metaKey &&
170+ ( ctrlKey ?? event . ctrlKey ) === event . ctrlKey &&
171+ ( altKey ?? event . altKey ) === event . altKey &&
172+ ( shiftKey ?? event . shiftKey ) === event . shiftKey ;
173+ } ) ;
174+ }
175+
141176 const handleSingleLineKeyDown = React . useCallback (
142177 ( e : KeyEvent ) => {
143- appendEvent ( `keyDown: ${ e . nativeEvent . key } ` , 'Single-line TextInput' ) ;
178+ const keyDownEvents = [
179+ { key : 'g' } ,
180+ { key : 'Escape' } ,
181+ { key : 'Enter' } ,
182+ { key : 'ArrowLeft' } ,
183+ ] ;
184+ const isBlocked = isKeyBlocked ( e . nativeEvent , keyDownEvents ) ;
185+ const suffix = isBlocked ? ' (blocked)' : '' ;
186+ const keyDisplay = formatKeyEvent ( e . nativeEvent ) ;
187+ appendEvent ( `keyDown: ${ keyDisplay } ${ suffix } ` , 'Single-line TextInput' ) ;
144188 } ,
145189 [ ] ,
146190 ) ;
147191
148192 const handleSingleLineKeyUp = React . useCallback (
149193 ( e : KeyEvent ) => {
150- appendEvent ( `keyUp: ${ e . nativeEvent . key } ` , 'Single-line TextInput' ) ;
194+ const keyUpEvents = [ { key : 'c' } , { key : 'd' } ] ;
195+ const isBlocked = isKeyBlocked ( e . nativeEvent , keyUpEvents ) ;
196+ const suffix = isBlocked ? ' (blocked)' : '' ;
197+ const keyDisplay = formatKeyEvent ( e . nativeEvent ) ;
198+ appendEvent ( `keyUp: ${ keyDisplay } ${ suffix } ` , 'Single-line TextInput' ) ;
151199 } ,
152200 [ ] ,
153201 ) ;
154202
155203 const handleMultiLineKeyDown = React . useCallback (
156204 ( e : KeyEvent ) => {
157- appendEvent ( `keyDown: ${ e . nativeEvent . key } ` , 'Multi-line TextInput' ) ;
205+ const keyDownEvents = [
206+ { key : 'ArrowRight' } ,
207+ { key : 'ArrowDown' } ,
208+ { key : 'Enter' , metaKey : true } ,
209+ ] ;
210+ const isBlocked = isKeyBlocked ( e . nativeEvent , keyDownEvents ) ;
211+ const suffix = isBlocked ? ' (blocked)' : '' ;
212+ const keyDisplay = formatKeyEvent ( e . nativeEvent ) ;
213+ appendEvent ( `keyDown: ${ keyDisplay } ${ suffix } ` , 'Multi-line TextInput' ) ;
158214 } ,
159215 [ ] ,
160216 ) ;
161217
162218 const handleMultiLineKeyUp = React . useCallback (
163219 ( e : KeyEvent ) => {
164- appendEvent ( `keyUp: ${ e . nativeEvent . key } ` , 'Multi-line TextInput' ) ;
220+ const keyUpEvents = [ { key : 'Escape' } , { key : 'Enter' } ] ;
221+ const isBlocked = isKeyBlocked ( e . nativeEvent , keyUpEvents ) ;
222+ const suffix = isBlocked ? ' (blocked)' : '' ;
223+ const keyDisplay = formatKeyEvent ( e . nativeEvent ) ;
224+ appendEvent ( `keyUp: ${ keyDisplay } ${ suffix } ` , 'Multi-line TextInput' ) ;
165225 } ,
166226 [ ] ,
167227 ) ;
168228
169- const handlePressableKeyDown = React . useCallback (
170- ( e : KeyEvent ) => {
171- appendEvent ( `keyDown: ${ e . nativeEvent . key } ` , 'Focusable Pressable' ) ;
172- } ,
173- [ ] ,
174- ) ;
175229
176- const handlePressableKeyUp = React . useCallback (
177- ( e : KeyEvent ) => {
178- appendEvent ( `keyUp: ${ e . nativeEvent . key } ` , 'Focusable Pressable' ) ;
179- } ,
180- [ ] ,
181- ) ;
182230
183231 return (
184232 < View style = { { marginTop : 10 } } >
0 commit comments