"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"), banner: z.instanceof(FileList).optional(), }); export default function AddProductForm() { const [colors, setColors] = useState< { id: number; name: string; file: File | null }[] >([{ id: 1, name: "", file: null }]); const [selectedColor, setSelectedColor] = useState(null); const [specs, setSpecs] = useState< { id: number; title: string; file: File | null }[] >([{ id: 1, title: "", file: null }]); const [file, setFile] = useState(null); const router = useRouter(); const MySwal = withReactContent(Swal); const [priceDisplay, setPriceDisplay] = useState(""); 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, setValue, formState: { errors }, } = useForm>({ resolver: zodResolver(formSchema), }); const handleSpecTitleChange = (index: number, value: string) => { const updated = [...specs]; updated[index].title = value; setSpecs(updated); }; const handleSpecFileChange = ( index: number, e: React.ChangeEvent, ) => { const file = e.target.files?.[0] || null; const updated = [...specs]; updated[index].file = file; setSpecs(updated); }; 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()); formData.append("status", "1"); formData.append("is_active", "1"); // banner if (file) { formData.append("file", file); } // 🔥 colors JSON (object) const colorsPayload = colors.map((c) => ({ name: c.name, })); formData.append("colors", JSON.stringify(colorsPayload)); // 🔥 color images colors.forEach((c) => { if (c.file) { formData.append("color_images", c.file); } }); // 🔥 specifications JSON const specificationsPayload = specs.map((s) => ({ title: s.title, })); formData.append("specifications", JSON.stringify(specificationsPayload)); // 🔥 imagespecification_url (files) specs.forEach((s) => { if (s.file) { formData.append("imagespecification_url", s.file); } }); await createProduct(formData); successSubmit("/admin/product"); } catch (err) { console.error(err); 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 handlePriceChange = (e: React.ChangeEvent) => { const rawValue = e.target.value.replace(/\D/g, ""); setPriceDisplay(formatRupiah(rawValue)); setValue("price", rawValue ? Number(rawValue) : 0); }; const handleAddColor = () => { setColors((prev) => [ ...prev, { id: prev.length + 1, name: "", file: null }, ]); }; const handleColorFileChange = ( index: number, e: React.ChangeEvent, ) => { const file = e.target.files?.[0] || null; const updated = [...colors]; updated[index].file = file; setColors(updated); }; const formatRupiah = (value: string) => { const number = value.replace(/\D/g, ""); return number ? `Rp ${Number(number).toLocaleString("id-ID")}` : ""; }; return ( Form Tambah Produk Baru
{errors.name && (

{errors.name.message}

)}
{errors.variant && (

{errors.variant.message}

)}
{errors.price && (

{errors.price.message}

)}
{/* Upload Produk */}
{colors.map((color, index) => (
{ const updated = [...colors]; updated[index].name = e.target.value; setColors(updated); }} /> {/* Pilihan Warna */}
{[ "#1E4E52", "#597E8D", "#6B6B6B", "#BEBEBE", "#E2E2E2", "#F4F4F4", "#FFFFFF", "#F9360A", "#9A2A00", "#7A1400", "#4B0200", "#B48B84", "#FFA598", ].map((colorCode) => (
{/* Upload Foto Warna */}
{color.file && (

{color.file.name}

)}
))}
{specs.map((spec, index) => (
handleSpecTitleChange(index, e.target.value)} /> {spec.file && (

{spec.file.name}

)}
))} {/* */}
); }