فهرست منبع

set sendToChat() accept blob as well as base64

B. Petersen 2 سال پیش
والد
کامیت
85cd917184
1فایلهای تغییر یافته به همراه36 افزوده شده و 7 حذف شده
  1. 36 7
      deltachat-ios/Controller/WebxdcViewController.swift

+ 36 - 7
deltachat-ios/Controller/WebxdcViewController.swift

@@ -121,19 +121,48 @@ class WebxdcViewController: WebViewViewController {
 
             sendToChat: async (message) => {
                 const data = {};
-                if (!message.text && !message.file) {
-                    return Promise.reject("Invalid empty message, at least one of text or file should be provided");
+                /** @type {(file: Blob) => Promise<string>} */
+                const blob_to_base64 = (file) => {
+                  const data_start = ";base64,";
+                  return new Promise((resolve, reject) => {
+                    const reader = new FileReader();
+                    reader.readAsDataURL(file);
+                    reader.onload = () => {
+                      let data = reader.result;
+                      resolve(data.slice(data.indexOf(data_start) + data_start.length));
+                    };
+                    reader.onerror = () => reject(reader.error);
+                  });
+                };
+
+                if (!message.file && !message.text) {
+                  return Promise.reject("sendToChat() error: file or text missing");
                 }
+
                 if (message.text) {
-                    data.text = message.text;
+                  data.text = message.text;
                 }
+
                 if (message.file) {
-                    if (!message.file.name || typeof message.file.base64 !== 'string') {
-                        return Promise.reject("provided file is invalid, you need to set both name and base64 content");
-                    }
+                  if (!message.file.name) {
+                    return Promise.reject("sendToChat() error: file name missing");
+                  }
+                  if (Object.keys(message.file).filter((key) => ["blob", "base64", "plainText"].includes(key)).length > 1) {
+                    return Promise.reject("sendToChat() error: only one of blob, base64 or plainText allowed");
+                  }
+
+                  if (message.file.blob instanceof Blob) {
+                    data.base64 = await blob_to_base64(message.file.blob);
+                  } else if (typeof message.file.base64 === "string") {
                     data.base64 = message.file.base64;
-                    data.name = message.file.name;
+                  } else if (typeof message.file.plainText === "string") {
+                    data.base64 = await blob_to_base64(new Blob([message.file.plainText]));
+                  } else {
+                    return Promise.reject("sendToChat() error: none of blob, base64 or plainText set correctly");
+                  }
+                  data.name = message.file.name;
                 }
+
                 webkit.messageHandlers.sendToChat.postMessage(data);
             }
           };