1// Based on GPLv3 code from deltachat-android
2// https://github.com/deltachat/deltachat-android/blob/master/res/raw/webxdc.js
3
4window.webxdc = (() => {
5 let setUpdateListenerPromise = null
6 var update_listener = () => {};
7 var last_serial = 0;
8
9 window.__webxdcUpdate = () => {
10 var updates = JSON.parse(InternalJSApi.getStatusUpdates(last_serial));
11 updates.forEach((update) => {
12 update_listener(update);
13 last_serial = update.serial;
14 });
15 if (setUpdateListenerPromise) {
16 setUpdateListenerPromise();
17 setUpdateListenerPromise = null;
18 }
19 };
20
21 return {
22 selfAddr: InternalJSApi.selfAddr(),
23
24 selfName: InternalJSApi.selfName(),
25
26 setUpdateListener: (cb, serial) => {
27 last_serial = typeof serial === "undefined" ? 0 : parseInt(serial);
28 update_listener = cb;
29 var promise = new Promise((res, _rej) => {
30 setUpdateListenerPromise = res;
31 });
32 window.__webxdcUpdate();
33 return promise;
34 },
35
36 sendUpdate: (payload, descr) => {
37 InternalJSApi.sendStatusUpdate(JSON.stringify(payload), descr);
38 },
39
40 importFiles: (filters) => {
41 var element = document.createElement("input");
42 element.type = "file";
43 element.accept = [
44 ...(filters.extensions || []),
45 ...(filters.mimeTypes || []),
46 ].join(",");
47 element.multiple = filters.multiple || false;
48 const promise = new Promise((resolve, _reject) => {
49 element.onchange = (_ev) => {
50 const files = Array.from(element.files || []);
51 document.body.removeChild(element);
52 resolve(files);
53 };
54 });
55 element.style.display = "none";
56 document.body.appendChild(element);
57 element.click();
58 return promise;
59 },
60 };
61})();