webxdc.js

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