diff options
Diffstat (limited to 'src/main.js')
-rw-r--r-- | src/main.js | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..2b880a2 --- /dev/null +++ b/src/main.js @@ -0,0 +1,229 @@ +// const host = window.location.protocol + "//" + window.location.host; +const server = window.location.protocol + "//" + window.location.hostname + ":8000"; +const host = window.location.protocol + "//" + window.location.host; +const client_id = "POKO Web 0.0" + +async function xhttp_get(url) { + try { + const response = await fetch(url); + if (!response.ok) { + throw new Error(`Response status: ${response.status}`); + } + + try { + return new Response(response.status, await response.clone().json()) + } catch { + return new Response(response.status, await response.text()) + } + } catch (error) { + console.error(error.message); + } +} + +async function xhttp_post(url, body) { + try { + const response = await fetch(url, { + method: "POST", + body: JSON.stringify(body), + headers: { + "Content-Type": "application/json", + }, + }); + + try { + return new Response(response.status, await response.clone().json()) + } catch { + return new Response(response.status, await response.text()) + } + + } catch (error) { + console.error(error.message) + } +} + +class Response { + constructor(status, body) { + this.status = status; + this.body = body; + } +} + +async function register() { + const username = document.getElementById("username").value; + const password = document.getElementById("password").value; + const id = document.getElementById("id").value; + + const url = server + "/user/register/" + var body; + if (id == "") { + body = {"name": username, "password": password} + } else { + body = {"name": username, "password": password, "id": id} + } + const req = await xhttp_post(url, body); + + if (req.status == 201) { + await login(req.body.id, password) + window.location.href = host + } else { + alert(req.status + ": " + req.body) + } +} + +function password_validator() { + const password = document.getElementById("password"); +} + +function login_form() { + const id = document.getElementById("id").value; + const password = document.getElementById("password").value; + + login(id, password) +} + +async function login(id, password) { + const url = server + "/user/login" + const body = {"id": id, "password": password, "clientid": client_id}; + const req = await xhttp_post(url, body); + + if (req.status == 200) { + // Set session cookie + set_session(req.body, id) + window.location.href = host; + } else { + alert(req.status + ": " + req.body) + } +} + +function getCookie(cname) { + let name = cname + "="; + let decodedCookie = decodeURIComponent(document.cookie); + let ca = decodedCookie.split(';'); + for(let i = 0; i <ca.length; i++) { + let c = ca[i]; + while (c.charAt(0) == ' ') { + c = c.substring(1); + } + if (c.indexOf(name) == 0) { + return c.substring(name.length, c.length); + } + } + return ""; +} + +function get_session() { + return getCookie("session") +} +function get_id() { + return getCookie("id") +} +function set_session(session, id) { + document.cookie = "session=" + session + "; path=/;"; + document.cookie = "id=" + id + "; path=/;"; +} +function del_session() { + document.cookie = "session=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; + document.cookie = "id=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; +} + +async function logout() { + const id = get_id(); + const session = get_session(); + + const url = server + "/user/logout" + const body = {"id": id, "session": session}; + const req = await xhttp_post(url, body); + + if (req.status == 200) { + del_session() + window.location.href = host + } else { + alert("Unauthorized") + } +} + +async function has_session() { + const session = get_session(); + const id = get_id(); + + const users = await userlist(); + const content = document.getElementById("content"); + + // If session exists + if (session != "") { + // If ID exists + if (id != "") { + const url = server + "/user/get" + const body = {"id": id, "session": session} + const req = await xhttp_post(url, body); + + if (req.status == 200) { + + const tokens = format_tokovec(req.body.tokovec); + + content.innerHTML = ` + <div id="userinfo"> + <h3>User Info</h3> + <p>Username: ${req.body.name}</p> + <p>ID: ${id}</p> + </div> + <div id="balance"> + <h3>Tokens Balance</h3> + ${tokens} + </div> + <div id="actions"> + <h3>Actions</h3> + <a href="/transfer.html"><button>Transfer</button></a> + <button onclick="logout()">Logout</button> + <button onclick="logout_all()">Logout All //TODO</button> + </div> + <div id="users"> + <h3>Users</h3> + ${users} + </div> + `; + } else if (req.status == 404) { + if (req.body == "Not Authenticated") { + del_session() + } + } + } else { + del_session() + } + } else { + content.innerHTML += users; + } +} + +function format_tokovec(tokovec) { + var out = "" + for (t in tokovec) { + out += ` + <p>${tokovec[t].color}: ${tokovec[t].amount}</p> + ` + } + + return out +} + +async function userlist() { + const url = server + "/user/list" + const req = await xhttp_get(url); + + var out = "" + + try { + if (req.status == 200) { + for (u in req.body) { + const user = req.body[u]; + out += `<p>${user.id} -- ${user.name}` + } + + } else { + return "<p>User list not available</p>" + } + + } catch {} + + return out +}
\ No newline at end of file |