"use client"; import { FormEvent, useCallback, useEffect, useState } from "react"; import { TextInputWithLabel } from "../text-input-with-label"; import { Product } from "@/db/schema"; import { useRouter } from "next/navigation"; import { Button } from "../ui/button"; import { secondLevelNestedRoutes, singleLevelNestedRoutes } from "@/lib/routes"; import { toast } from "../ui/use-toast"; import { HeadingAndSubheading } from "./heading-and-subheading"; import { ProductImages } from "@/lib/types"; import { ProductImageUploader } from "./product-image-uploader"; import type { deleteProduct, updateProduct } from "@/server-actions/products"; import { Loader2 } from "lucide-react"; const defaultValues = { name: "", description: "", price: "", inventory: "", images: [], }; export const ProductEditorElements = (props: { displayType?: "page" | "modal"; productStatus: "new-product" | "existing-product"; productActions: { updateProduct: typeof updateProduct; deleteProduct: typeof deleteProduct; }; initialValues?: Product; }) => { const router = useRouter(); const [isLoading, setIsLoading] = useState(false); const [imagesToDelete, setImagesToDelete] = useState([] as ProductImages[]); const [newImages, setNewImages] = useState([] as ProductImages[]); const [formValues, setFormValues] = useState>( props.initialValues ?? defaultValues ); const dismissModal = useCallback(() => { if (props.displayType === "modal") { router.back(); } else { router.push(singleLevelNestedRoutes.account.products); } }, [router, props.displayType]); const onKeyDown = useCallback( (e: any) => { if (e.key === "Escape") dismissModal(); }, [dismissModal] ); useEffect(() => { document.addEventListener("keydown", onKeyDown); return () => document.removeEventListener("keydown", onKeyDown); }, [onKeyDown]); const handleProductUpdate = async ( e: | FormEvent | React.MouseEvent, buttonAction?: "delete" ) => { e.preventDefault(); setIsLoading(true); let data; if (buttonAction === "delete") { // delete product data = await props.productActions.deleteProduct(props.initialValues?.id); if (!data.error) { router.refresh(); router.push(singleLevelNestedRoutes.account.products); } } else if (props.initialValues) { // update product const updatedValues = { ...formValues, images: [ ...(props.initialValues?.images as []), ...(newImages ?? []), ].filter((item) => imagesToDelete && !imagesToDelete.includes(item)), } as Omit; data = await props.productActions.updateProduct(updatedValues); if (!data.error) { router.refresh(); router.push(singleLevelNestedRoutes.account.products); } } else { // create new product const res = await fetch("/api/product", { method: "POST", body: JSON.stringify(formValues), }); data = (await res.json()) as unknown as { error: boolean; message: string; action: string; productId?: string; }; console.log(data); if (data.productId) { router.push( `${secondLevelNestedRoutes.product.base}/${data.productId}` ); } setFormValues(defaultValues); } setIsLoading(false); toast({ title: data.message, description: data.action, }); }; return ( <>
{props.productStatus === "existing-product" && ( & { images: ProductImages[]; } } newImages={newImages} setNewImages={setNewImages} imagesToDelete={imagesToDelete} setImagesToDelete={setImagesToDelete} /> )}
{!!props.initialValues && ( )}
); };