"use client"; import { useState, useEffect } from "react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { ImageUpload } from "@/components/forms/image-upload"; import { PricingTiers } from "@/components/forms/pricing-tiers"; import { ProductModalProps, ProductData } from "@/lib/types"; import { toast } from "sonner"; export const ProductModal = ({ open, onClose, onSave, productData, categories, editing, handleChange, setProductData, }: ProductModalProps) => { const [imagePreview, setImagePreview] = useState(null); const [imageDimensions, setImageDimensions] = useState({ width: 300, height: 200 }); useEffect(() => { if (productData.image && typeof productData.image === "string") { setImagePreview(productData.image); } }, [productData.image]); const handleImageChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) { setProductData({ ...productData, image: null }); setImagePreview(null); return; } const image = new Image(); const objectUrl = URL.createObjectURL(file); image.onload = () => { const aspectRatio = image.naturalWidth / image.naturalHeight; const width = aspectRatio > 1 ? 300 : 200 * aspectRatio; const height = aspectRatio > 1 ? 300 / aspectRatio : 200; setProductData({ ...productData, image: file }); setImagePreview(objectUrl); setImageDimensions({ width, height }); }; image.src = objectUrl; }; const handleTierChange = (e: React.ChangeEvent, index: number) => { const { name, valueAsNumber } = e.target; if (!["minQuantity", "pricePerUnit"].includes(name)) return; // ✅ Ensure valid keys const updatedPricing = [...productData.pricing]; (updatedPricing[index] as any)[name] = isNaN(valueAsNumber) ? 0 : valueAsNumber; setProductData({ ...productData, pricing: updatedPricing }); }; const handleAddTier = () => { setProductData(prev => ({ ...prev, pricing: [...prev.pricing, { minQuantity: 1, pricePerUnit: 0 }] })); }; const handleRemoveTier = (index: number) => { const updatedPricing = productData.pricing.filter((_, i) => i !== index); setProductData({ ...productData, pricing: updatedPricing }); }; const handleSave = () => { onSave(productData); toast.success(editing ? "Product updated!" : "Product added!"); onClose(); }; return ( {editing ? "Edit Product" : "Add Product"}
{/* Left Column */}
{/* Right Column */}
); }; const ProductBasicInfo = ({ productData, handleChange, categories, setProductData, }: { productData: ProductData; handleChange: (e: React.ChangeEvent) => void; categories: { _id: string; name: string }[]; setProductData: React.Dispatch>; }) => ( <>