1
0
Fork 0
VaultUI/src/pages/TOTP/NewTOTP.ts

117 lines
3.2 KiB
TypeScript

import { Margin } from "../../elements/Margin";
import { MarginInline } from "../../elements/MarginInline";
import { Page } from "../../PageSystem/Page";
import { SecretTitleElement } from "../../elements/SecretTitleElement";
import { addNewTOTP } from "../../api/totp/addNewTOTP";
import { makeElement } from "../../htmlUtils";
import { setErrorText } from "../../pageUtils";
import i18next from "i18next";
function replaceAll(str: string, replace: string, replaceWith: string): string {
return str.replace(new RegExp(replace, "g"), replaceWith);
}
function removeDashSpaces(str: string): string {
str = replaceAll(str, "-", "");
str = replaceAll(str, " ", "");
return str;
}
export class NewTOTPPage extends Page {
constructor() {
super();
}
async goBack(): Promise<void> {
await this.router.changePage("TOTP");
}
async render(): Promise<void> {
const totpForm = makeElement({
tag: "form",
children: [
Margin(
makeElement({
tag: "input",
class: ["uk-input", "uk-form-width-medium"],
attributes: {
required: "true",
type: "text",
placeholder: i18next.t("totp_new_name_text"),
name: "name",
},
}),
),
makeElement({
tag: "p",
text: i18next.t("totp_new_info"),
}),
Margin(
makeElement({
tag: "input",
class: ["uk-input", "uk-form-width-medium"],
attributes: {
type: "text",
placeholder: i18next.t("totp_new_uri_input"),
name: "uri",
},
}),
),
Margin(
makeElement({
tag: "input",
class: ["uk-input", "uk-form-width-medium"],
attributes: {
type: "text",
placeholder: i18next.t("totp_new_key_input"),
name: "key",
},
}),
),
makeElement({
tag: "p",
id: "errorText",
class: "uk-text-danger",
}),
MarginInline(
makeElement({
tag: "button",
class: ["uk-button", "uk-button-primary"],
text: i18next.t("totp_new_add_btn"),
attributes: {
type: "submit",
},
}),
),
],
}) as HTMLFormElement;
await this.router.setPageContent(totpForm);
totpForm.addEventListener("submit", async (e) => {
e.preventDefault();
const formData = new FormData(totpForm);
const parms = {
url: formData.get("uri") as string,
key: removeDashSpaces(formData.get("key") as string).toUpperCase(),
name: formData.get("name") as string,
generate: false,
};
try {
await addNewTOTP(this.state.currentBaseMount, parms);
await this.router.changePage("TOTP");
} catch (e: unknown) {
const error = e as Error;
setErrorText(`API Error: ${error.message}`);
}
});
}
async getPageTitle(): Promise<Element | string> {
return await SecretTitleElement(this.router, i18next.t("totp_new_suffix"));
}
get name(): string {
return i18next.t("totp_new_title");
}
}