@@ -32,14 +32,15 @@ import { useUpdateEffect } from '../hooks/useUpdateEffect';
32
32
import { useStateWithCallback } from '../hooks/useStateWithCallback' ;
33
33
import { AbstractCropperStateCallbacks , AbstractCropperStateParameters } from '../hooks/useAbstractCropperState' ;
34
34
import { createCropper } from '../service/cropper' ;
35
- import { useStencil } from '../hooks/useStencil' ;
36
35
import { StretchableBoundary , StretchableBoundaryMethods } from './service/StretchableBoundary' ;
37
36
import { CropperWrapper } from './service/CropperWrapper' ;
38
37
import { CropperBackgroundImage } from './service/CropperBackgroundImage' ;
39
38
import { CropperCanvas , CropperCanvasMethods } from './service/CropperCanvas' ;
40
39
import { RectangleStencil } from './stencils/RectangleStencil' ;
41
40
import { CropperBackgroundWrapper } from './service/CropperBackgroundWrapper' ;
42
41
import './AbstractCropper.scss' ;
42
+ import { getAspectRatio } from '../../../Advanced Cropper/dist/service' ;
43
+ import { useDelayedCallback } from '../hooks/useDelayedCallback' ;
43
44
44
45
export type AbstractCropperSettingsProp < Settings extends CropperStateSettings > = CropperStateSettingsProp < Settings > ;
45
46
@@ -51,8 +52,6 @@ export interface AbstractCropperRef<Settings extends AbstractCropperSettings = A
51
52
setCoordinates : CropperStateHook [ 'setCoordinates' ] ;
52
53
setState : CropperStateHook [ 'setState' ] ;
53
54
setImage : ( image : CropperImage ) => void ;
54
- setStencilOptions : ( options : StencilOptions ) => void ;
55
- getStencilOptions : ( ) => StencilOptions ;
56
55
flipImage : CropperStateHook [ 'flipImage' ] ;
57
56
zoomImage : CropperStateHook [ 'zoomImage' ] ;
58
57
rotateImage : CropperStateHook [ 'rotateImage' ] ;
@@ -141,21 +140,23 @@ const AbstractCropperComponent = <Settings extends AbstractCropperSettings = Abs
141
140
...parameters
142
141
} = props ;
143
142
143
+ const stencilRef = useRef < StencilComponent > ( null ) ;
144
144
const imageRef = useRef < HTMLImageElement | HTMLCanvasElement > ( null ) ;
145
145
const boundaryRef = useRef < StretchableBoundaryMethods > ( null ) ;
146
146
const canvasRef = useRef < CropperCanvasMethods > ( null ) ;
147
147
const cropperRef = useRef < AbstractCropperRef < Settings > > ( null ) ;
148
148
149
- const stencil = useStencil ( stencilComponent ) ;
150
-
151
149
const cropper = useCropperState ( {
152
150
...parameters ,
153
151
getInstance ( ) {
154
152
return cropperRef . current ;
155
153
} ,
156
154
settings : {
157
155
...settings ,
158
- ...stencilConstraints ( settings , stencil . options ) ,
156
+ ...stencilConstraints ( settings , {
157
+ ...stencilProps ,
158
+ ...stencilRef . current ,
159
+ } ) ,
159
160
} ,
160
161
} ) ;
161
162
@@ -194,8 +195,12 @@ const AbstractCropperComponent = <Settings extends AbstractCropperSettings = Abs
194
195
const refreshCropper = ( ) => {
195
196
boundaryRef . current ?. stretchTo ( image ) . then ( ( boundary ) => {
196
197
if ( boundary && image ) {
197
- if ( cropper . state ) {
198
- cropper . setBoundary ( boundary ) ;
198
+ const state = cropper . getState ( ) ;
199
+ if ( state ) {
200
+ if ( boundary . width !== state . boundary . width || boundary . height !== state . boundary . height ) {
201
+ cropper . setBoundary ( boundary ) ;
202
+ }
203
+ cropper . reconcileState ( ) ;
199
204
} else {
200
205
cropper . reset ( boundary , image ) ;
201
206
}
@@ -213,8 +218,9 @@ const AbstractCropperComponent = <Settings extends AbstractCropperSettings = Abs
213
218
refreshCropper ( ) ;
214
219
} ,
215
220
getCanvas : ( options ?: DrawOptions ) => {
216
- if ( imageRef . current && canvasRef . current && cropper . state ) {
217
- return canvasRef . current . draw ( cropper . state , imageRef . current , options ) ;
221
+ const state = cropper . getState ( ) ;
222
+ if ( imageRef . current && canvasRef . current && state ) {
223
+ return canvasRef . current . draw ( state , imageRef . current , options ) ;
218
224
} else {
219
225
return null ;
220
226
}
@@ -225,16 +231,11 @@ const AbstractCropperComponent = <Settings extends AbstractCropperSettings = Abs
225
231
setImage : ( image : CropperImage ) => {
226
232
setCurrentImage ( image ) ;
227
233
} ,
228
- getStencilOptions : ( ) => {
229
- return stencil . options ;
230
- } ,
231
- setStencilOptions : ( options : StencilOptions ) => {
232
- stencil . setOptions ( options ) ;
233
- } ,
234
234
reconcileState : cropper . reconcileState ,
235
235
moveCoordinates : cropper . moveCoordinates ,
236
236
moveCoordinatesEnd : cropper . moveCoordinatesEnd ,
237
237
resizeCoordinates : cropper . resizeCoordinates ,
238
+ clear : cropper . clear ,
238
239
resizeCoordinatesEnd : cropper . resizeCoordinatesEnd ,
239
240
moveImage : cropper . moveImage ,
240
241
flipImage : cropper . flipImage ,
@@ -257,17 +258,13 @@ const AbstractCropperComponent = <Settings extends AbstractCropperSettings = Abs
257
258
refreshCropper ( ) ;
258
259
} ) ;
259
260
260
- useUpdateEffect ( ( ) => {
261
- cropper . reconcileState ( ) ;
262
- } , [ stencil . options ] ) ;
263
-
264
261
useUpdateEffect ( ( ) => {
265
262
resetCropper ( ) ;
266
263
} , [ image ] ) ;
267
264
268
265
useImperativeHandle ( mergeRefs ( [ ref , cropperRef ] ) , ( ) => cropperInterface ) ;
269
266
270
- const StencilComponent = stencil . component ;
267
+ const StencilComponent = stencilComponent ;
271
268
272
269
const WrapperComponent = wrapperComponent ;
273
270
@@ -297,7 +294,7 @@ const AbstractCropperComponent = <Settings extends AbstractCropperSettings = Abs
297
294
className = { 'react-advanced-cropper__background-wrapper' }
298
295
>
299
296
< div className = { cn ( 'react-advanced-cropper__background' , backgroundClassName ) } >
300
- { cropper . state && (
297
+ { cropper . getState ( ) && (
301
298
< BackgroundComponent
302
299
{ ...backgroundProps }
303
300
ref = { imageRef }
@@ -307,7 +304,12 @@ const AbstractCropperComponent = <Settings extends AbstractCropperSettings = Abs
307
304
/>
308
305
) }
309
306
</ div >
310
- < StencilComponent { ...stencilProps } cropper = { cropperInterface } image = { currentImage } />
307
+ < StencilComponent
308
+ { ...stencilProps }
309
+ ref = { stencilRef }
310
+ cropper = { cropperInterface }
311
+ image = { currentImage }
312
+ />
311
313
</ BackgroundWrapperComponent >
312
314
{ canvas && < CropperCanvas ref = { canvasRef } /> }
313
315
</ StretchableBoundary >
0 commit comments