"use client"; import { useState } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import * as z from "zod"; import { Upload, Plus, UploadCloud } from "lucide-react"; import { Card, CardHeader, CardTitle, CardContent } from "@/components/ui/card"; import { Label } from "@radix-ui/react-dropdown-menu"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { createProduct } from "@/service/product"; import withReactContent from "sweetalert2-react-content"; import Swal from "sweetalert2"; import { useRouter } from "next/navigation"; const formSchema = z.object({ name: z.string().min(1, "Nama produk wajib diisi"), variant: z.string().min(1, "Tipe varian wajib diisi"), price: z.coerce.number().min(1, "Harga produk wajib diisi"), // ⬅️ PRICE NUMBER banner: z.instanceof(FileList).optional(), }); export default function AddProductForm() { const [colors, setColors] = useState([{ id: 1 }]); const [selectedColor, setSelectedColor] = useState(null); const [specs, setSpecs] = useState([{ id: 1 }]); const [file, setFile] = useState(null); const router = useRouter(); const MySwal = withReactContent(Swal); const handleFileChange = (e: any) => { const selected = e.target.files[0]; if (selected) setFile(selected); }; const handleAddSpec = () => { setSpecs((prev) => [...prev, { id: prev.length + 1 }]); }; const { register, handleSubmit, formState: { errors }, } = useForm>({ resolver: zodResolver(formSchema), }); const onSubmit = async (data: z.infer) => { try { const formData = new FormData(); formData.append("title", data.name); formData.append("variant", data.variant); formData.append("price", data.price.toString()); // if (data.banner && data.banner.length > 0) { // formData.append("thumbnail_path", data.banner[0]); // } if (file) { formData.append("file", file); } const colorsArray = colors.map((c) => selectedColor || ""); formData.append("colors", JSON.stringify(colorsArray)); const res = await createProduct(formData); console.log("API Success:", res); successSubmit("/admin/product"); } catch (error) { console.error("Submit Error:", error); alert("Gagal mengirim produk"); } }; function successSubmit(redirect: any) { MySwal.fire({ title: "Sukses", icon: "success", confirmButtonColor: "#3085d6", confirmButtonText: "OK", }).then((result) => { if (result.isConfirmed) { router.push(redirect); } }); } const handleAddColor = () => { setColors((prev) => [...prev, { id: prev.length + 1 }]); }; return ( Form Tambah Produk Baru
{/* 3 Input Field */}
{errors.name && (

{errors.name.message}

)}
{errors.variant && (

{errors.variant.message}

)}
{errors.price && (

{errors.price.message}

)}
{/* Upload Banner */}
{/* Upload Produk */}
{colors.map((color, index) => (
{/* Pilihan Warna */}
{[ "#1E4E52", "#597E8D", "#6B6B6B", "#BEBEBE", "#E2E2E2", "#F4F4F4", "#FFFFFF", "#F9360A", "#9A2A00", "#7A1400", "#4B0200", "#B48B84", "#FFA598", ].map((colorCode) => (
{/* Upload Foto Warna */}

Klik untuk upload foto mobil warna ini

PNG, JPG (max 5 MB)

))} {/* Tambah Warna Baru */}
{specs.map((spec, index) => (
{/* Judul Spesifikasi */} {/* Foto Spesifikasi */}

Klik untuk upload gambar spesifikasi

PNG, JPG (max 5 MB)

))} {/* Tambah spesifikasi baru */}
); }