1
- import { cloneElement , ReactElement } from 'react' ;
1
+ import { cloneElement , ReactElement , isValidElement } from 'react' ;
2
+ import invariant from 'tiny-invariant' ;
2
3
3
4
import { useLoaderContext } from './LoaderContext' ;
4
5
@@ -17,12 +18,16 @@ type AriaLive = 'off' | 'assertive' | 'polite' | undefined;
17
18
* Hook returning Indicator element according to loading argument.
18
19
* @example const { containerProps, indicatorEl } = useLoading({ loading: true })
19
20
*/
20
- export function useLoading ( { loading = false , indicator, loaderProps } : Props ) {
21
+ export function useLoading ( { loading = false , indicator, loaderProps = { } } : Props ) {
21
22
const containerProps = {
22
23
'aria-busy' : loading ,
23
24
'aria-live' : 'polite' as AriaLive ,
24
25
} ;
25
26
27
+ const loaderContext = useLoaderContext ( ) ;
28
+ const indicatorEl = indicator ?? loaderContext ?. indicator ;
29
+ invariant ( isValidElement ( indicatorEl ) , 'Expected a valid React element as indicator' ) ;
30
+
26
31
const accessibleLoaderProps = ( ( ) => {
27
32
const { valueText, ...rest } = loaderProps ;
28
33
return {
@@ -31,9 +36,6 @@ export function useLoading({ loading = false, indicator, loaderProps }: Props) {
31
36
...rest ,
32
37
}
33
38
} ) ( ) ;
34
-
35
- const loaderContext = useLoaderContext ( ) ;
36
- const indicatorEl = indicator ?? loaderContext ?. indicator ;
37
39
const accessibleIndicator = indicatorEl ? cloneElement ( indicatorEl , accessibleLoaderProps ) : null ;
38
40
39
41
return {
0 commit comments