Spaces:
Running
Running
File size: 1,457 Bytes
dd87944 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | const MAX_IMAGES = 4;
const MAX_BYTES = 4 * 1024 * 1024;
function readFileAsBase64(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => {
const dataUrl = reader.result;
if (typeof dataUrl !== "string") {
reject(new Error("Lecture image échouée"));
return;
}
const [header, b64] = dataUrl.split(",");
resolve({
preview: dataUrl,
base64: b64,
mediaType: header.match(/data:([^;]+)/)?.[1] || "image/jpeg",
name: file.name,
});
};
reader.onerror = () => reject(reader.error || new Error("Lecture image échouée"));
reader.readAsDataURL(file);
});
}
export async function filesToAttachments(files) {
const list = Array.from(files || []).filter((f) => f.type.startsWith("image/"));
const out = [];
for (const file of list) {
if (file.size > MAX_BYTES) continue;
try {
out.push(await readFileAsBase64(file));
} catch {
/* skip */
}
if (out.length >= MAX_IMAGES) break;
}
return out;
}
export function mergeAttachments(existing, incoming, max = MAX_IMAGES) {
const seen = new Set(existing.map((a) => a.preview));
const merged = [...existing];
for (const item of incoming) {
if (merged.length >= max) break;
if (seen.has(item.preview)) continue;
seen.add(item.preview);
merged.push(item);
}
return merged;
}
export { MAX_IMAGES };
|