szurubooru/client/js/controllers/password_reset_controller.js

73 lines
2.4 KiB
JavaScript

"use strict";
const router = require("../router.js");
const api = require("../api.js");
const uri = require("../util/uri.js");
const topNavigation = require("../models/top_navigation.js");
const PasswordResetView = require("../views/password_reset_view.js");
class PasswordResetController {
constructor() {
topNavigation.activate("login");
topNavigation.setTitle("Password reminder");
this._passwordResetView = new PasswordResetView();
this._passwordResetView.addEventListener("submit", (e) =>
this._evtReset(e)
);
}
_evtReset(e) {
this._passwordResetView.clearMessages();
this._passwordResetView.disableForm();
api.forget();
api.logout();
api.get(
uri.formatApiLink("password-reset", e.detail.userNameOrEmail)
).then(
() => {
this._passwordResetView.showSuccess(
"E-mail has been sent. To finish the procedure, " +
"please click the link it contains."
);
},
(error) => {
this._passwordResetView.showError(error.message);
this._passwordResetView.enableForm();
}
);
}
}
class PasswordResetFinishController {
constructor(name, token) {
api.forget();
api.logout();
let password = null;
api.post(uri.formatApiLink("password-reset", name), { token: token })
.then((response) => {
password = response.password;
return api.login(name, password, false);
})
.then(
() => {
const ctx = router.show(uri.formatClientLink());
ctx.controller.showSuccess("New password: " + password);
},
(error) => {
const ctx = router.show(uri.formatClientLink());
ctx.controller.showError(error.message);
}
);
}
}
module.exports = (router) => {
router.enter(["password-reset"], (ctx, next) => {
ctx.controller = new PasswordResetController();
});
router.enter(["password-reset", ":descriptor"], (ctx, next) => {
const [name, token] = ctx.parameters.descriptor.split(":", 2);
ctx.controller = new PasswordResetFinishController(name, token);
});
};