import {Adapter} from "./adapter"; import {Message, Attachment} from "./message" function _(key: string, value: any | null | undefined = undefined): any | null { const x = window; if (value !== undefined) { x[key] = value; } return x[key]; } function $(id: string): HTMLElement | null { return document.getElementById(id); } function main():void { const settings = _("settings", JSON.parse(localStorage.getItem("settings") ?? "{}")); const adapters = _("adapters", []); if (settings != null) { for (let s of settings.adapters ?? []) { let a: Adapter = Adapter.create() switch (s.protocol) { case "nostr": adapters.push(Adapter.toNostr(a, s)); break; case "mastodon": adapters.push(Adapter.toMasto(a, s)); } } if (adapters.length > 0) { _("currentAdapter", 0); // update tabbar and tabcontent with first adapter } } else { console.log("no settings exist for this client"); _("settings", { adapters: [] }); showSettings(); } registerServiceWorker(); }; async function registerServiceWorker() { if ("serviceWorker" in navigator) { try { const registration = await navigator.serviceWorker.register("/serviceWorker.js", { scope: "/", }); if (registration.installing) { console.log("Service worker installing"); } else if (registration.waiting) { console.log("Service worker installed"); } else if (registration.active) { console.log("Service worker active"); } } catch (error) { console.error(`Registration failed with ${error}`); } const registration = await navigator.serviceWorker.ready; (registration as any).sync.register("testdata").then((r:any)=>{console.log("but i will see this!")}); } }; function showSettings():void { // tab bar hidden const tabbar = $("tabbar"); if (tabbar) { tabbar.style.display = "none"; } // tabcontent to show settings ui const tabcontent = $("tabcontent"); const adapters = _("adapters") as Adapter[] ?? []; if (tabcontent) { let html = "

this is our settings dialogue

"; html += ""; html += adapters.reduce((self: string, a: Adapter) => { self += `
  • ${a.nickname}
  • ` return self; }, ""; html += ""; tabcontent.innerHTML = html; } } function addAdapter(): void { const tabcontent = $("tabcontent"); if (tabcontent) { // dropdown for protocol let html = ""; // nostr is the first protocol, so show its options by default html += "
    "; html += " "; html += " "; html += " "; html += "
    "; html += ""; html += ""; tabcontent.innerHTML = html; } } function fillAdapterProtocolOptions(): void { const proto = $("settings_newadapter_protocolselect") as HTMLSelectElement; let html = ""; switch(proto?.options[proto.selectedIndex].value) { case "nostr": html += " "; html += " "; html += " "; break; case "mastodon": html += " "; html += " "; html += " "; break; } const div = $("settings_newadapter_protocoloptions"); if (div) { div.innerHTML = html; } } function saveSettings(): void { const settings = _("settings"); if (settings) { localStorage.setItem("settings", JSON.stringify(settings)); } // tab bar hidden const tabbar = $("tabbar"); if (tabbar) { tabbar.style.display = "block"; } // tabcontent to show settings ui const tabcontent = $("tabcontent"); if (tabcontent) { tabcontent.innerHTML = ""; } } function saveAdapter(): void { let self: any = {}; // get selected adapter protocol const proto = $("settings_newadapter_protocolselect") as HTMLSelectElement; console.log(proto.options[proto.selectedIndex]); const nickname = ($("settings_newadapter_nickname") as HTMLInputElement)?.value ?? "" ; // switch protocol switch (proto.options[proto.selectedIndex].value) { case "nostr": const privkey = ($("settings_newadapter_nostr_privkey") as HTMLInputElement)?.value ?? ""; const relays = ($("settings_newadapter_nostr_default_relays") as HTMLInputElement)?.value ?? ""; self = { nickname: nickname, protocol: "nostr", privkey: privkey, relays: relays.split(",").map(r=>r.trim()) }; break; case "mastodon": const server = ($("settings_newadapter_masto_server") as HTMLInputElement)?.value ?? ""; const apiKey = ($("settings_newadapter_masto_apikey") as HTMLInputElement)?.value ?? ""; self = { nickname: nickname, protocol: "mastodon", server: server, apiKey: apiKey }; break; } const settings = _("settings"); const adapters = _("adapters"); if (settings && adapters) { if (!settings.adapters) { settings.adapters = []; } settings.adapters.push(self); let a: Adapter = Adapter.create(); switch (self.protocol) { case "nostr": adapters.push(Adapter.toNostr(a, self)); break; case "mastodon": adapters.push(Adapter.toMasto(a, self)); break; } localStorage.setItem("settings", JSON.stringify(settings)); showSettings(); } } let _conn: WebSocket | null = null; function connect() { // import the data from the settings const settings = _("settings"); if (settings) { // base64 encode the settings data let subprotocol: string = "["; for (let a of settings.adapters) { subprotocol += JSON.stringify(a) + ","; } subprotocol += "]"; subprotocol = btoa(subprotocol); // open the websocket connection with settings as subprotocol _conn = new WebSocket("/subscribe", subprotocol); _("websocket", _conn); } } _("addAdapter", addAdapter); _("saveAdapter", saveAdapter); _("fillAdapterProtocolOptions", fillAdapterProtocolOptions); _("showSettings", showSettings); _("saveSettings", saveSettings); _("connect", connect); main();