/* This file is part of GNU Taler (C) 2021-2023 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 Christian Blättler */ import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { h } from "preact"; import { useState } from "preact/hooks"; import * as yup from "yup"; import { MerchantBackend, WithId } from "../../../../declaration.js"; import { TokenFamilyUpdateSchema } from "../../../../schemas/index.js"; import { FormErrors, FormProvider } from "../../../../components/form/FormProvider.js"; import { Input } from "../../../../components/form/Input.js"; import { InputDate } from "../../../../components/form/InputDate.js"; import { InputDuration } from "../../../../components/form/InputDuration.js"; import { AsyncButton } from "../../../../components/exception/AsyncButton.js"; import { Duration, TalerMerchantApi } from "@gnu-taler/taler-util"; type Entity = Omit & { duration: Duration, }; interface Props { onUpdate: (d: TalerMerchantApi.TokenFamilyUpdateRequest) => Promise; onBack?: () => void; tokenFamily: TalerMerchantApi.TokenFamilyUpdateRequest; } function convert(from: TalerMerchantApi.TokenFamilyUpdateRequest) { const { duration, ...rest } = from; const converted = { duration: Duration.fromTalerProtocolDuration(duration), }; return { ...converted, ...rest }; } export function UpdatePage({ onUpdate, onBack, tokenFamily }: Props) { const [value, valueHandler] = useState>(convert(tokenFamily)); let errors: FormErrors = {}; try { TokenFamilyUpdateSchema.validateSync(value, { abortEarly: false, }); } catch (err) { if (err instanceof yup.ValidationError) { const yupErrors = err.inner as yup.ValidationError[]; errors = yupErrors.reduce( (prev, cur) => !cur.path ? prev : { ...prev, [cur.path]: cur.message }, {}, ); } } const hasErrors = Object.keys(errors).some( (k) => (errors as any)[k] !== undefined, ); const submitForm = () => { if (hasErrors) return Promise.reject(); const { duration, ...rest } = value as Required; const result: TalerMerchantApi.TokenFamilyUpdateRequest = { ...rest, duration: Duration.toTalerProtocolDuration(duration), }; return onUpdate(result); } const { i18n } = useTranslationContext(); return (
Token Family: {tokenFamily.name}

name="token_family" errors={errors} object={value} valueHandler={valueHandler} > name="name" inputType="text" label={i18n.str`Name`} tooltip={i18n.str`user-readable token family name`} /> name="description" inputType="multiline" label={i18n.str`Description`} tooltip={i18n.str`token family description for customers`} /> name="valid_after" label={i18n.str`Valid After`} tooltip={i18n.str`token family can issue tokens after this date`} withTimestampSupport /> name="valid_before" label={i18n.str`Valid Before`} tooltip={i18n.str`token family can issue tokens until this date`} withTimestampSupport /> name="duration" label={i18n.str`Duration`} tooltip={i18n.str`validity duration of a issued token`} withForever />
{onBack && ( )} Confirm
); }