Files
vote-rllhc/static/js/index.js

133 lines
4.6 KiB
JavaScript

Vote = {
plus_player_id: null,
plus_nickname: "",
plus_reason: "",
minus_player_id: null,
minus_nickname: "",
minus_reason: ""
}
let _ = load_page(0)
async function load_page(id) {
if (get_state()) {
confirm_popup();
return;
}
let players = await fetch("data/players").then(r => r.json());
const header = document.createElement("h1");
const buttons = document.createElement("div");
buttons.className = "buttons";
const idlbl = document.createElement("h2");
idlbl.textContent = "Pour qui votes-tu?"
const id_select = document.createElement("select");
const nickname = document.createElement("h2");
nickname.textContent = "As-tu un surnom à lui donner?";
const nickname_input = document.createElement("input");
nickname_input.inputMode = "text";
nickname_input.maxLength = 100;
const reason = document.createElement("h2");
reason.textContent = "Pourquoi votes-tu pour lui?";
const reason_input = document.createElement("textarea");
reason_input.maxLength = 1000;
players.forEach((player) => {
const player_option = document.createElement("option");
player_option.value = player["id"];
player_option.innerText = player["name"];
id_select.appendChild(player_option);
})
if (id) {
id_select.value = Vote.minus_player_id;
nickname_input.value = Vote.minus_nickname;
reason_input.value = Vote.minus_reason;
header.textContent = "Vote -";
let previous = document.createElement("button");
previous.textContent = "Précédent";
previous.addEventListener("click", () => {
Vote.minus_player_id = id_select.value;
Vote.minus_nickname = nickname_input.value;
Vote.minus_reason = reason_input.value;
load_page(0)
});
let submit = document.createElement("button");
submit.textContent = "A Voté";
submit.addEventListener("click", async () => {
if (Vote.plus_id === null || id_select.value === "") {
const popUp = document.createElement("div");
popUp.className = "popup";
const message = document.createElement("h2");
message.textContent = "Tu dois dire pour qui tu vote!";
const page = document.body;
popUp.append(message);
page.append(popUp);
} else {
Vote.minus_player_id = id_select.value;
Vote.minus_nickname = nickname_input.value;
Vote.minus_reason = reason_input.value;
if (await send_vote(Vote)) {
confirm_popup();
save_state();
}
}
})
submit.className = "right";
previous.className = "left";
buttons.append(previous, submit);
} else {
id_select.value = Vote.plus_player_id;
nickname_input.value = Vote.plus_nickname;
reason_input.value = Vote.plus_reason;
header.textContent = "Vote +";
let next = document.createElement("button");
next.innerText = "Suivant";
next.addEventListener("click", () => {
Vote.plus_player_id = id_select.value;
Vote.plus_nickname = nickname_input.value;
Vote.plus_reason = reason_input.value;
load_page(1)
});
next.className = "right";
buttons.appendChild(next);
}
const div = document.getElementById("app");
div.innerHTML = "";
div.append(header, idlbl, id_select, nickname, nickname_input, reason, reason_input, buttons);
}
function confirm_popup() {
const div = document.getElementById("app");
div.innerText = "";
div.className = "confirm";
let success = document.createElement("h1");
success.textContent = "Merci d'avoir voté!"
let sub = document.createElement("h3");
sub.textContent = "Ton vote a bien été prit en compte!";
div.append(success, sub);
}
function save_state() {
// create cookie with expiration the next day.
let date = new Date(Date.now());
date.setDate(date.getDate() + 1);
date.setHours(0, 0, 0, 0);
document.cookie = "hasvoted=true; expires=" + date.toUTCString()
}
function get_state() {
// get the cookie if exists => already voted.
let cookie = document.cookie;
return cookie.includes("hasvoted=true");
}
async function send_vote(vote) {
vote.plus_player_id = parseInt(vote.plus_player_id, 10);
vote.minus_player_id = parseInt(vote.minus_player_id, 10);
let body = JSON.stringify(vote);
let result = await fetch(window.location.href + "post", {method: "POST", body: body}).then(r => r.status);
return result === 200;
}