@@ -3,78 +3,87 @@ import useVListContext, {VListContextProvider} from './vlist-context';
3
3
4
4
type LabeledItem = {
5
5
label : string ;
6
- }
6
+ } ;
7
7
8
8
export type RenderItemProps < Item > = {
9
9
item : Item ;
10
10
current : boolean ;
11
11
onMouseEnter : React . MouseEventHandler ;
12
12
onClick : React . MouseEventHandler ;
13
- }
13
+ } ;
14
14
15
15
type VerticalListProps < Item > = {
16
16
items : Item [ ] ;
17
17
RenderItem : ( props : RenderItemProps < Item > ) => React . JSX . Element ;
18
18
vListRef : React . RefObject < HTMLDivElement > ;
19
19
onSelect : ( i : Item ) => void ;
20
20
onCancel : ( ) => void ;
21
- }
21
+ } ;
22
22
23
- function RenderInContext < T extends LabeledItem > (
24
- { items, RenderItem, vListRef, onSelect, onCancel} : VerticalListProps < T >
25
- ) {
23
+ function RenderInContext < T extends LabeledItem > ( {
24
+ items,
25
+ RenderItem,
26
+ vListRef,
27
+ onSelect,
28
+ onCancel
29
+ } : VerticalListProps < T > ) {
26
30
const { count, setCount, index, setIndex} = useVListContext ( ) ;
27
31
28
32
React . useEffect ( ( ) => setCount ( items . length ) , [ items , setCount ] ) ;
29
33
30
34
const onKeyDown = ( event : React . KeyboardEvent ) => {
31
35
switch ( event . key ) {
32
- case 'ArrowDown' :
33
- setIndex ( Math . min ( index + 1 , count - 1 ) ) ;
34
- event . preventDefault ( ) ;
35
- event . stopPropagation ( ) ;
36
- break ;
37
- case 'ArrowUp' :
38
- setIndex ( Math . max ( index - 1 , - 1 ) ) ;
39
- event . preventDefault ( ) ;
40
- event . stopPropagation ( ) ;
41
- break ;
42
- case ' ' :
43
- case 'Enter' :
44
- onSelect ( items [ index ] ) ;
45
- event . preventDefault ( ) ;
46
- event . stopPropagation ( ) ;
47
- break ;
48
- case 'Escape' :
49
- onCancel ( ) ;
50
- event . preventDefault ( ) ;
51
- event . stopPropagation ( ) ;
52
- break ;
53
- default : break ;
36
+ case 'ArrowDown' :
37
+ setIndex ( Math . min ( index + 1 , count - 1 ) ) ;
38
+ event . preventDefault ( ) ;
39
+ event . stopPropagation ( ) ;
40
+ break ;
41
+ case 'ArrowUp' :
42
+ setIndex ( Math . max ( index - 1 , - 1 ) ) ;
43
+ event . preventDefault ( ) ;
44
+ event . stopPropagation ( ) ;
45
+ break ;
46
+ case ' ' :
47
+ case 'Enter' :
48
+ onSelect ( items [ index ] ) ;
49
+ event . preventDefault ( ) ;
50
+ event . stopPropagation ( ) ;
51
+ break ;
52
+ case 'Escape' :
53
+ onCancel ( ) ;
54
+ event . preventDefault ( ) ;
55
+ event . stopPropagation ( ) ;
56
+ break ;
57
+ default :
58
+ break ;
54
59
}
55
60
} ;
56
61
57
62
return (
58
63
< div
59
- className = "vertical-list" tabIndex = { 0 } ref = { vListRef }
60
- onBlur = { onCancel } onKeyDown = { onKeyDown }
64
+ className = "vertical-list"
65
+ tabIndex = { 0 }
66
+ ref = { vListRef }
67
+ onBlur = { onCancel }
68
+ onKeyDown = { onKeyDown }
61
69
role = "listbox"
62
70
>
63
- {
64
- items . map ( ( item , i ) =>
65
- < RenderItem
66
- key = { item . label }
67
- item = { item }
68
- current = { index === i }
69
- onMouseEnter = { ( ) => setIndex ( i ) }
70
- onClick = { ( ) => onSelect ( item ) }
71
- /> )
72
- }
71
+ { items . map ( ( item , i ) => (
72
+ < RenderItem
73
+ key = { item . label }
74
+ item = { item }
75
+ current = { index === i }
76
+ onMouseEnter = { ( ) => setIndex ( i ) }
77
+ onClick = { ( ) => onSelect ( item ) }
78
+ />
79
+ ) ) }
73
80
</ div >
74
81
) ;
75
82
}
76
83
77
- export default function VerticalList < T extends LabeledItem > ( props : VerticalListProps < T > ) {
84
+ export default function VerticalList < T extends LabeledItem > (
85
+ props : VerticalListProps < T >
86
+ ) {
78
87
return (
79
88
< VListContextProvider >
80
89
< RenderInContext { ...props } />
0 commit comments