File tree Expand file tree Collapse file tree 4 files changed +137
-0
lines changed
src/components/keyEventListener Expand file tree Collapse file tree 4 files changed +137
-0
lines changed Original file line number Diff line number Diff line change
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports [` test KeyCombiner suite snapshot match 1` ] = `
4
+ <span
5
+ data-testid = " test_keyCombiner"
6
+ >
7
+ <div >
8
+ command+shift+f
9
+ </div >
10
+ </span >
11
+ ` ;
Original file line number Diff line number Diff line change
1
+
2
+ import React from 'react' ;
3
+ import KeyEventListener from '../index' ;
4
+ import { render , cleanup , fireEvent } from '@testing-library/react' ;
5
+ import '@testing-library/jest-dom/extend-expect' ;
6
+ const { KeyCombiner } = KeyEventListener
7
+ describe ( 'test KeyCombiner suite' , ( ) => {
8
+ const text = 'command+shift+f' ;
9
+ let dom , element ;
10
+ beforeEach ( ( ) => {
11
+ dom = render ( < KeyCombiner
12
+ onTrigger = { ( ) => { console . log ( 'keyAction' ) } }
13
+ keyMap = { {
14
+ 70 : true ,
15
+ 91 : true ,
16
+ 16 : true
17
+ } } >
18
+ < div > { text } </ div >
19
+ </ KeyCombiner > )
20
+ element = dom . getByTestId ( 'test_keyCombiner' ) ;
21
+ } )
22
+ afterEach ( ( ) => {
23
+ cleanup ( )
24
+ } )
25
+ test ( 'snapshot match' , ( ) => {
26
+ expect ( element ) . toMatchSnapshot ( ) ;
27
+ } )
28
+ test ( 'test key code' , ( ) => {
29
+ fireEvent . keyPress ( element , { key : 'Enter' , code : 'Enter' } )
30
+ } )
31
+ test ( 'should render the correct text' , ( ) => {
32
+ expect ( element ) . toBeInTheDocument ( ) ;
33
+ expect ( element ) . toHaveTextContent ( `${ text } ` )
34
+ } )
35
+ } )
Original file line number Diff line number Diff line change
1
+ import * as React from 'react' ;
2
+ import KeyCombiner from './listener'
3
+ export default class KeyEventListener extends React . Component < any , any > {
4
+ static KeyCombiner = KeyCombiner
5
+ componentDidMount ( ) {
6
+ addEventListener ( 'keydown' , this . bindEvent , false )
7
+ addEventListener ( 'keyup' , this . bindEvent , false )
8
+ }
9
+
10
+ componentWillUnmount ( ) {
11
+ removeEventListener ( 'keydown' , this . bindEvent , false )
12
+ removeEventListener ( 'keyup' , this . bindEvent , false )
13
+ }
14
+
15
+ bindEvent = ( target : any ) => {
16
+ const { onKeyDown, onKeyUp } = this . props ;
17
+ const isKeyDown = target . type === 'keydown' ;
18
+
19
+ if ( isKeyDown && onKeyDown ) {
20
+ onKeyDown ( target )
21
+ } else if ( ! isKeyDown && onKeyUp ) {
22
+ onKeyUp ( target )
23
+ }
24
+ }
25
+
26
+ render ( ) {
27
+ return this . props . children ;
28
+ }
29
+ }
Original file line number Diff line number Diff line change
1
+ import * as React from 'react' ;
2
+
3
+ export default class KeyCombiner extends React . Component < any , any > {
4
+ constructor ( props : any ) {
5
+ super ( props ) ;
6
+ this . state = {
7
+ currentKeys : { }
8
+ } ;
9
+ }
10
+
11
+ componentDidMount ( ) {
12
+ addEventListener ( 'keydown' , this . bindEvent , false )
13
+ addEventListener ( 'keyup' , this . bindEvent , false )
14
+ }
15
+
16
+ componentWillUnmount ( ) {
17
+ removeEventListener ( 'keydown' , this . bindEvent , false )
18
+ removeEventListener ( 'keyup' , this . bindEvent , false )
19
+ this . setState ( { currentKeys : { } } )
20
+ }
21
+
22
+ bindEvent = ( target : any ) => {
23
+ const { onTrigger, keyMap } = this . props ;
24
+
25
+ const keyCode = target . keyCode ;
26
+ const isKeyDown = target . type === 'keydown' ;
27
+
28
+ if ( ! isKeyDown ) {
29
+ this . setState ( {
30
+ currentKeys : { }
31
+ } )
32
+ return ;
33
+ } ;
34
+
35
+ if ( keyMap [ keyCode ] === true ) {
36
+ const currentKeys = Object . assign ( this . state . currentKeys , {
37
+ [ keyCode ] : isKeyDown
38
+ } ) ;
39
+
40
+ this . setState ( {
41
+ currentKeys
42
+ } )
43
+
44
+ let keyAllRight = true ;
45
+ for ( let key in keyMap ) {
46
+ if ( ! currentKeys [ key ] ) {
47
+ keyAllRight = false ;
48
+ break ;
49
+ }
50
+ }
51
+ if ( keyAllRight ) {
52
+ onTrigger ( target ) ;
53
+ }
54
+ }
55
+ }
56
+
57
+ render ( ) {
58
+ return < span data-testid = 'test_keyCombiner' >
59
+ { this . props . children }
60
+ </ span >
61
+ }
62
+ }
You can’t perform that action at this time.
0 commit comments