@@ -4,6 +4,7 @@ import {GridState} from '@react-stately/grid';
4
4
// @ts -ignore
5
5
import intlMessages from '../intl/*.json' ;
6
6
import { Key } from '@react-types/shared' ;
7
+ import { useEffect , useRef } from 'react' ;
7
8
import { useId } from '@react-aria/utils' ;
8
9
import { useLocalizedStringFormatter } from '@react-aria/i18n' ;
9
10
@@ -31,8 +32,30 @@ export function useGridSelectionCheckbox<T, C extends GridCollection<T>>(props:
31
32
let isDisabled = ! state . selectionManager . canSelectItem ( key ) ;
32
33
let isSelected = state . selectionManager . isSelected ( key ) ;
33
34
35
+ let isShiftDown = useRef ( false ) ;
36
+ useEffect ( ( ) => {
37
+ let trackKeyDown = ( e : KeyboardEvent ) => {
38
+ if ( e . key === 'Shift' ) {
39
+ isShiftDown . current = true ;
40
+ }
41
+ } ;
42
+ let trackKeyUp = ( e : KeyboardEvent ) => {
43
+ if ( e . key === 'Shift' ) {
44
+ isShiftDown . current = false ;
45
+ }
46
+ } ;
47
+
48
+ document . addEventListener ( 'keydown' , trackKeyDown ) ;
49
+ document . addEventListener ( 'keyup' , trackKeyUp ) ;
50
+
51
+ return ( ) => {
52
+ document . removeEventListener ( 'keydown' , trackKeyDown ) ;
53
+ document . removeEventListener ( 'keyup' , trackKeyUp ) ;
54
+ } ;
55
+ } ) ;
56
+
34
57
// Checkbox should always toggle selection, regardless of selectionBehavior.
35
- let onChange = ( ) => manager . toggleSelection ( key ) ;
58
+ let onChange = ( ) => isShiftDown . current ? manager . extendSelection ( key ) : manager . toggleSelection ( key ) ;
36
59
37
60
const stringFormatter = useLocalizedStringFormatter ( intlMessages , '@react-aria/grid' ) ;
38
61
0 commit comments