import { useMutation, useQuery } from "@tanstack/react-query"; import { Box, Button, Chip, Divider, Input, Option, Select, Typography, } from "@mui/joy"; import { useTranslation } from "react-i18next"; import { useEffect, useState } from "react"; import { useForm } from "@tanstack/react-form"; import { createProduct } from "../utils/api/products"; import { getStorages } from "../utils/api/storages"; import type { AlertInterface, ProductFormValues, Storage, } from "../misc/interfaces"; import type { ApiError } from "../utils/api/apiError"; import Cookies from "js-cookie"; import { MyAlert } from "../components/MyAlert.tsx"; export const AddProduct = () => { const { t } = useTranslation(); const [alert, setAlert] = useState({ isAlert: false, type: "neutral", header: "", text: "", }); const showError = (error: unknown) => { const errorCode = (error as { code?: string })?.code; setAlert({ isAlert: true, type: "danger", header: t("error"), text: errorCode ? t(errorCode) : t("unknown-error"), }); }; const { data: storages, isError: storagesError, error: storagesErrorObj, } = useQuery({ queryKey: ["storages"], queryFn: () => getStorages(), }); useEffect(() => { if (storagesError && storagesErrorObj) { showError(storagesErrorObj); } }, [storagesError, storagesErrorObj]); const form = useForm({ defaultValues: { amount: 0, bottling_date: "", description: "", expiry_date: "", name: "", price: "", storage_location_uuid: "", }, onSubmit: async ({ value }) => { mutate(value); }, }); const { mutate, isPending } = useMutation({ mutationFn: (values: ProductFormValues) => createProduct(values), onSuccess: () => { setAlert({ isAlert: true, type: "success", header: "", text: "", }); }, onError: showError, }); return ( <>
{t("add-product")} {t("add-product-subtitle")}
{t("details")}
{ e.preventDefault(); form.handleSubmit(); }} >
{t("product-name")} {(field) => ( field.handleChange(e.target.value)} onBlur={field.handleBlur} size="lg" variant="outlined" className="rounded-2xl" sx={{ bgcolor: "var(--joy-palette-background-surface)", boxShadow: "0 10px 24px var(--joy-palette-divider)", }} /> )}
{t("description")} {(field) => ( field.handleChange(e.target.value)} onBlur={field.handleBlur} size="lg" variant="outlined" className="rounded-2xl" sx={{ bgcolor: "var(--joy-palette-background-surface)", boxShadow: "0 10px 24px var(--joy-palette-divider)", }} /> )}
{t("expiry-date")} {(field) => ( field.handleChange(e.target.value)} onBlur={field.handleBlur} size="lg" variant="outlined" className="rounded-2xl" sx={{ bgcolor: "var(--joy-palette-background-surface)", }} /> )}
{t("bottling-date")} {(field) => ( field.handleChange(e.target.value)} onBlur={field.handleBlur} size="lg" variant="outlined" className="rounded-2xl" sx={{ bgcolor: "var(--joy-palette-background-surface)", }} /> )}
{t("inventory")}
{t("amount")} {(field) => ( { const nextValue = Number(e.target.value); field.handleChange( Number.isNaN(nextValue) ? 0 : nextValue, ); }} onBlur={field.handleBlur} className="rounded-2xl" sx={{ bgcolor: "var(--joy-palette-background-surface)", }} /> )}
{t("price")} {(field) => ( field.handleChange(e.target.value)} onBlur={field.handleBlur} size="lg" variant="outlined" className="rounded-2xl" sx={{ bgcolor: "var(--joy-palette-background-surface)", }} /> )} {Cookies.get("currency")}
{t("storage-place")} {(field) => ( )}
{t("product-details")}
{alert.isAlert && ( )}
); };