Skip to content

Commit 33ecc59

Browse files
refactor(ui): editor init
1 parent b57459a commit 33ecc59

File tree

1 file changed

+55
-52
lines changed

1 file changed

+55
-52
lines changed

invokeai/frontend/web/src/features/editImageModal/components/EditorContainer.tsx

Lines changed: 55 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type { CropBox, Editor } from 'features/editImageModal/lib/editor';
55
import { selectAutoAddBoardId } from 'features/gallery/store/gallerySelectors';
66
import React, { useCallback, useEffect, useRef, useState } from 'react';
77
import { useGetImageDTOQuery, useUploadImageMutation } from 'services/api/endpoints/images';
8+
import type { ImageDTO } from 'services/api/types';
89

910
type Props = {
1011
editor: Editor;
@@ -23,12 +24,64 @@ export const EditorContainer = ({ editor, imageName }: Props) => {
2324

2425
const [uploadImage] = useUploadImageMutation({ fixedCacheKey: 'editorContainer' });
2526

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+
2678
useEffect(() => {
2779
const container = containerRef.current;
28-
if (!container) {
80+
if (!container || !imageDTO) {
2981
return;
3082
}
3183
editor.init(container);
84+
setup(imageDTO, container);
3285
const handleResize = () => {
3386
editor.resize(container.clientWidth, container.clientHeight);
3487
};
@@ -37,58 +90,8 @@ export const EditorContainer = ({ editor, imageName }: Props) => {
3790
resizeObserver.observe(container);
3891
return () => {
3992
resizeObserver.disconnect();
40-
editor.destroy();
4193
};
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]);
9295

9396
const handleStartCrop = useCallback(() => {
9497
editor.startCrop();

0 commit comments

Comments
 (0)