// @ts-ignore const {$, doAfterLoad, footer, header, nav} = window.fwdekker; let csrfToken: string | null = null; function refreshTrackings() { fetch("api.php?action=list-trackings") .then(it => it.json()) .then(response => { $("#trackings tbody").remove(); $("#trackings").append(document.createElement("tbody")); // TODO: Add happy emoji if Hitler is listed const headerRow = document.createElement("tr"); const headerPersonName = document.createElement("th"); headerPersonName.innerText = "Name"; const headerIsDeceased = document.createElement("th"); headerIsDeceased.innerText = "Deceased?"; const headerDelete = document.createElement("th"); headerRow.append(headerPersonName, headerIsDeceased, headerDelete); $("#trackings tbody").append(headerRow); response["message"].forEach((tracking: any) => { const trackingRow = document.createElement("tr"); const trackingPersonName = document.createElement("td"); trackingPersonName.innerText = tracking["person_name"]; const trackingIsDeceased = document.createElement("td"); trackingIsDeceased.innerText = tracking["status"]; const trackingDelete = document.createElement("td"); const trackingDeleteButton = document.createElement("button"); trackingDeleteButton.innerText = "remove"; trackingDeleteButton.addEventListener("click", () => { $("#trackingsError").innerText = ""; fetch("api.php", { method: "post", headers: { "Accept": "application/json", "Content-Type": "application/json", }, body: JSON.stringify({ action: "remove-tracking", token: csrfToken, person_name: tracking["person_name"], }) }) .then(it => it.json()) .then(it => { if (!it["satisfied"]) { $("#trackingsError").innerText = it["message"]; return; } refreshTrackings(); }); }); trackingDelete.append(trackingDeleteButton); trackingRow.append(trackingPersonName, trackingIsDeceased, trackingDelete); $("#trackings tbody").append(trackingRow); }); const createRow = document.createElement("tr"); const createPersonName = document.createElement("td"); const createPersonInput = document.createElement("input"); const createPersonSubmit = document.createElement("button"); createPersonSubmit.innerText = "add"; createPersonSubmit.addEventListener("click", () => { $("#trackingsError").innerText = ""; fetch("api.php", { method: "post", headers: { "Accept": "application/json", "Content-Type": "application/json", }, body: JSON.stringify({ action: "add-tracking", token: csrfToken, person_name: createPersonInput.value, }) }) .then(it => it.json()) .then(it => { if (!it["satisfied"]) { $("#trackingsError").innerText = it["message"]; return; } refreshTrackings(); }); }); createPersonName.append(createPersonInput, createPersonSubmit); const createIsDeceased = document.createElement("td"); const createDelete = document.createElement("td"); createRow.append(createPersonName, createIsDeceased, createDelete); $("#trackings tbody").append(createRow); }); } doAfterLoad(() => { // Initialize template $("#nav").appendChild(nav("/Tools/Death-Notifier/")); $("#header").appendChild(header({ title: "Death Notifier", description: "Get notified when a famous person dies" })); $("#footer").appendChild(footer({ vcsURL: "https://git.fwdekker.com/tools/death-notifier/", version: "v%%VERSION_NUMBER%%" })); $("main").classList.remove("hidden"); // Workflow const loginRow = $("#loginRow"); const trackingRow = $("#trackingRow"); const accountRow = $("#accountRow"); // TODO: Move common code to a Form class or sth... (or actually, wait with that until I have the table thingy // implemented!) $("#loginForm").addEventListener("submit", (event: SubmitEvent) => { event.preventDefault(); $("#loginForm .error").innerText = ""; fetch("api.php", { method: "post", headers: { "Accept": "application/json", "Content-Type": "application/json", }, body: JSON.stringify({ action: "login", // TODO: Deal with tokens in a smarter way. Allow refreshing them! Also remove duplication... token: csrfToken, email: $("#loginForm input[name=email]").value, password: $("#loginForm input[name=password]").value, }) }) .then(it => it.json()) .then(it => { if (!it["satisfied"]) { $("#loginForm .error").innerText = it["message"]; return; } $("#loginForm").reset(); loginRow.classList.add("hidden"); trackingRow.classList.remove("hidden"); accountRow.classList.remove("hidden"); refreshTrackings(); }); // TODO: Add error handling (e.g. HTTP 500) }); $("#registerForm").addEventListener("submit", (event: SubmitEvent) => { event.preventDefault(); $("#registerForm .error").innerText = ""; fetch("api.php", { method: "post", headers: { "Accept": "application/json", "Content-Type": "application/json", }, body: JSON.stringify({ action: "register", token: csrfToken, email: $("#registerForm input[name=email]").value, password: $("#registerForm input[name=password]").value, password_confirm: $("#registerForm input[name=passwordConfirm]").value, }) }) .then(it => it.json()) .then(it => { if (!it["satisfied"]) { $("#registerForm .error").innerText = it["message"]; return; } $("#registerForm").reset(); $("#registerForm .error").innerText = "Account created successfully! You may now log in."; }); }); $("#logoutForm").addEventListener("submit", (event: SubmitEvent) => { event.preventDefault(); $("#logoutForm .error").innerText = ""; fetch("api.php", { method: "post", headers: { "Accept": "application/json", "Content-Type": "application/json", }, body: JSON.stringify({ action: "logout", token: csrfToken, }) }) .then(it => it.json()) .then(it => { csrfToken = it["token"]; if (!it["satisfied"]) { $("#logoutForm .error").innerText = it["message"]; return; } $("#logoutForm").reset(); $("#updateEmailForm").reset(); $("#updatePasswordForm").reset(); $("#updateEmailForm .error").innerText = ""; $("#updatePasswordForm .error").innerText = ""; loginRow.classList.remove("hidden"); trackingRow.classList.add("hidden"); accountRow.classList.add("hidden"); }); }); $("#updateEmailForm").addEventListener("submit", (event: SubmitEvent) => { event.preventDefault(); $("#updateEmailForm .error").innerText = ""; fetch("api.php", { method: "post", headers: { "Accept": "application/json", "Content-Type": "application/json", }, body: JSON.stringify({ action: "update-email", email: $("#updateEmailForm input[name=email]").value, token: csrfToken, }) }) .then(it => it.json()) .then(it => { csrfToken = it["token"]; if (!it["satisfied"]) { $("#updateEmailForm .error").innerText = it["message"]; return; } $("#updateEmailForm").reset(); $("#updateEmailForm .error").innerText = "Updated successfully!"; }); }); $("#updatePasswordForm").addEventListener("submit", (event: SubmitEvent) => { event.preventDefault(); $("#updatePasswordForm .error").innerText = ""; fetch("api.php", { method: "post", headers: { "Accept": "application/json", "Content-Type": "application/json", }, body: JSON.stringify({ action: "update-password", password_old: $("#updatePasswordForm input[name=passwordOld]").value, password_new: $("#updatePasswordForm input[name=passwordNew]").value, password_confirm: $("#updatePasswordForm input[name=passwordConfirm]").value, token: csrfToken, }) }) .then(it => it.json()) .then(it => { csrfToken = it["token"]; if (!it["satisfied"]) { $("#updatePasswordForm .error").innerText = it["message"]; return; } $("#updatePasswordForm").reset(); $("#updatePasswordForm .error").innerText = "Updated successfully!"; }); }); fetch("api.php?action=get-user-data") .then(it => it.json()) .then(it => { csrfToken = it["token"]; // Log out user if they do not exist if (!it["satisfied"]) { loginRow.classList.remove("hidden"); } else { trackingRow.classList.remove("hidden"); accountRow.classList.remove("hidden"); refreshTrackings(); } }); });