/*
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
*/
import { useTranslationContext } from "@gnu-taler/web-util/lib/index.browser";
import { Fragment, h, VNode } from "preact";
import { useCallback, useEffect, useState } from "preact/hooks";
import * as yup from "yup";
import { MerchantBackend } from "../../declaration.js";
import { useListener } from "../../hooks/listener.js";
import { NonInventoryProductSchema as schema } from "../../schemas/index.js";
import { FormErrors, FormProvider } from "../form/FormProvider.js";
import { Input } from "../form/Input.js";
import { InputCurrency } from "../form/InputCurrency.js";
import { InputImage } from "../form/InputImage.js";
import { InputNumber } from "../form/InputNumber.js";
import { InputTaxes } from "../form/InputTaxes.js";
type Entity = MerchantBackend.Product;
interface Props {
onAddProduct: (p: Entity) => Promise;
productToEdit?: Entity;
}
export function NonInventoryProductFrom({
productToEdit,
onAddProduct,
}: Props): VNode {
const [showCreateProduct, setShowCreateProduct] = useState(false);
const isEditing = !!productToEdit;
useEffect(() => {
setShowCreateProduct(isEditing);
}, [isEditing]);
const [submitForm, addFormSubmitter] = useListener<
Partial | undefined
>((result) => {
if (result) {
setShowCreateProduct(false);
return onAddProduct({
quantity: result.quantity || 0,
taxes: result.taxes || [],
description: result.description || "",
image: result.image || "",
price: result.price || "",
unit: result.unit || "",
});
}
return Promise.resolve();
});
const { i18n } = useTranslationContext();
return (
name="product"
errors={errors}
object={value}
valueHandler={valueHandler}
>
name="image"
label={i18n.str`Image`}
tooltip={i18n.str`photo of the product`}
/>
name="description"
inputType="multiline"
label={i18n.str`Description`}
tooltip={i18n.str`full product description`}
/>
name="unit"
label={i18n.str`Unit`}
tooltip={i18n.str`name of the product unit`}
/>
name="price"
label={i18n.str`Price`}
tooltip={i18n.str`amount in the current currency`}
/>
name="quantity"
label={i18n.str`Quantity`}
tooltip={i18n.str`how many products will be added`}
/>
name="taxes" label={i18n.str`Taxes`} />