/*
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
/>