diff --git a/src/main/api.php b/src/main/api.php
index 6c64ec8..1e6a1ee 100644
--- a/src/main/api.php
+++ b/src/main/api.php
@@ -35,6 +35,11 @@ if (!file_exists($config["database"]["filename"])) {
// Start session
session_start();
+// Read JSON from POST, if it's there
+if (empty($_POST)) {
+ $_POST = json_decode(file_get_contents("php://input"), associative: true);
+}
+
if (isset($_POST["action"])) {
// Process POST
switch ($_POST["action"]) {
@@ -261,18 +266,29 @@ if (isset($_POST["action"])) {
}
} else if (isset($_GET["action"])) {
// Process GET
- if ($_GET["action"] === "list-trackings") {
- if (!isset($_SESSION["uuid"])) {
- exit("\"not logged in\"");
- }
+ switch ($_GET["action"]) {
+ case "get-user-data":
+ if (!isset($_SESSION["uuid"])) {
+ exit("\"not logged in\"");
+ }
- $db = new Database($config["database"]["filename"], SQLITE3_OPEN_READONLY);
- $trackings = $db->list_trackings($_SESSION["uuid"], $_SESSION["uuid"]);
- $db->close();
+ $db = new Database($config["database"]["filename"], SQLITE3_OPEN_READONLY);
+ $user_data = $db->get_user_by_uuid($_SESSION["uuid"]);
+ $db->close();
- exit(json_encode($trackings));
- } else if ($_GET["action"] === "is-alive") {
- exit(json_encode((new MyMediawiki())->people_are_alive(array("Janelle Monáe", "John Malkovich", "Adolf Hitler"))));
+ exit(json_encode($user_data));
+ case "list-trackings":
+ if (!isset($_SESSION["uuid"])) {
+ exit("\"not logged in\"");
+ }
+
+ $db = new Database($config["database"]["filename"], SQLITE3_OPEN_READONLY);
+ $trackings = $db->list_trackings($_SESSION["uuid"]);
+ $db->close();
+
+ exit(json_encode($trackings));
+ case "is-alive":
+ exit(json_encode((new MyMediawiki())->people_are_alive(array("Janelle Monáe", "John Malkovich", "Adolf Hitler"))));
}
}
diff --git a/src/main/index.php b/src/main/index.php
index 3937010..30b1f96 100644
--- a/src/main/index.php
+++ b/src/main/index.php
@@ -39,107 +39,128 @@ $_SESSION["token"] = bin2hex(random_bytes(32));
diff --git a/src/main/js/Main.ts b/src/main/js/Main.ts
index 1988945..e1dc728 100644
--- a/src/main/js/Main.ts
+++ b/src/main/js/Main.ts
@@ -2,7 +2,14 @@
const {$, doAfterLoad, footer, header, nav} = window.fwdekker;
-doAfterLoad(() => {
+function refreshTrackings() {
+ fetch("api.php?action=list-trackings")
+ .then(it => it.text())
+ .then(it => $("#trackings").innerText = it);
+}
+
+
+doAfterLoad(async () => {
// Initialize template
$("#nav").appendChild(nav("/Tools/Death-Notifier/"));
$("#header").appendChild(header({
@@ -15,7 +22,143 @@ doAfterLoad(() => {
}));
$("main").classList.remove("hidden");
- fetch("api.php?action=list-trackings")
- .then(it => it.text())
- .then(it => $("#trackings").innerText = it);
+ // 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", async () => {
+ $("#loginForm .error").innerText = "";
+
+ const response = await 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: $("#loginForm input[name=token]").value,
+ email: $("#loginForm input[name=email]").value,
+ password: $("#loginForm input[name=password]").value,
+ })
+ }).then(it => it.json());
+
+ if (response !== true) {
+ $("#loginForm .error").innerText = response;
+ return;
+ }
+ $("#loginForm").reset();
+ loginRow.classList.add("hidden");
+ trackingRow.classList.remove("hidden");
+ accountRow.classList.remove("hidden");
+ refreshTrackings();
+ });
+ $("#registerForm").addEventListener("submit", async () => {
+ $("#registerForm .error").innerText = "";
+
+ const response = await fetch("api.php", {
+ method: "post",
+ headers: {
+ "Accept": "application/json",
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ action: "register",
+ token: $("#registerForm input[name=token]").value,
+ email: $("#registerForm input[name=email]").value,
+ password: $("#registerForm input[name=password]").value,
+ password_confirm: $("#registerForm input[name=password_confirm]").value,
+ })
+ }).then(it => it.json());
+
+ if (response !== true) {
+ $("#registerForm .error").innerText = response;
+ return;
+ }
+ $("#registerForm").reset();
+ $("#registerForm .error").innerText = "Account created successfully! You may now log in.";
+ });
+ $("#addTrackingForm").addEventListener("submit", async () => {
+ $("#addTrackingForm .error").innerText = "";
+
+ const response = await fetch("api.php", {
+ method: "post",
+ headers: {
+ "Accept": "application/json",
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ action: "add-tracking",
+ token: $("#addTrackingForm input[name=token]").value,
+ person_name: $("#addTrackingForm input[name=person_name]").value,
+ })
+ }).then(it => it.json());
+
+ if (response !== true) {
+ $("#addTrackingForm .error").innerText = response;
+ return;
+ }
+ $("#addTrackingForm").reset();
+ refreshTrackings();
+ });
+ $("#deleteTrackingForm").addEventListener("submit", async () => {
+ $("#deleteTrackingForm .error").innerText = "";
+
+ const response = await fetch("api.php", {
+ method: "post",
+ headers: {
+ "Accept": "application/json",
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ action: "delete-tracking",
+ token: $("#deleteTrackingForm input[name=token]").value,
+ person_name: $("#deleteTrackingForm input[name=person_name]").value,
+ })
+ }).then(it => it.json());
+
+ if (response !== true) {
+ $("#deleteTrackingForm .error").innerText = response;
+ return;
+ }
+ $("#deleteTrackingForm").reset();
+ refreshTrackings();
+ });
+ $("#logoutForm").addEventListener("submit", async () => {
+ $("#logoutForm .error").innerText = "";
+
+ const response = await fetch("api.php", {
+ method: "post",
+ headers: {
+ "Accept": "application/json",
+ "Content-Type": "application/json",
+ },
+ body: JSON.stringify({
+ action: "logout",
+ token: $("#logoutForm input[name=token]").value,
+ })
+ }).then(it => it.json());
+
+ if (response !== true) {
+ $("#logoutForm .error").innerText = response;
+ return;
+ }
+ $("#logoutForm").reset();
+ loginRow.classList.remove("hidden");
+ trackingRow.classList.add("hidden");
+ accountRow.classList.add("hidden");
+ });
+
+ const userData = await fetch("api.php?action=get-user-data").then(it => it.text());
+ if (userData === "\"not logged in\"") {
+ loginRow.classList.remove("hidden");
+ } else {
+ trackingRow.classList.remove("hidden");
+ accountRow.classList.remove("hidden");
+ refreshTrackings();
+ }
});