1
1
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2
2
// SPDX-License-Identifier: Apache-2.0
3
3
4
- import React , { useContext , useEffect , useRef } from 'react' ;
4
+ import React , { useRef } from 'react' ;
5
5
import { render } from '@testing-library/react' ;
6
6
7
7
import {
8
- SingleTabStopNavigationAPI ,
9
8
SingleTabStopNavigationContext ,
10
- SingleTabStopNavigationProvider ,
11
9
useSingleTabStopNavigation ,
12
10
} from '../../../../lib/components/internal/context/single-tab-stop-navigation-context' ;
13
11
import { renderWithSingleTabStopNavigation } from './utils' ;
14
12
15
- // Simple STSN subscriber component
16
13
function Button ( props : React . HTMLAttributes < HTMLButtonElement > ) {
17
14
const buttonRef = useRef < HTMLButtonElement > ( null ) ;
18
15
const { tabIndex } = useSingleTabStopNavigation ( buttonRef , { tabIndex : props . tabIndex } ) ;
19
16
return < button { ...props } ref = { buttonRef } tabIndex = { tabIndex } /> ;
20
17
}
21
18
22
- // Simple STSN provider component
23
- function Group ( {
24
- id,
25
- navigationActive,
26
- children,
27
- } : {
28
- id : string ;
29
- navigationActive : boolean ;
30
- children : React . ReactNode ;
31
- } ) {
32
- const navigationAPI = useRef < SingleTabStopNavigationAPI > ( null ) ;
33
-
34
- useEffect ( ( ) => {
35
- navigationAPI . current ?. updateFocusTarget ( ) ;
36
- } ) ;
37
-
38
- return (
39
- < SingleTabStopNavigationProvider
40
- ref = { navigationAPI }
41
- navigationActive = { navigationActive }
42
- getNextFocusTarget = { ( ) => document . querySelector ( `#${ id } ` ) ! . querySelectorAll ( 'button' ) [ 0 ] as HTMLElement }
43
- >
44
- < div id = { id } >
45
- < Button > First</ Button >
46
- < Button > Second</ Button >
47
- { children }
48
- </ div >
49
- </ SingleTabStopNavigationProvider >
50
- ) ;
51
- }
52
-
53
- function findGroupButton ( groupId : string , buttonIndex : number ) {
54
- return document . querySelector ( `#${ groupId } ` ) ! . querySelectorAll ( 'button' ) [ buttonIndex ] as HTMLElement ;
55
- }
56
-
57
19
test ( 'does not override tab index when keyboard navigation is not active' , ( ) => {
58
20
renderWithSingleTabStopNavigation ( < Button id = "button" /> , { navigationActive : false } ) ;
59
21
expect ( document . querySelector ( '#button' ) ) . not . toHaveAttribute ( 'tabIndex' ) ;
@@ -113,9 +75,7 @@ test('propagates and suppresses navigation active state', () => {
113
75
}
114
76
function Test ( { navigationActive } : { navigationActive : boolean } ) {
115
77
return (
116
- < SingleTabStopNavigationContext . Provider
117
- value = { { navigationActive, registerFocusable : ( ) => ( ) => { } , resetFocusTarget : ( ) => { } } }
118
- >
78
+ < SingleTabStopNavigationContext . Provider value = { { navigationActive, registerFocusable : ( ) => ( ) => { } } } >
119
79
< Component />
120
80
</ SingleTabStopNavigationContext . Provider >
121
81
) ;
@@ -127,124 +87,3 @@ test('propagates and suppresses navigation active state', () => {
127
87
rerender ( < Test navigationActive = { false } /> ) ;
128
88
expect ( document . querySelector ( 'div' ) ) . toHaveTextContent ( 'false' ) ;
129
89
} ) ;
130
-
131
- test ( 'subscriber components can be used without provider' , ( ) => {
132
- function TestComponent ( props : React . HTMLAttributes < HTMLButtonElement > ) {
133
- const ref = useRef ( null ) ;
134
- const contextResult = useContext ( SingleTabStopNavigationContext ) ;
135
- const hookResult = useSingleTabStopNavigation ( ref , { tabIndex : props . tabIndex } ) ;
136
- useEffect ( ( ) => {
137
- contextResult . registerFocusable ( ref . current ! , ( ) => { } ) ;
138
- contextResult . resetFocusTarget ( ) ;
139
- } ) ;
140
- return (
141
- < div ref = { ref } >
142
- Context: { `${ contextResult . navigationActive } ` } , Hook: { `${ hookResult . navigationActive } :${ hookResult . tabIndex } ` }
143
- </ div >
144
- ) ;
145
- }
146
- const { container } = render ( < TestComponent /> ) ;
147
- expect ( container . textContent ) . toBe ( 'Context: false, Hook: false:undefined' ) ;
148
- } ) ;
149
-
150
- describe ( 'nested contexts' , ( ) => {
151
- test ( 'tab indices are distributed correctly when switching contexts from inner to outer' , ( ) => {
152
- const { rerender } = render (
153
- < Group id = "outer-most" navigationActive = { false } >
154
- < Group id = "outer" navigationActive = { false } >
155
- < Group id = "inner" navigationActive = { true } >
156
- { null }
157
- </ Group >
158
- </ Group >
159
- </ Group >
160
- ) ;
161
- expect ( findGroupButton ( 'outer-most' , 0 ) ) . not . toHaveAttribute ( 'tabindex' ) ;
162
- expect ( findGroupButton ( 'outer-most' , 1 ) ) . not . toHaveAttribute ( 'tabindex' ) ;
163
- expect ( findGroupButton ( 'outer' , 0 ) ) . not . toHaveAttribute ( 'tabindex' ) ;
164
- expect ( findGroupButton ( 'outer' , 1 ) ) . not . toHaveAttribute ( 'tabindex' ) ;
165
- expect ( findGroupButton ( 'inner' , 0 ) ) . toHaveAttribute ( 'tabindex' , '0' ) ;
166
- expect ( findGroupButton ( 'inner' , 1 ) ) . toHaveAttribute ( 'tabindex' , '-1' ) ;
167
-
168
- rerender (
169
- < Group id = "outer-most" navigationActive = { false } >
170
- < Group id = "outer" navigationActive = { true } >
171
- < Group id = "inner" navigationActive = { true } >
172
- { null }
173
- </ Group >
174
- </ Group >
175
- </ Group >
176
- ) ;
177
- expect ( findGroupButton ( 'outer-most' , 0 ) ) . not . toHaveAttribute ( 'tabindex' ) ;
178
- expect ( findGroupButton ( 'outer-most' , 1 ) ) . not . toHaveAttribute ( 'tabindex' ) ;
179
- expect ( findGroupButton ( 'outer' , 0 ) ) . toHaveAttribute ( 'tabindex' , '0' ) ;
180
- expect ( findGroupButton ( 'outer' , 1 ) ) . toHaveAttribute ( 'tabindex' , '-1' ) ;
181
- expect ( findGroupButton ( 'inner' , 0 ) ) . toHaveAttribute ( 'tabindex' , '-1' ) ;
182
- expect ( findGroupButton ( 'inner' , 1 ) ) . toHaveAttribute ( 'tabindex' , '-1' ) ;
183
-
184
- rerender (
185
- < Group id = "outer-most" navigationActive = { true } >
186
- < Group id = "outer" navigationActive = { true } >
187
- < Group id = "inner" navigationActive = { true } >
188
- { null }
189
- </ Group >
190
- </ Group >
191
- </ Group >
192
- ) ;
193
- expect ( findGroupButton ( 'outer-most' , 0 ) ) . toHaveAttribute ( 'tabindex' , '0' ) ;
194
- expect ( findGroupButton ( 'outer-most' , 1 ) ) . toHaveAttribute ( 'tabindex' , '-1' ) ;
195
- expect ( findGroupButton ( 'outer' , 0 ) ) . toHaveAttribute ( 'tabindex' , '-1' ) ;
196
- expect ( findGroupButton ( 'outer' , 1 ) ) . toHaveAttribute ( 'tabindex' , '-1' ) ;
197
- expect ( findGroupButton ( 'inner' , 0 ) ) . toHaveAttribute ( 'tabindex' , '-1' ) ;
198
- expect ( findGroupButton ( 'inner' , 1 ) ) . toHaveAttribute ( 'tabindex' , '-1' ) ;
199
- } ) ;
200
-
201
- test ( 'tab indices are distributed correctly when switching contexts from outer to inner' , ( ) => {
202
- const { rerender } = render (
203
- < Group id = "outer-most" navigationActive = { true } >
204
- < Group id = "outer" navigationActive = { true } >
205
- < Group id = "inner" navigationActive = { true } >
206
- { null }
207
- </ Group >
208
- </ Group >
209
- </ Group >
210
- ) ;
211
- expect ( findGroupButton ( 'outer-most' , 0 ) ) . toHaveAttribute ( 'tabindex' , '0' ) ;
212
- expect ( findGroupButton ( 'outer-most' , 1 ) ) . toHaveAttribute ( 'tabindex' , '-1' ) ;
213
- expect ( findGroupButton ( 'outer' , 0 ) ) . toHaveAttribute ( 'tabindex' , '-1' ) ;
214
- expect ( findGroupButton ( 'outer' , 1 ) ) . toHaveAttribute ( 'tabindex' , '-1' ) ;
215
- expect ( findGroupButton ( 'inner' , 0 ) ) . toHaveAttribute ( 'tabindex' , '-1' ) ;
216
- expect ( findGroupButton ( 'inner' , 1 ) ) . toHaveAttribute ( 'tabindex' , '-1' ) ;
217
-
218
- rerender (
219
- < Group id = "outer-most" navigationActive = { false } >
220
- < Group id = "outer" navigationActive = { true } >
221
- < Group id = "inner" navigationActive = { true } >
222
- { null }
223
- </ Group >
224
- </ Group >
225
- </ Group >
226
- ) ;
227
- expect ( findGroupButton ( 'outer-most' , 0 ) ) . not . toHaveAttribute ( 'tabindex' ) ;
228
- expect ( findGroupButton ( 'outer-most' , 1 ) ) . not . toHaveAttribute ( 'tabindex' ) ;
229
- expect ( findGroupButton ( 'outer' , 0 ) ) . toHaveAttribute ( 'tabindex' , '0' ) ;
230
- expect ( findGroupButton ( 'outer' , 1 ) ) . toHaveAttribute ( 'tabindex' , '-1' ) ;
231
- expect ( findGroupButton ( 'inner' , 0 ) ) . toHaveAttribute ( 'tabindex' , '-1' ) ;
232
- expect ( findGroupButton ( 'inner' , 1 ) ) . toHaveAttribute ( 'tabindex' , '-1' ) ;
233
-
234
- rerender (
235
- < Group id = "outer-most" navigationActive = { false } >
236
- < Group id = "outer" navigationActive = { false } >
237
- < Group id = "inner" navigationActive = { true } >
238
- { null }
239
- </ Group >
240
- </ Group >
241
- </ Group >
242
- ) ;
243
- expect ( findGroupButton ( 'outer-most' , 0 ) ) . not . toHaveAttribute ( 'tabindex' ) ;
244
- expect ( findGroupButton ( 'outer-most' , 1 ) ) . not . toHaveAttribute ( 'tabindex' ) ;
245
- expect ( findGroupButton ( 'outer' , 0 ) ) . not . toHaveAttribute ( 'tabindex' ) ;
246
- expect ( findGroupButton ( 'outer' , 1 ) ) . not . toHaveAttribute ( 'tabindex' ) ;
247
- expect ( findGroupButton ( 'inner' , 0 ) ) . toHaveAttribute ( 'tabindex' , '0' ) ;
248
- expect ( findGroupButton ( 'inner' , 1 ) ) . toHaveAttribute ( 'tabindex' , '-1' ) ;
249
- } ) ;
250
- } ) ;
0 commit comments