11import * as React from "react" ;
2+ import * as Actions from "./actions" ;
23import { getSelectedDimensions } from "./util" ;
34import FloatingRect from "./FloatingRect" ;
45import useSelector from "./use-selector" ;
6+ import useDispatch from "./use-dispatch" ;
7+ import classNames from "classnames" ;
58
69const Selected : React . FC = ( ) => {
710 const selected = useSelector ( ( state ) => state . selected ) ;
11+ const selectedSize = useSelector ( ( state ) =>
12+ state . selected . size ( state . model . data )
13+ ) ;
814 const dimensions = useSelector (
915 ( state ) =>
1016 selected &&
@@ -16,17 +22,59 @@ const Selected: React.FC = () => {
1622 )
1723 ) ;
1824 const dragging = useSelector ( ( state ) => state . dragging ) ;
19- const hidden = useSelector (
20- ( state ) => state . selected . size ( state . model . data ) < 2
21- ) ;
25+ const autoFilling = useSelector ( ( state ) => state . autoFilling ) ;
26+ const hidden = selectedSize === 0 ;
27+
2228 return (
2329 < FloatingRect
2430 variant = "selected"
2531 dimensions = { dimensions }
2632 dragging = { dragging }
2733 hidden = { hidden }
28- />
34+ className = { classNames ( {
35+ "Spreadsheet__selected-single" : selectedSize === 1 ,
36+ } ) }
37+ autoFilling = { autoFilling }
38+ >
39+ { ! hidden && < AutoFillHandle /> }
40+ </ FloatingRect >
2941 ) ;
3042} ;
3143
3244export default Selected ;
45+
46+ const AutoFillHandle : React . FC = ( ) => {
47+ const dispatch = useDispatch ( ) ;
48+
49+ const autoFillStart = React . useCallback ( ( ) => {
50+ dispatch ( Actions . autoFillStart ( ) ) ;
51+ } , [ dispatch ] ) ;
52+
53+ const autoFillEnd = React . useCallback ( ( ) => {
54+ dispatch ( Actions . autoFillEnd ( ) ) ;
55+ } , [ dispatch ] ) ;
56+
57+ const handleMouseDown = React . useCallback (
58+ ( event : React . MouseEvent ) => {
59+ event . stopPropagation ( ) ;
60+ event . preventDefault ( ) ;
61+
62+ autoFillStart ( ) ;
63+
64+ const handleMouseUp = ( ) => {
65+ autoFillEnd ( ) ;
66+ window . removeEventListener ( "mouseup" , handleMouseUp ) ;
67+ } ;
68+
69+ window . addEventListener ( "mouseup" , handleMouseUp ) ;
70+ } ,
71+ [ autoFillStart , autoFillEnd ]
72+ ) ;
73+
74+ return (
75+ < div
76+ className = "Spreadsheet__auto-fill-handle"
77+ onMouseDown = { handleMouseDown }
78+ />
79+ ) ;
80+ } ;
0 commit comments