@@ -17,31 +17,31 @@ import {
17
17
createHatchedBackground
18
18
} from '../common' ;
19
19
import useControlledOrUncontrolled from '../common/hooks/useControlledOrUncontrolled' ;
20
+ import useEventCallback from '../common/hooks/useEventCallback' ;
20
21
import useForkRef from '../common/hooks/useForkRef' ;
21
22
import { useIsFocusVisible } from '../common/hooks/useIsFocusVisible' ;
22
23
import { clamp , getSize , roundValueToStep } from '../common/utils' ;
23
24
import { StyledScrollView } from '../ScrollView/ScrollView' ;
24
25
import { CommonStyledProps } from '../types' ;
25
26
27
+ export type SliderOnChangeHandler = (
28
+ event :
29
+ | MouseEvent
30
+ | React . KeyboardEvent < HTMLSpanElement >
31
+ | React . MouseEvent < HTMLDivElement >
32
+ | TouchEvent ,
33
+ value : number
34
+ ) => void ;
35
+
26
36
type SliderProps = {
27
37
defaultValue ?: number ;
28
38
disabled ?: boolean ;
29
39
marks ?: boolean | { label ?: string ; value : number } [ ] ;
30
40
max ?: number ;
31
41
min ?: number ;
32
42
name ?: string ;
33
- onChange ?: (
34
- event :
35
- | MouseEvent
36
- | React . KeyboardEvent < HTMLSpanElement >
37
- | React . MouseEvent < HTMLDivElement >
38
- | TouchEvent ,
39
- value : number
40
- ) => void ;
41
- onChangeCommitted ?: (
42
- event : MouseEvent | React . KeyboardEvent < HTMLSpanElement > | TouchEvent ,
43
- value : number
44
- ) => void ;
43
+ onChange ?: SliderOnChangeHandler ;
44
+ onChangeCommitted ?: SliderOnChangeHandler ;
45
45
onMouseDown ?: ( event : React . MouseEvent < HTMLDivElement > ) => void ;
46
46
orientation ?: 'horizontal' | 'vertical' ;
47
47
size ?: string | number ;
@@ -330,21 +330,20 @@ const Slider = forwardRef<HTMLDivElement, SliderProps>(
330
330
const handleFocusRef = useForkRef ( focusVisibleRef , sliderRef ) ;
331
331
const handleRef = useForkRef ( ref , handleFocusRef ) ;
332
332
333
- const handleFocus = useCallback (
333
+ const handleFocus = useEventCallback (
334
334
( event : React . FocusEvent < HTMLSpanElement > ) => {
335
335
if ( isFocusVisible ( event ) ) {
336
336
setFocusVisible ( true ) ;
337
337
}
338
- } ,
339
- [ isFocusVisible ]
338
+ }
340
339
) ;
341
340
342
- const handleBlur = useCallback ( ( ) => {
341
+ const handleBlur = useEventCallback ( ( ) => {
343
342
if ( focusVisible !== false ) {
344
343
setFocusVisible ( false ) ;
345
344
onBlurVisible ( ) ;
346
345
}
347
- } , [ focusVisible , onBlurVisible ] ) ;
346
+ } ) ;
348
347
349
348
const touchId = useRef < number > ( ) ;
350
349
@@ -363,7 +362,7 @@ const Slider = forwardRef<HTMLDivElement, SliderProps>(
363
362
[ marksProp , max , min , step ]
364
363
) ;
365
364
366
- const handleKeyDown = useCallback (
365
+ const handleKeyDown = useEventCallback (
367
366
( event : React . KeyboardEvent < HTMLSpanElement > ) => {
368
367
const tenPercents = ( max - min ) / 10 ;
369
368
const marksValues = marks . map ( mark => mark . value ) ;
@@ -422,17 +421,7 @@ const Slider = forwardRef<HTMLDivElement, SliderProps>(
422
421
423
422
onChange ?.( event , newValue ) ;
424
423
onChangeCommitted ?.( event , newValue ) ;
425
- } ,
426
- [
427
- marks ,
428
- max ,
429
- min ,
430
- onChange ,
431
- onChangeCommitted ,
432
- setValueState ,
433
- step ,
434
- valueDerived
435
- ]
424
+ }
436
425
) ;
437
426
438
427
const getNewValue = useCallback (
@@ -464,7 +453,7 @@ const Slider = forwardRef<HTMLDivElement, SliderProps>(
464
453
[ marks , max , min , step , vertical ]
465
454
) ;
466
455
467
- const handleTouchMove = useCallback (
456
+ const handleTouchMove = useEventCallback (
468
457
( event : MouseEvent | TouchEvent ) => {
469
458
const finger = trackFinger ( event , touchId . current ) ;
470
459
@@ -478,11 +467,10 @@ const Slider = forwardRef<HTMLDivElement, SliderProps>(
478
467
setFocusVisible ( true ) ;
479
468
480
469
onChange ?.( event , newValue ) ;
481
- } ,
482
- [ getNewValue , onChange , setValueState ]
470
+ }
483
471
) ;
484
472
485
- const handleTouchEnd = useCallback (
473
+ const handleTouchEnd = useEventCallback (
486
474
( event : MouseEvent | TouchEvent ) => {
487
475
const finger = trackFinger ( event , touchId . current ) ;
488
476
@@ -501,11 +489,10 @@ const Slider = forwardRef<HTMLDivElement, SliderProps>(
501
489
doc . removeEventListener ( 'mouseup' , handleTouchEnd ) ;
502
490
doc . removeEventListener ( 'touchmove' , handleTouchMove ) ;
503
491
doc . removeEventListener ( 'touchend' , handleTouchEnd ) ;
504
- } ,
505
- [ getNewValue , handleTouchMove , onChangeCommitted ]
492
+ }
506
493
) ;
507
494
508
- const handleMouseDown = useCallback (
495
+ const handleMouseDown = useEventCallback (
509
496
( event : React . MouseEvent < HTMLDivElement > ) => {
510
497
// TODO should we also pass event together with new value to callbacks? (same thing with other input components)
511
498
onMouseDown ?.( event ) ;
@@ -524,43 +511,32 @@ const Slider = forwardRef<HTMLDivElement, SliderProps>(
524
511
const doc = ownerDocument ( sliderRef . current ) ;
525
512
doc . addEventListener ( 'mousemove' , handleTouchMove ) ;
526
513
doc . addEventListener ( 'mouseup' , handleTouchEnd ) ;
527
- } ,
528
- [
529
- getNewValue ,
530
- handleTouchEnd ,
531
- handleTouchMove ,
532
- onChange ,
533
- onMouseDown ,
534
- setValueState
535
- ]
514
+ }
536
515
) ;
537
516
538
- const handleTouchStart = useCallback (
539
- ( event : TouchEvent ) => {
540
- // Workaround as Safari has partial support for touchAction: 'none'.
541
- event . preventDefault ( ) ;
542
- const touch = event . changedTouches [ 0 ] ;
543
- if ( touch != null ) {
544
- // A number that uniquely identifies the current finger in the touch session.
545
- touchId . current = touch . identifier ;
546
- }
517
+ const handleTouchStart = useEventCallback ( ( event : TouchEvent ) => {
518
+ // Workaround as Safari has partial support for touchAction: 'none'.
519
+ event . preventDefault ( ) ;
520
+ const touch = event . changedTouches [ 0 ] ;
521
+ if ( touch != null ) {
522
+ // A number that uniquely identifies the current finger in the touch session.
523
+ touchId . current = touch . identifier ;
524
+ }
547
525
548
- thumbRef . current ?. focus ( ) ;
549
- setFocusVisible ( true ) ;
526
+ thumbRef . current ?. focus ( ) ;
527
+ setFocusVisible ( true ) ;
550
528
551
- const finger = trackFinger ( event , touchId . current ) ;
552
- if ( finger ) {
553
- const newValue = getNewValue ( finger ) ;
554
- setValueState ( newValue ) ;
555
- onChange ?.( event , newValue ) ;
556
- }
529
+ const finger = trackFinger ( event , touchId . current ) ;
530
+ if ( finger ) {
531
+ const newValue = getNewValue ( finger ) ;
532
+ setValueState ( newValue ) ;
533
+ onChange ?.( event , newValue ) ;
534
+ }
557
535
558
- const doc = ownerDocument ( sliderRef . current ) ;
559
- doc . addEventListener ( 'touchmove' , handleTouchMove ) ;
560
- doc . addEventListener ( 'touchend' , handleTouchEnd ) ;
561
- } ,
562
- [ getNewValue , handleTouchEnd , handleTouchMove , onChange , setValueState ]
563
- ) ;
536
+ const doc = ownerDocument ( sliderRef . current ) ;
537
+ doc . addEventListener ( 'touchmove' , handleTouchMove ) ;
538
+ doc . addEventListener ( 'touchend' , handleTouchEnd ) ;
539
+ } ) ;
564
540
565
541
useEffect ( ( ) => {
566
542
const { current : slider } = sliderRef ;
0 commit comments