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 };