Skip to content

Commit 907e8d1

Browse files
committed
Rewrite the lot of code
1 parent fa153b1 commit 907e8d1

File tree

12 files changed

+417
-1004
lines changed

12 files changed

+417
-1004
lines changed

.eslintrc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
"@typescript-eslint/explicit-function-return-type": "off",
3131
"@typescript-eslint/explicit-member-accessibility": "off",
3232
"@typescript-eslint/no-object-literal-type-assertion": "off",
33+
"@typescript-eslint/no-use-before-define": "off",
3334
"import/order": "warn"
3435
},
3536
"settings": {

example/src/components/CroppersWizard.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,6 @@ export const CroppersWizard: FC = () => {
261261
key={'fixed-cropper'}
262262
className={'croppers-wizard__cropper'}
263263
src={src}
264-
stencilProps={stencilProps}
265264
minHeight={minHeight}
266265
minWidth={minWidth}
267266
maxWidth={maxWidth}

example/src/components/croppers/DefaultCropper/components/Navigation.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import React, { FC, useLayoutEffect, useMemo, useState } from 'react';
2-
import { CropperMethodOptions } from 'react-advanced-cropper';
1+
import React, { FC } from 'react';
32
import cn from 'classnames';
43
import { FlipHorizontalIcon } from '../../../icons/FlipHorizontalIcon';
54
import { RotateRightIcon } from '../../../icons/RotateRightIcon';

src/components/AbstractCropper.tsx

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,15 @@ import { useUpdateEffect } from '../hooks/useUpdateEffect';
3232
import { useStateWithCallback } from '../hooks/useStateWithCallback';
3333
import { AbstractCropperStateCallbacks, AbstractCropperStateParameters } from '../hooks/useAbstractCropperState';
3434
import { createCropper } from '../service/cropper';
35-
import { useStencil } from '../hooks/useStencil';
3635
import { StretchableBoundary, StretchableBoundaryMethods } from './service/StretchableBoundary';
3736
import { CropperWrapper } from './service/CropperWrapper';
3837
import { CropperBackgroundImage } from './service/CropperBackgroundImage';
3938
import { CropperCanvas, CropperCanvasMethods } from './service/CropperCanvas';
4039
import { RectangleStencil } from './stencils/RectangleStencil';
4140
import { CropperBackgroundWrapper } from './service/CropperBackgroundWrapper';
4241
import './AbstractCropper.scss';
42+
import { getAspectRatio } from '../../../Advanced Cropper/dist/service';
43+
import { useDelayedCallback } from '../hooks/useDelayedCallback';
4344

4445
export type AbstractCropperSettingsProp<Settings extends CropperStateSettings> = CropperStateSettingsProp<Settings>;
4546

@@ -51,8 +52,6 @@ export interface AbstractCropperRef<Settings extends AbstractCropperSettings = A
5152
setCoordinates: CropperStateHook['setCoordinates'];
5253
setState: CropperStateHook['setState'];
5354
setImage: (image: CropperImage) => void;
54-
setStencilOptions: (options: StencilOptions) => void;
55-
getStencilOptions: () => StencilOptions;
5655
flipImage: CropperStateHook['flipImage'];
5756
zoomImage: CropperStateHook['zoomImage'];
5857
rotateImage: CropperStateHook['rotateImage'];
@@ -141,21 +140,23 @@ const AbstractCropperComponent = <Settings extends AbstractCropperSettings = Abs
141140
...parameters
142141
} = props;
143142

143+
const stencilRef = useRef<StencilComponent>(null);
144144
const imageRef = useRef<HTMLImageElement | HTMLCanvasElement>(null);
145145
const boundaryRef = useRef<StretchableBoundaryMethods>(null);
146146
const canvasRef = useRef<CropperCanvasMethods>(null);
147147
const cropperRef = useRef<AbstractCropperRef<Settings>>(null);
148148

149-
const stencil = useStencil(stencilComponent);
150-
151149
const cropper = useCropperState({
152150
...parameters,
153151
getInstance() {
154152
return cropperRef.current;
155153
},
156154
settings: {
157155
...settings,
158-
...stencilConstraints(settings, stencil.options),
156+
...stencilConstraints(settings, {
157+
...stencilProps,
158+
...stencilRef.current,
159+
}),
159160
},
160161
});
161162

@@ -194,8 +195,12 @@ const AbstractCropperComponent = <Settings extends AbstractCropperSettings = Abs
194195
const refreshCropper = () => {
195196
boundaryRef.current?.stretchTo(image).then((boundary) => {
196197
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();
199204
} else {
200205
cropper.reset(boundary, image);
201206
}
@@ -213,8 +218,9 @@ const AbstractCropperComponent = <Settings extends AbstractCropperSettings = Abs
213218
refreshCropper();
214219
},
215220
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);
218224
} else {
219225
return null;
220226
}
@@ -225,16 +231,11 @@ const AbstractCropperComponent = <Settings extends AbstractCropperSettings = Abs
225231
setImage: (image: CropperImage) => {
226232
setCurrentImage(image);
227233
},
228-
getStencilOptions: () => {
229-
return stencil.options;
230-
},
231-
setStencilOptions: (options: StencilOptions) => {
232-
stencil.setOptions(options);
233-
},
234234
reconcileState: cropper.reconcileState,
235235
moveCoordinates: cropper.moveCoordinates,
236236
moveCoordinatesEnd: cropper.moveCoordinatesEnd,
237237
resizeCoordinates: cropper.resizeCoordinates,
238+
clear: cropper.clear,
238239
resizeCoordinatesEnd: cropper.resizeCoordinatesEnd,
239240
moveImage: cropper.moveImage,
240241
flipImage: cropper.flipImage,
@@ -257,17 +258,13 @@ const AbstractCropperComponent = <Settings extends AbstractCropperSettings = Abs
257258
refreshCropper();
258259
});
259260

260-
useUpdateEffect(() => {
261-
cropper.reconcileState();
262-
}, [stencil.options]);
263-
264261
useUpdateEffect(() => {
265262
resetCropper();
266263
}, [image]);
267264

268265
useImperativeHandle(mergeRefs([ref, cropperRef]), () => cropperInterface);
269266

270-
const StencilComponent = stencil.component;
267+
const StencilComponent = stencilComponent;
271268

272269
const WrapperComponent = wrapperComponent;
273270

@@ -297,7 +294,7 @@ const AbstractCropperComponent = <Settings extends AbstractCropperSettings = Abs
297294
className={'react-advanced-cropper__background-wrapper'}
298295
>
299296
<div className={cn('react-advanced-cropper__background', backgroundClassName)}>
300-
{cropper.state && (
297+
{cropper.getState() && (
301298
<BackgroundComponent
302299
{...backgroundProps}
303300
ref={imageRef}
@@ -307,7 +304,12 @@ const AbstractCropperComponent = <Settings extends AbstractCropperSettings = Abs
307304
/>
308305
)}
309306
</div>
310-
<StencilComponent {...stencilProps} cropper={cropperInterface} image={currentImage} />
307+
<StencilComponent
308+
{...stencilProps}
309+
ref={stencilRef}
310+
cropper={cropperInterface}
311+
image={currentImage}
312+
/>
311313
</BackgroundWrapperComponent>
312314
{canvas && <CropperCanvas ref={canvasRef} />}
313315
</StretchableBoundary>

0 commit comments

Comments
 (0)