/* This file is part of GNU Taler (C) 2021-2024 Taler Systems S.A. GNU Taler is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Taler; see the file COPYING. If not, see */ /** * * @author Sebastian Javier Marchano (sebasjm) */ import { randomRfc3548Base32Key, TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { Fragment, h, VNode } from "preact"; import { useState } from "preact/hooks"; import { AsyncButton } from "../../../../components/exception/AsyncButton.js"; import { FormErrors, FormProvider, } from "../../../../components/form/FormProvider.js"; import { Input } from "../../../../components/form/Input.js"; import { InputSelector } from "../../../../components/form/InputSelector.js"; import { InputWithAddon } from "../../../../components/form/InputWithAddon.js"; type Entity = TalerMerchantApi.OtpDevicePatchDetails & WithId; interface Props { onUpdate: (d: Entity) => Promise; onBack?: () => void; device: Entity; } const algorithms = [0, 1, 2]; const algorithmsNames = ["off", "30s 8d TOTP-SHA1", "30s 8d eTOTP-SHA1"]; export function UpdatePage({ device, onUpdate, onBack }: Props): VNode { const { i18n } = useTranslationContext(); const [state, setState] = useState>(device); const [showKey, setShowKey] = useState(false); const errors: FormErrors = {}; const hasErrors = Object.keys(errors).some( (k) => (errors as any)[k] !== undefined, ); const submitForm = () => { if (hasErrors) return Promise.reject(); return onUpdate(state as any); }; return (
Device: {device.id}

name="otp_device_description" label={i18n.str`Description`} tooltip={i18n.str`Useful to identify the device physically`} /> name="otp_algorithm" label={i18n.str`Verification algorithm`} tooltip={i18n.str`Algorithm to use to verify transaction in offline mode`} values={algorithms} toStr={(v) => algorithmsNames[v]} fromStr={(v) => Number(v)} /> {state.otp_algorithm && state.otp_algorithm > 0 ? ( name="otp_key" label={i18n.str`Device key`} readonly={state.otp_key === undefined} inputType={showKey ? "text" : "password"} help={ state.otp_key === undefined ? "Not modified" : "Be sure to be very hard to guess or use the random generator" } tooltip={i18n.str`Your device need to have exactly the same value`} fromStr={(v) => v.toUpperCase()} addonAfterAction={() => { setShowKey(!showKey); }} addonAfter={ { setShowKey(!showKey); }} > {showKey ? ( ) : ( )} } side={ state.otp_key === undefined ? ( ) : ( ) } /> ) : undefined}{" "}
{onBack && ( )} Confirm
); }