1
0
mirror of https://github.com/hrfee/jfa-go.git synced 2024-12-28 03:50:10 +00:00

Compare commits

...

2 Commits

Author SHA1 Message Date
b5dea7755b
userpage: add password reset direct link
for #363, adds /my/account/password/reset. Navigate to it to skip
    pressing the "forgot password?" button on the login screen. Works
    with the nice-ish onpopstate override thing I put in setup.ts a
    while ago. Maybe I should make it a module.
2024-08-27 14:56:24 +01:00
848b532b3c
ts/modal: dont close when not open!
closing an already closed modal messed it up. Function returns if the
modal has "block" or "animate-fade-in".
2024-08-27 14:55:04 +01:00
6 changed files with 38 additions and 12 deletions

View File

@ -159,6 +159,7 @@ func (app *appContext) loadRoutes(router *gin.Engine) {
} }
if userPageEnabled { if userPageEnabled {
router.GET(p+"/my/account", app.MyUserPage) router.GET(p+"/my/account", app.MyUserPage)
router.GET(p+"/my/account/password/reset", app.MyUserPage)
router.GET(p+"/my/token/login", app.getUserTokenLogin) router.GET(p+"/my/token/login", app.getUserTokenLogin)
router.GET(p+"/my/token/refresh", app.getUserTokenRefresh) router.GET(p+"/my/token/refresh", app.getUserTokenRefresh)
router.GET(p+"/my/confirm/:jwt", app.ConfirmMyAction) router.GET(p+"/my/confirm/:jwt", app.ConfirmMyAction)

View File

@ -2,6 +2,7 @@ import { Modal } from "../modules/modal.js";
import { toggleLoader, _post } from "../modules/common.js"; import { toggleLoader, _post } from "../modules/common.js";
export class Login { export class Login {
loggedIn: boolean = false;
private _modal: Modal; private _modal: Modal;
private _form: HTMLFormElement; private _form: HTMLFormElement;
private _url: string; private _url: string;
@ -91,6 +92,7 @@ export class Login {
} else { } else {
const data = req.response; const data = req.response;
window.token = data["token"]; window.token = data["token"];
this.loggedIn = true;
if (this._onLogin) { if (this._onLogin) {
this._onLogin(username, password); this._onLogin(username, password);
} }

View File

@ -20,7 +20,9 @@ export class Modal implements Modal {
}); });
} }
} }
close = (event?: Event) => { close = (event?: Event, noDispatch?: boolean) => {
// If we don't check we can mess up a closed modal.
if (!this.modal.classList.contains("block") && !this.modal.classList.contains("animate-fade-in")) return;
if (event) { if (event) {
event.preventDefault(); event.preventDefault();
} }
@ -30,8 +32,8 @@ export class Modal implements Modal {
const listenerFunc = () => { const listenerFunc = () => {
modal.classList.remove('block'); modal.classList.remove('block');
modal.classList.remove('animate-fade-out'); modal.classList.remove('animate-fade-out');
modal.removeEventListener(window.animationEvent, listenerFunc); modal.removeEventListener(window.animationEvent, listenerFunc)
document.dispatchEvent(this.closeEvent); if (!noDispatch) document.dispatchEvent(this.closeEvent);
}; };
this.modal.addEventListener(window.animationEvent, listenerFunc, false); this.modal.addEventListener(window.animationEvent, listenerFunc, false);
} }

View File

@ -525,7 +525,6 @@ const pageNames: string[][] = [];
})(); })();
window.onpopstate = (event: PopStateEvent) => { window.onpopstate = (event: PopStateEvent) => {
console.log("CALLLLLLLL", event);
if (event.state === "welcome") { if (event.state === "welcome") {
cards[0].classList.remove("unfocused"); cards[0].classList.remove("unfocused");
for (let i = 1; i < cards.length; i++) { cards[i].classList.add("unfocused"); } for (let i = 1; i < cards.length; i++) { cards[i].classList.add("unfocused"); }

View File

@ -2,7 +2,7 @@ declare interface Modal {
modal: HTMLElement; modal: HTMLElement;
closeButton: HTMLSpanElement closeButton: HTMLSpanElement
show: () => void; show: () => void;
close: (event?: Event) => void; close: (event?: Event, noDispatch?: boolean) => void;
toggle: () => void; toggle: () => void;
onopen: (f: () => void) => void; onopen: (f: () => void) => void;
onclose: (f: () => void) => void; onclose: (f: () => void) => void;

View File

@ -50,19 +50,37 @@ window.modals = {} as Modals;
if (window.pwrEnabled) { if (window.pwrEnabled) {
window.modals.pwr = new Modal(document.getElementById("modal-pwr"), false); window.modals.pwr = new Modal(document.getElementById("modal-pwr"), false);
window.modals.pwr.onclose = () => { window.modals.pwr.onclose = () => {
window.modals.login.show(); window.history.pushState("", "", window.location.pathname.replace("/password/reset", ""));
}; };
const resetButton = document.getElementById("modal-login-pwr"); const resetButton = document.getElementById("modal-login-pwr");
resetButton.onclick = () => { resetButton.onclick = () => {
window.history.pushState("reset", "", window.location.pathname+"/password/reset");
}
window.onpopstate = (event: PopStateEvent) => {
if ((event.state == "reset" || window.location.pathname.includes("/password/reset")) && window.pwrEnabled) {
const usernameInput = document.getElementById("login-user") as HTMLInputElement; const usernameInput = document.getElementById("login-user") as HTMLInputElement;
const input = document.getElementById("pwr-address") as HTMLInputElement; const input = document.getElementById("pwr-address") as HTMLInputElement;
input.value = usernameInput.value; input.value = usernameInput.value;
window.modals.login.close(); window.modals.login.close();
window.modals.pwr.show(); window.modals.pwr.show();
} else {
window.modals.pwr.close(null, true);
if (!login.loggedIn) login.login("", "");
} }
};
} }
})(); })();
(() => {
const pushState = window.history.pushState;
window.history.pushState = function (data: any, __: string, _: string | URL) {
pushState.apply(window.history, arguments);
let ev = { state: data as string } as PopStateEvent;
window.onpopstate(ev);
};
})();
window.notifications = new notificationBox(document.getElementById('notification-box') as HTMLDivElement, 5); window.notifications = new notificationBox(document.getElementById('notification-box') as HTMLDivElement, 5);
if (window.pwrEnabled && window.linkResetEnabled) { if (window.pwrEnabled && window.linkResetEnabled) {
@ -780,4 +798,8 @@ const generatePermutations = (xs: number[]): [number[], number[]][] => {
login.bindLogout(document.getElementById("logout-button")); login.bindLogout(document.getElementById("logout-button"));
login.login("", ""); (() => {
let data = "";
if (window.location.pathname.endsWith("/password/reset")) data = "reset";
window.history.pushState(data, "", window.location.pathname);
})();