/* 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 Christian Blättler */ import { AbsoluteTime, Duration, TalerMerchantApi } from "@gnu-taler/taler-util"; import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { h } from "preact"; import { useCallback, useEffect, useState } from "preact/hooks"; import { useSessionContext } from "../../context/session.js"; import { FormErrors, FormProvider } from "../form/FormProvider.js"; import { Input } from "../form/Input.js"; import { InputDate } from "../form/InputDate.js"; import { InputDuration } from "../form/InputDuration.js"; import { InputSelector } from "../form/InputSelector.js"; import { InputWithAddon } from "../form/InputWithAddon.js"; type Entity = TalerMerchantApi.TokenFamilyCreateRequest; interface Props { onSubscribe: (c?: () => Entity | undefined) => void; initial?: Partial; alreadyExist?: boolean; } export function TokenFamilyForm({ onSubscribe }: Props) { const [value, valueHandler] = useState>({ slug: undefined, name: undefined, description: undefined, description_i18n: {}, kind: TalerMerchantApi.TokenFamilyKind.Discount, duration: Duration.toTalerProtocolDuration(Duration.getForever()), valid_after: AbsoluteTime.toProtocolTimestamp(AbsoluteTime.never()), valid_before: AbsoluteTime.toProtocolTimestamp(AbsoluteTime.never()), }); const { i18n } = useTranslationContext(); const errors: FormErrors = { slug: !value.slug ? i18n.str`Required` : undefined, name: !value.name ? i18n.str`Required` : undefined, description: !value.description ? i18n.str`Required` : undefined, valid_after: !value.valid_after ? undefined : undefined, valid_before: !value.valid_before ? i18n.str`Required` : undefined, duration: !value.duration ? i18n.str`Required` : undefined, kind: !value.kind ? i18n.str`Required` : undefined, }; const hasErrors = Object.keys(errors).some( (k) => (errors as any)[k] !== undefined, ); const submit = useCallback((): Entity | undefined => { // HACK: Think about how this can be done better return value as Entity; }, [value]); useEffect(() => { onSubscribe(hasErrors ? undefined : submit); }, [submit, hasErrors]); const { state } = useSessionContext(); return (
name="token_family" errors={errors} object={value} valueHandler={valueHandler} > name="slug" addonBefore={new URL("tokenfamily/", state.backendUrl.href).href} label={i18n.str`Slug`} tooltip={i18n.str`Token family slug to use in URLs (for internal use only)`} /> name="kind" label={i18n.str`Kind`} tooltip={i18n.str`Token family kind`} values={["discount", "subscription"]} /> 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 />
); }