Spaces:
Running
Running
| 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 }; | |