11import { SyntheticEvent } from "react" ;
2- import { ISpaceDefinition , ISize , ResizeType , ISpaceStore , OnResizeEnd , Type , EndEvent , MoveEvent } from "./core-types" ;
3- import { throttle , coalesce } from "./core-utils" ;
2+ import { ISpaceDefinition , ResizeType , ISpaceStore , OnResizeEnd , EndEvent , MoveEvent } from "./core-types" ;
3+ import { throttle } from "./core-utils" ;
44
55const RESIZE_THROTTLE = 0 ;
66
@@ -9,167 +9,95 @@ export interface IResizeChange {
99 y : number ;
1010}
1111
12- function customSizeHoriz ( space : ISpaceDefinition , adjust : number ) {
13- if ( space . width . size ) {
14- space . width . resized = - adjust ;
15- }
12+ function isHorizontal ( resizeType : ResizeType ) {
13+ return resizeType === ResizeType . Left || resizeType === ResizeType . Right ;
1614}
1715
18- function customSizeVert ( space : ISpaceDefinition , adjust : number ) {
19- if ( space . height . size ) {
20- space . height . resized = - adjust ;
21- }
22- }
16+ type ResizeAdjuster = ( currentX : number , currentY : number ) => void ;
17+
18+ function createAdjuster ( resizeType : ResizeType , space : ISpaceDefinition , originalX : number , originalY : number ) : ResizeAdjuster {
19+ const dimensionToAdjust = ( ( ) => {
20+ if ( resizeType === ResizeType . Left ) {
21+ return space . left ;
22+ } else if ( resizeType === ResizeType . Right ) {
23+ return space . right ;
24+ } else if ( resizeType === ResizeType . Bottom ) {
25+ return space . bottom ;
26+ } else if ( resizeType === ResizeType . Top ) {
27+ return space . top ;
28+ } else {
29+ throw new Error ( "unknown resize type" ) ;
30+ }
31+ } ) ( ) ;
2332
24- function getCustomSizing ( resizeType : ResizeType , space : ISpaceDefinition ) {
25- if ( resizeType === ResizeType . Left ) {
26- return space . type === Type . Positioned ? ( a : number ) => customSizeHoriz ( space , a ) : undefined ;
27- } else if ( resizeType === ResizeType . Right ) {
28- return space . type === Type . Positioned ? ( space . width . size ? undefined : ( a : number ) => customSizeHoriz ( space , a ) ) : undefined ;
29- } else if ( resizeType === ResizeType . Top ) {
30- return space . type === Type . Positioned ? ( a : number ) => customSizeVert ( space , a ) : undefined ;
31- } else if ( resizeType === ResizeType . Bottom ) {
32- return space . type === Type . Positioned ? ( space . height . size ? undefined : ( a : number ) => customSizeVert ( space , a ) ) : undefined ;
33- }
34- throw new Error ( "unknown resize type" ) ;
35- }
33+ const negater = resizeType === ResizeType . Right || resizeType === ResizeType . Bottom ? ( val : number ) => - val : ( val : number ) => val ;
3634
37- function getTargetSize ( resizeType : ResizeType , space : ISpaceDefinition ) {
38- if ( resizeType === ResizeType . Left ) {
39- return space . type === Type . Positioned ? space . left : space . width ;
40- } else if ( resizeType === ResizeType . Right ) {
41- return space . type === Type . Positioned ? ( space . width . size ? space . width : space . right ) : space . width ;
42- } else if ( resizeType === ResizeType . Top ) {
43- return space . type === Type . Positioned ? space . top : space . height ;
44- } else if ( resizeType === ResizeType . Bottom ) {
45- return space . type === Type . Positioned ? ( space . height . size ? space . height : space . bottom ) : space . height ;
46- }
47- throw new Error ( "unknown resize type" ) ;
48- }
35+ const candidateOppositeDimensionToAdjust = isHorizontal ( resizeType ) ? space . width : space . height ;
4936
50- function getResizeType ( resizeType : ResizeType , space : ISpaceDefinition ) {
51- if ( resizeType === ResizeType . Left ) {
52- return ResizeType . Left ;
53- } else if ( resizeType === ResizeType . Right ) {
54- return space . type === Type . Positioned ? ( space . width . size ? ResizeType . Left : ResizeType . Right ) : ResizeType . Right ;
55- } else if ( resizeType === ResizeType . Top ) {
56- return ResizeType . Top ;
57- } else if ( resizeType === ResizeType . Bottom ) {
58- return space . type === Type . Positioned ? ( space . height . size ? ResizeType . Top : ResizeType . Bottom ) : ResizeType . Bottom ;
59- }
60- throw new Error ( "unknown resize type" ) ;
61- }
37+ const offset1 = dimensionToAdjust . resized ;
38+ const offset2 = candidateOppositeDimensionToAdjust . resized ;
6239
63- function getCustomOriginal ( resizeType : ResizeType , space : ISpaceDefinition ) {
64- if ( resizeType === ResizeType . Left ) {
65- return space . width . size ? - space . width . resized : 0 ;
66- } else if ( resizeType === ResizeType . Right ) {
67- return 0 ;
68- } else if ( resizeType === ResizeType . Top ) {
69- return space . height . size ? - space . height . resized : 0 ;
70- } else if ( resizeType === ResizeType . Bottom ) {
71- return 0 ;
72- }
73- throw new Error ( "unknown resize type" ) ;
74- }
40+ // const rect = space.element.getBoundingClientRect();
41+ // const size = isHorizontal(resizeType) ? rect.width : rect.height;
42+ // const minimumAdjust = coalesce(space.minimumSize, 20)! - size + 0;
43+ // const maximumAdjust = space.maximumSize ? space.maximumSize - size + 0 : undefined;
7544
76- export function createResize ( store : ISpaceStore ) {
77- function onResize (
78- space : ISpaceDefinition ,
79- targetSize : ISize ,
80- resizeType : ResizeType ,
81- startSize : number ,
82- originalX : number ,
83- originalY : number ,
84- customOriginal : number ,
85- x : number ,
86- y : number ,
87- minimumAdjust : number ,
88- maximumAdjust : number | undefined ,
89- customAdjust ?: ( adjustment : number ) => void ,
90- ) {
91- let adjustment =
92- startSize +
93- ( resizeType === ResizeType . Left || resizeType === ResizeType . Right
94- ? resizeType === ResizeType . Left
95- ? x - originalX
96- : originalX - x
97- : resizeType === ResizeType . Top
98- ? y - originalY
99- : originalY - y ) ;
100-
101- if ( adjustment < minimumAdjust ) {
102- adjustment = minimumAdjust ;
103- } else {
104- if ( typeof maximumAdjust === "number" ) {
105- if ( adjustment > maximumAdjust ) {
106- adjustment = maximumAdjust ;
107- }
108- }
109- }
45+ return ( currentX : number , currentY : number ) => {
46+ const adjustment = ( isHorizontal ( resizeType ) ? originalX : originalY ) - ( isHorizontal ( resizeType ) ? currentX : currentY ) ;
11047
111- if ( adjustment !== targetSize . resized ) {
112- targetSize . resized = adjustment ;
48+ // if (adjustment < minimumAdjust) {
49+ // adjustment = minimumAdjust;
50+ // } else {
51+ // if (typeof maximumAdjust === "number") {
52+ // if (adjustment > maximumAdjust) {
53+ // adjustment = maximumAdjust;
54+ // }
55+ // }
56+ // }
11357
114- if ( customAdjust ) {
115- customAdjust ( adjustment + customOriginal ) ;
58+ if ( dimensionToAdjust . size !== undefined ) {
59+ dimensionToAdjust . resized = negater ( - adjustment ) + offset1 ;
60+ if ( candidateOppositeDimensionToAdjust . size ) {
61+ candidateOppositeDimensionToAdjust . resized = negater ( adjustment ) + offset2 ;
11662 }
117-
118- store . updateStyles ( space ) ;
63+ } else {
64+ candidateOppositeDimensionToAdjust . resized = negater ( adjustment ) + offset2 ;
11965 }
120- }
66+ } ;
67+ }
12168
69+ export function createResize ( store : ISpaceStore ) {
12270 return {
12371 startResize < T extends SyntheticEvent < HTMLElement > | MouseEvent | TouchEvent > (
12472 e : T ,
125- resizeHandleType : ResizeType ,
73+ resizeType : ResizeType ,
12674 space : ISpaceDefinition ,
12775 endEvent : EndEvent ,
12876 moveEvent : MoveEvent ,
12977 getCoords : ( event : T ) => { x : number ; y : number } ,
13078 onResizeEnd ?: OnResizeEnd ,
13179 ) {
13280 if ( space . onResizeStart ) {
133- const result = space . onResizeStart ( ) ;
81+ const result = space . onResizeStart ( resizeType ) ;
13482 if ( typeof result === "boolean" && ! result ) {
13583 return ;
13684 }
13785 }
13886
13987 const originalCoords = getCoords ( e ) ;
140- const resizeType = getResizeType ( resizeHandleType , space ) ;
141- const customAdjust = getCustomSizing ( resizeHandleType , space ) ;
142- const targetSize = getTargetSize ( resizeHandleType , space ) ;
143- const customOriginal = getCustomOriginal ( resizeHandleType , space ) - targetSize . resized ;
88+ const adjuster = createAdjuster ( resizeType , space , originalCoords . x , originalCoords . y ) ;
14489
14590 space . resizing = true ;
14691 space . updateParent ( ) ;
14792
148- const rect = space . element . getBoundingClientRect ( ) ;
149- const size = resizeType === ResizeType . Left || resizeType === ResizeType . Right ? rect . width : rect . height ;
150- const startSize = targetSize . resized ;
151- const minimumAdjust = coalesce ( space . minimumSize , 20 ) ! - size + targetSize . resized ;
152- const maximumAdjust = space . maximumSize ? space . maximumSize - size + targetSize . resized : undefined ;
153-
15493 let lastX = 0 ;
15594 let lastY = 0 ;
15695 let moved = false ;
15796
158- const resize = ( x : number , y : number ) =>
159- onResize (
160- space ,
161- targetSize ,
162- resizeType ,
163- startSize ,
164- originalCoords . x ,
165- originalCoords . y ,
166- customOriginal ,
167- x ,
168- y ,
169- minimumAdjust ,
170- maximumAdjust ,
171- customAdjust ,
172- ) ;
97+ const resize = ( currentX : number , currentY : number ) => {
98+ adjuster ( currentX , currentY ) ;
99+ store . updateStyles ( space ) ;
100+ } ;
173101
174102 const withPreventDefault = ( e : T ) => {
175103 moved = true ;
@@ -194,10 +122,7 @@ export function createResize(store: ISpaceStore) {
194122 const resizeEnd = onResizeEnd || space . onResizeEnd ;
195123 if ( resizeEnd ) {
196124 const currentRect = space . element . getBoundingClientRect ( ) ;
197- resizeEnd (
198- Math . floor ( resizeType === ResizeType . Left || resizeType === ResizeType . Right ? currentRect . width : currentRect . height ) ,
199- currentRect as DOMRect ,
200- ) ;
125+ resizeEnd ( Math . floor ( isHorizontal ( resizeType ) ? currentRect . width : currentRect . height ) , currentRect as DOMRect , resizeType ) ;
201126 }
202127 } ;
203128
0 commit comments