@@ -5,6 +5,7 @@ import type { CropBox, Editor } from 'features/editImageModal/lib/editor';
5
5
import { selectAutoAddBoardId } from 'features/gallery/store/gallerySelectors' ;
6
6
import React , { useCallback , useEffect , useRef , useState } from 'react' ;
7
7
import { useGetImageDTOQuery , useUploadImageMutation } from 'services/api/endpoints/images' ;
8
+ import type { ImageDTO } from 'services/api/types' ;
8
9
9
10
type Props = {
10
11
editor : Editor ;
@@ -23,12 +24,64 @@ export const EditorContainer = ({ editor, imageName }: Props) => {
23
24
24
25
const [ uploadImage ] = useUploadImageMutation ( { fixedCacheKey : 'editorContainer' } ) ;
25
26
27
+ const setup = useCallback (
28
+ async ( imageDTO : ImageDTO , container : HTMLDivElement ) => {
29
+ editor . init ( container ) ;
30
+ editor . setCallbacks ( {
31
+ onZoomChange : ( zoom ) => {
32
+ setZoom ( zoom ) ;
33
+ } ,
34
+ onCropStart : ( ) => {
35
+ setCropInProgress ( true ) ;
36
+ setCropBox ( null ) ;
37
+ } ,
38
+ onCropBoxChange : ( crop ) => {
39
+ setCropBox ( crop ) ;
40
+ } ,
41
+ onCropApply : ( ) => {
42
+ setCropApplied ( true ) ;
43
+ setCropInProgress ( false ) ;
44
+ setCropBox ( null ) ;
45
+ } ,
46
+ onCropReset : ( ) => {
47
+ setCropApplied ( true ) ;
48
+ setCropInProgress ( false ) ;
49
+ setCropBox ( null ) ;
50
+ } ,
51
+ onCropCancel : ( ) => {
52
+ setCropInProgress ( false ) ;
53
+ setCropBox ( null ) ;
54
+ } ,
55
+ onImageLoad : ( ) => {
56
+ // setCropInfo('');
57
+ // setIsCropping(false);
58
+ // setHasCropBbox(false);
59
+ } ,
60
+ } ) ;
61
+ const blob = await convertImageUrlToBlob ( imageDTO . image_url ) ;
62
+ if ( ! blob ) {
63
+ console . error ( 'Failed to convert image to blob' ) ;
64
+ return ;
65
+ }
66
+
67
+ await editor . loadImage ( imageDTO . image_url ) ;
68
+ editor . startCrop ( {
69
+ x : 0 ,
70
+ y : 0 ,
71
+ width : imageDTO . width ,
72
+ height : imageDTO . height ,
73
+ } ) ;
74
+ } ,
75
+ [ editor ]
76
+ ) ;
77
+
26
78
useEffect ( ( ) => {
27
79
const container = containerRef . current ;
28
- if ( ! container ) {
80
+ if ( ! container || ! imageDTO ) {
29
81
return ;
30
82
}
31
83
editor . init ( container ) ;
84
+ setup ( imageDTO , container ) ;
32
85
const handleResize = ( ) => {
33
86
editor . resize ( container . clientWidth , container . clientHeight ) ;
34
87
} ;
@@ -37,58 +90,8 @@ export const EditorContainer = ({ editor, imageName }: Props) => {
37
90
resizeObserver . observe ( container ) ;
38
91
return ( ) => {
39
92
resizeObserver . disconnect ( ) ;
40
- editor . destroy ( ) ;
41
93
} ;
42
- } , [ editor ] ) ;
43
-
44
- const loadImage = useCallback ( async ( ) => {
45
- if ( ! imageDTO ) {
46
- console . error ( 'Image not found' ) ;
47
- return ;
48
- }
49
- const blob = await convertImageUrlToBlob ( imageDTO . image_url ) ;
50
- if ( ! blob ) {
51
- console . error ( 'Failed to convert image to blob' ) ;
52
- return ;
53
- }
54
- await editor . loadImage ( blob ) ;
55
- } , [ editor , imageDTO ] ) ;
56
-
57
- // Setup callbacks
58
- useEffect ( ( ) => {
59
- loadImage ( ) ;
60
- editor . setCallbacks ( {
61
- onZoomChange : ( zoom ) => {
62
- setZoom ( zoom ) ;
63
- } ,
64
- onCropStart : ( ) => {
65
- setCropInProgress ( true ) ;
66
- setCropBox ( null ) ;
67
- } ,
68
- onCropBoxChange : ( crop ) => {
69
- setCropBox ( crop ) ;
70
- } ,
71
- onCropApply : ( ) => {
72
- setCropApplied ( true ) ;
73
- setCropInProgress ( false ) ;
74
- setCropBox ( null ) ;
75
- } ,
76
- onCropReset : ( ) => {
77
- setCropApplied ( true ) ;
78
- setCropInProgress ( false ) ;
79
- setCropBox ( null ) ;
80
- } ,
81
- onCropCancel : ( ) => {
82
- setCropInProgress ( false ) ;
83
- setCropBox ( null ) ;
84
- } ,
85
- onImageLoad : ( ) => {
86
- // setCropInfo('');
87
- // setIsCropping(false);
88
- // setHasCropBbox(false);
89
- } ,
90
- } ) ;
91
- } , [ editor , loadImage ] ) ;
94
+ } , [ editor , imageDTO , setup ] ) ;
92
95
93
96
const handleStartCrop = useCallback ( ( ) => {
94
97
editor . startCrop ( ) ;
0 commit comments