81 lines
2.5 KiB
JavaScript
81 lines
2.5 KiB
JavaScript
import { CopyableInputBox } from "../../elements/CopyableInputBox.js";
|
|
import { DoesNotExistError } from "../../types/internalErrors.js";
|
|
import { Page } from "../../types/Page.js";
|
|
import { changePage, setErrorText, setPageContent, setTitleElement } from "../../pageUtils.js";
|
|
import { getTOTPCode, getTOTPKeys } from "../../api.js";
|
|
import { makeElement } from "../../htmlUtils.js";
|
|
import { pageState } from "../../globalPageState.js";
|
|
import i18next from 'i18next';
|
|
|
|
export class TOTPViewPage extends Page {
|
|
constructor() {
|
|
super();
|
|
this.refreshers = [];
|
|
}
|
|
render() {
|
|
setTitleElement(pageState);
|
|
let totpList = makeElement({ tag: "div" });
|
|
setPageContent(makeElement({
|
|
tag: "div",
|
|
children: [
|
|
makeElement({
|
|
tag: "a",
|
|
text: i18next.t("totp_view_new_btn"),
|
|
onclick: _ => { changePage("NEW_TOTP"); }
|
|
}),
|
|
makeElement({
|
|
tag: "p",
|
|
id: "loadingText",
|
|
text: i18next.t("totp_view_loading"),
|
|
}),
|
|
makeElement({ tag: "br" }),
|
|
makeElement({ tag: "br" }),
|
|
totpList
|
|
]
|
|
}));
|
|
|
|
|
|
getTOTPKeys(pageState.currentBaseMount, pageState.currentSecretPath).then(res => {
|
|
res.forEach(function (totpKeyName) {
|
|
let totpListElement = this.makeTOTPListElement(totpKeyName);
|
|
totpList.appendChild(totpListElement);
|
|
let totpRefresher = async function (totpKeyName, totpListElement) {
|
|
totpListElement.setCode(await getTOTPCode(pageState.currentBaseMount, totpKeyName));
|
|
};
|
|
totpRefresher(totpKeyName, totpListElement);
|
|
this.refreshers.push(setInterval(totpRefresher, 3000, totpKeyName, totpListElement));
|
|
}, this);
|
|
document.getElementById("loadingText").remove();
|
|
}).catch(e => {
|
|
if (e == DoesNotExistError) {
|
|
let loadingText = document.getElementById("loadingText");
|
|
loadingText.innerText = i18next.t("totp_view_empty");
|
|
} else {
|
|
setErrorText(e.message);
|
|
}
|
|
});
|
|
|
|
}
|
|
|
|
cleanup() {
|
|
this.refreshers.forEach(refresher => clearInterval(refresher));
|
|
}
|
|
|
|
makeTOTPListElement(totpKeyName) {
|
|
let totpKeyBox = CopyableInputBox(totpKeyName, false);
|
|
let totpValueBox = CopyableInputBox(i18next.t("totp_view_loading_box"));
|
|
|
|
let gridElement = makeElement({
|
|
tag: "div",
|
|
class: ["uk-grid", "uk-grid-small", "uk-text-expand"],
|
|
children: [totpKeyBox, totpValueBox]
|
|
});
|
|
|
|
gridElement.setCode = totpValueBox.setText;
|
|
|
|
return gridElement;
|
|
}
|
|
get name() {
|
|
return i18next.t("totp_view_title");
|
|
}
|
|
} |