Files
PenaltyTracker/web/force-password.js

52 lines
1.8 KiB
JavaScript

(async function () {
const root = document.getElementById("app");
const user = await bootstrapAuth({ requireAuth: true, onlyIfMustChange: true });
if (!user) return;
const pw1 = el("input", { type: "password", autocomplete: "new-password" });
const pw2 = el("input", { type: "password", autocomplete: "new-password" });
const err = el("div", { class: "muted", style: { color: "var(--danger)", display: "none" } });
const logoutBtn = el("button", { class: "ghost", onclick: async () => {
try { await API.logout(); } catch (_) {}
navigate("login");
} }, t("logout"));
async function submit(e) {
e.preventDefault();
err.style.display = "none";
if (pw1.value.length < 8) {
err.textContent = t("password_too_short");
err.style.display = "block";
return;
}
if (pw1.value !== pw2.value) {
err.textContent = t("passwords_dont_match");
err.style.display = "block";
return;
}
try {
const u = await API.updateMe({ password: pw1.value });
if (u && !u.must_change_password) navigate("competitions");
} catch (e) {
err.textContent = (e.data && e.data.error) || e.message || "error";
err.style.display = "block";
}
}
const form = el("form", { onsubmit: submit, class: "col" },
el("h1", null, t("change_password")),
el("p", { class: "muted" }, t("force_password_explain")),
el("div", { class: "field" }, el("label", null, t("new_password")), pw1),
el("div", { class: "field" }, el("label", null, t("repeat_password")), pw2),
err,
el("div", { class: "row", style: { justifyContent: "space-between", marginTop: "0.5rem" } },
logoutBtn,
el("button", { type: "submit", class: "primary" }, t("save")),
),
);
root.appendChild(el("div", { class: "login-wrap" }, el("div", { class: "login-box" }, form)));
pw1.focus();
})();