const State = { NoState: 0, InUseOtherUser: 1, NeedsLogin: 2, NeedsMachineAuth: 3, Stopped: 4, Starting: 5, Running: 6, }; export const createUi = (parent, {upCb,downCb,loginCb,logoutCb}) => { const html = ` `; const templ = document.createElement("template"); templ.innerHTML = html; parent.prepend(templ.content); const overlay = parent.querySelector("#networkModalOverlay"); const form = parent.querySelector("#networkModalForm"); const stateDiv = parent.querySelector("#networkModalState"); const actionDiv = parent.querySelector("#networkModalAction"); const peersDiv = parent.querySelector("#networkModalPeers"); const getSettings = () => { const str = window.localStorage["networkSettings"] || "{}"; const v = JSON.parse(str); return v; }; const setSetting = (settings) => { for (const k of Object.keys(settings)) { if (settings[k] === "") settings[k] = undefined; } window.localStorage["networkSettings"] = JSON.stringify(settings); } const populate = () => { const settings = getSettings(); form.querySelector("#controlUrl").value = settings.controlUrl || ""; form.querySelector("#exitNode").value = settings.exitNodeIp || ""; form.querySelector("#dns").value = settings.dnsIp || ""; }; populate(); const showModal = () => { overlay.style.display = "flex"; }; const hideModal = () => { overlay.style.display = "none"; }; overlay.onclick = (e) => { if (e.target === e.currentTarget) hideModal(); }; form.onsubmit = (e) => { e.preventDefault(); const settings = { controlUrl: form.elements["controlUrl"].value, exitNodeIp: form.elements["exitNode"].value, dnsIp: form.elements["dns"].value, }; setSetting(settings); }; const updateState = (state) => { switch(state) { case State.NeedsLogin: { loginCb(); break; } case State.Running: { const settings = getSettings(); settings.wantsRunning = true; setSetting(settings); stateDiv.innerHTML = "Running"; const action = document.createElement("button"); action.textContent = "Stop"; action.onclick = () => { downCb(); action.disabled = true; } actionDiv.innerHTML = ""; actionDiv.appendChild(action); break; } case State.Starting: { stateDiv.innerHTML = "Starting"; actionDiv.innerHTML = ""; break; } case State.Stopped: { const settings = getSettings(); settings.wantsRunning = false; setSetting(settings); stateDiv.innerHTML = "Stopped"; const actionLogout = document.createElement("button"); const actionStart = document.createElement("button"); actionStart.textContent = "Start"; actionStart.onclick = () => { const settings = getSettings(); upCb(settings); actionStart.disabled = true; actionLogout.disabled = true; } actionLogout.textContent = "Logout"; actionLogout.onclick = () => { logoutCb(); actionStart.disabled = true; actionLogout.disabled = true; } actionDiv.innerHTML = ""; actionDiv.appendChild(actionStart); actionDiv.appendChild(actionLogout); break; } case State.NoState: { stateDiv.innerHTML = "Not Started"; const action = document.createElement("button"); action.textContent = "Start"; action.onclick = () => { const settings = getSettings(); upCb(settings); action.disabled = true; } actionDiv.innerHTML = ""; actionDiv.appendChild(action); setTimeout(()=> { const settings = getSettings(); if (settings.wantsRunning) { upCb(settings); action.disabled = true; return; } },0); break; } default: { console.log(state); stateDiv.innerHTML = "Loading"; actionDiv.innerHTML = ""; break; } } }; const setLoginUrl = (login) => { console.log("login url:",login); stateDiv.innerHTML = "Need Login"; const action = document.createElement("button"); action.textContent = "Login"; action.onclick = () => { window.open(login, "_blank"); } actionDiv.innerHTML = ""; actionDiv.appendChild(action); }; const updatePeers = (map) => { const myIP = map.self.addresses[0]; let peers = `self -> ${myIP}
`; for (let p of map.peers) { peers = `${peers}${p.name.split(".")[0]} -> ${p.addresses[0]}
`; } peersDiv.innerHTML = peers; }; return { showModal, updateState, updatePeers, setLoginUrl, getSettings, } }