Files
arcanechat-android/res/raw/webxdc.js
T
B. Petersen 42143519d7 remove ts fragments from webxdc.js
main reason is, that these annotations cover the code,
making it hard to follow what is going on.

maybe opionionated, however,
in general, .ts is not needed in small projects,
and an additional burden for devs.
2023-09-26 11:29:06 +02:00

121 lines
3.9 KiB
JavaScript

window.webxdc = (() => {
let setUpdateListenerPromise = null
var update_listener = () => {};
var last_serial = 0;
window.__webxdcUpdate = () => {
var updates = JSON.parse(InternalJSApi.getStatusUpdates(last_serial));
updates.forEach((update) => {
update_listener(update);
last_serial = update.serial;
});
if (setUpdateListenerPromise) {
setUpdateListenerPromise()
setUpdateListenerPromise = null
}
};
return {
selfAddr: InternalJSApi.selfAddr(),
selfName: InternalJSApi.selfName(),
setUpdateListener: (cb, serial) => {
last_serial = typeof serial === "undefined" ? 0 : parseInt(serial);
update_listener = cb
var promise = new Promise((res, _rej) => {
setUpdateListenerPromise = res
})
window.__webxdcUpdate();
return promise
},
// deprecated 2022-02-20 all updates are returned through the callback set by setUpdateListener
getAllUpdates: () => {
console.error("deprecated 2022-02-20 all updates are returned through the callback set by setUpdateListener")
return Promise.resolve([]);
},
sendUpdate: (payload, descr) => {
InternalJSApi.sendStatusUpdate(JSON.stringify(payload), descr);
},
sendToChat: async (message) => {
const data = {};
if (!message.file && !message.text) {
return Promise.reject("sendToChat() error: file or text missing");
}
const blobToBase64 = (file) => {
const dataStart = ";base64,";
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => {
let data = reader.result;
resolve(data.slice(data.indexOf(dataStart) + dataStart.length));
};
reader.onerror = () => reject(reader.error);
});
};
if (message.text) {
data.text = message.text;
}
if (message.file) {
let base64content;
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) {
base64content = await blobToBase64(message.file.blob);
} else if (typeof message.file.base64 === "string") {
base64content = message.file.base64;
} else if (typeof message.file.plainText === "string") {
base64content = await blobToBase64(new Blob([message.file.plainText]));
} else {
return Promise.reject("sendToChat() error: none of blob, base64 or plainText set correctly");
}
data.base64 = base64content;
data.name = message.file.name;
}
const errorMsg = InternalJSApi.sendToChat(JSON.stringify(data));
if (errorMsg) {
return Promise.reject(errorMsg);
}
},
importFiles: (filters) => {
var element = document.createElement("input");
element.type = "file";
element.accept = [
...(filters.extensions || []),
...(filters.mimeTypes || []),
].join(",");
element.multiple = filters.multiple || false;
const promise = new Promise((resolve, _reject) => {
element.onchange = (_ev) => {
console.log("element.files", element.files);
const files = Array.from(element.files || []);
document.body.removeChild(element);
resolve(files);
};
});
element.style.display = "none";
document.body.appendChild(element);
element.click();
console.log(element);
return promise;
},
};
})();