Skip to content

Commit d1f9890

Browse files
committed
fix image cropping for editor uploads + editor embeds
1 parent bc1c469 commit d1f9890

File tree

4 files changed

+191
-88
lines changed

4 files changed

+191
-88
lines changed

resources/js/form/components/fields/upload/Upload.vue

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
}>();
6969
const form = useParentForm();
7070
const transformedImg = ref<string>();
71+
const persistedEditableImg = ref<string>();
7172
const playablePreviewUrl = ref<string>();
7273
const uppyFile = ref<UppyFile<{}, {}>>();
7374
const isEditable = computed(() => {
@@ -131,10 +132,16 @@
131132
});
132133
await onImageTransform(cropper);
133134
cropper.destroy();
134-
} else if(props.persistThumbnailUrl) {
135-
const response = await fetch(preview);
135+
}
136+
if(props.persistThumbnailUrl) {
137+
if(!transformedImg.value) {
138+
const response = await fetch(preview);
139+
const blob = await response.blob();
140+
transformedImg.value = URL.createObjectURL(blob);
141+
}
142+
const response = await fetch(await createThumbnail(uppyFile.value, { width: 1200, height: 1000 }));
136143
const blob = await response.blob();
137-
transformedImg.value = URL.createObjectURL(blob);
144+
persistedEditableImg.value = URL.createObjectURL(blob);
138145
}
139146
} else if(file.type?.startsWith('video/') || file.type?.startsWith('audio/')) {
140147
playablePreviewUrl.value = URL.createObjectURL(file.data);
@@ -154,13 +161,15 @@
154161
...props.value,
155162
...response.body,
156163
thumbnail: transformedImg?.value ?? uppyFile.value.preview,
164+
editable_thumbnail: persistedEditableImg.value,
157165
mime_type: file.type,
158166
size: file.size,
159167
});
160168
emit('success', {
161169
...props.value,
162170
...response.body,
163171
thumbnail: transformedImg?.value ?? uppyFile.value.preview,
172+
editable_thumbnail: persistedEditableImg.value,
164173
mime_type: file.type,
165174
size: file.size,
166175
});
@@ -267,26 +276,27 @@
267276
}
268277
269278
editModalImageUrl.value = data.thumbnail;
270-
271-
await new Promise<void>(resolve => {
272-
const image = new Image();
273-
image.src = data.thumbnail;
274-
image.onload = () => {
275-
editModalCropperData.value = getCropDataFromFilters({
276-
filters: props.value.filters,
277-
imageWidth: image.naturalWidth,
278-
imageHeight: image.naturalHeight,
279-
});
280-
resolve();
281-
}
282-
image.onerror = () => {
283-
editModalImageUrl.value = props.value.thumbnail;
284-
resolve();
285-
}
286-
});
279+
} else if(props.value?.editable_thumbnail) {
280+
editModalImageUrl.value = props.value.editable_thumbnail;
287281
} else if(uppyFile.value) {
288282
editModalImageUrl.value = await createThumbnail(uppyFile.value, { width: 1200, height: 1000 });
289283
}
284+
await new Promise<void>(resolve => {
285+
const image = new Image();
286+
image.src = editModalImageUrl.value;
287+
image.onload = () => {
288+
editModalCropperData.value = getCropDataFromFilters({
289+
filters: props.value.filters,
290+
imageWidth: image.naturalWidth,
291+
imageHeight: image.naturalHeight,
292+
});
293+
resolve();
294+
}
295+
image.onerror = () => {
296+
editModalImageUrl.value = props.value.thumbnail;
297+
resolve();
298+
}
299+
});
290300
}
291301
292302
editModalOpen.value = true;
@@ -352,7 +362,17 @@
352362
if(uppyFile.value) {
353363
uppy.removeFile(uppyFile.value.id);
354364
uppyFile.value = null;
365+
if(transformedImg.value) {
366+
URL.revokeObjectURL(transformedImg.value);
367+
}
368+
if(persistedEditableImg.value) {
369+
URL.revokeObjectURL(playablePreviewUrl.value);
370+
}
371+
if(playablePreviewUrl.value) {
372+
URL.revokeObjectURL(playablePreviewUrl.value);
373+
}
355374
transformedImg.value = null;
375+
persistedEditableImg.value = null;
356376
playablePreviewUrl.value = null;
357377
editModalImageUrl.value = null;
358378
}

resources/js/types/generated.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,7 @@ export type FormUploadFieldValueData = {
626626
mime_type: string;
627627
size: number;
628628
thumbnail: string | null;
629+
editable_thumbnail: string | null;
629630
playable_preview_url: string | null;
630631
uploaded: boolean | null;
631632
transformed: boolean | null;

0 commit comments

Comments
 (0)