fix: lỗi hiển thị ở frontend

This commit is contained in:
2026-06-21 21:53:14 +07:00
parent 403c169ddd
commit b1a539235b
40 changed files with 5094 additions and 668 deletions
+71
View File
@@ -0,0 +1,71 @@
/**
* Compresses an image file on the client side using the Canvas API.
* Resizes the image so that its maximum dimension is at most 2048px,
* and encodes it as image/jpeg with a quality of 0.85.
*
* @param file The original image File object.
* @returns A promise that resolves to the compressed File object.
*/
export function compressImage(file: File): Promise<File> {
return new Promise((resolve) => {
// If it's not an image, skip compression and return the original file
if (!file.type.startsWith('image/')) {
return resolve(file);
}
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = (event) => {
const img = new Image();
img.src = event.target?.result as string;
img.onload = () => {
const canvas = document.createElement('canvas');
let width = img.width;
let height = img.height;
const maxDim = 2048;
if (width > maxDim || height > maxDim) {
if (width > height) {
height = Math.round((height * maxDim) / width);
width = maxDim;
} else {
width = Math.round((width * maxDim) / height);
height = maxDim;
}
}
canvas.width = width;
canvas.height = height;
const ctx = canvas.getContext('2d');
if (!ctx) {
return resolve(file);
}
ctx.drawImage(img, 0, 0, width, height);
canvas.toBlob(
(blob) => {
if (blob) {
// Create a new File object with a .jpg extension
const newName = file.name.replace(/\.[^/.]+$/, "") + ".jpg";
const compressedFile = new File([blob], newName, {
type: 'image/jpeg',
lastModified: Date.now()
});
resolve(compressedFile);
} else {
resolve(file);
}
},
'image/jpeg',
0.85
);
};
img.onerror = () => {
resolve(file);
};
};
reader.onerror = () => {
resolve(file);
};
});
}
File diff suppressed because one or more lines are too long