import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { getStorages } from "../utils/api/storages.ts"; import { Box, Button, Chip, CircularProgress, 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 { getProductDetails, mutateProduct } from "../utils/api/products.ts"; import { toInputDate } from "../utils/uxFncs"; import type { AlertInterface, productDetailsInterface, ProductFormValues, Storage, } from "../misc/interfaces"; import type { ApiError } from "../utils/api/apiError"; import Cookies from "js-cookie"; import ElectricBoltIcon from "@mui/icons-material/ElectricBolt"; import { MyAlert } from "../components/MyAlert.tsx"; export const ProductQuickView = () => { const uuid = window.location.search.split("uuid=")[1]; const { t } = useTranslation(); const queryClient = useQueryClient(); const [success, setSuccess] = useState(false); 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: productDetails, isLoading: productDetailsLoading, isSuccess, isError: productDetailsError, error: productDetailsErrorObj, } = useQuery({ queryKey: ["product", uuid], queryFn: () => getProductDetails(uuid), }); const { data: storages, isError: storagesError, error: storagesErrorObj, } = useQuery({ queryKey: ["storages"], queryFn: () => getStorages(), }); useEffect(() => { if (productDetailsError && productDetailsErrorObj) { showError(productDetailsErrorObj); } }, [productDetailsError, productDetailsErrorObj]); 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 }) => { if (!productDetails?.uuid) { return; } mutate({ values: value, uuid: productDetails.uuid }); }, }); const { mutate, isPending } = useMutation({ mutationFn: ({ values, uuid, }: { values: ProductFormValues; uuid: string; }) => mutateProduct(values, uuid), onSuccess: (_data, variables) => { setSuccess(true); queryClient.invalidateQueries({ queryKey: ["product", variables.uuid] }); }, onError: showError, }); useEffect(() => { if (!productDetails) { return; } form.setFieldValue("amount", productDetails.amount ?? 0); form.setFieldValue( "bottling_date", toInputDate(productDetails.bottling_date), ); form.setFieldValue("description", productDetails.description ?? ""); form.setFieldValue("expiry_date", toInputDate(productDetails.expiry_date)); form.setFieldValue("name", productDetails.name ?? ""); form.setFieldValue("price", productDetails.price ?? ""); form.setFieldValue( "storage_location_uuid", productDetails.storage_location_uuid ?? "", ); }, [form, productDetails]); return ( <>
{t("product-details-quick")}
{t("details")}
{productDetailsLoading && }
{isSuccess && (
{ 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 && ( )}
)} ); };