'use client'; import { useState } from 'react'; import { scrapingApi, type Item } from '@/lib/api'; import ImageUpload from './image-upload'; interface ItemFormProps { initialData?: Partial; onSubmit: (data: Partial) => Promise; onCancel: () => void; isEditing?: boolean; } export default function ItemForm({ initialData, onSubmit, onCancel, isEditing = false }: ItemFormProps) { const [formData, setFormData] = useState({ name: initialData?.name || '', description: initialData?.description || '', price: initialData?.price?.toString() || '', currency: initialData?.currency || 'USD', quantity: initialData?.quantity?.toString() || '1', imageUrl: initialData?.imageUrl || '', purchaseUrl: initialData?.purchaseUrls?.[0]?.url || '', purchaseLabel: initialData?.purchaseUrls?.[0]?.label || '', }); const [scrapeUrl, setScrapeUrl] = useState(''); const [isScraping, setIsScraping] = useState(false); const [scrapeError, setScrapeError] = useState(''); const [isSubmitting, setIsSubmitting] = useState(false); const [submitError, setSubmitError] = useState(''); const handleScrape = async () => { if (!scrapeUrl) return; setIsScraping(true); setScrapeError(''); try { const data = await scrapingApi.scrapeUrl(scrapeUrl); setFormData((prev) => ({ ...prev, name: data.title || prev.name, description: data.description || prev.description, price: data.price?.toString() || prev.price, currency: data.currency || prev.currency, imageUrl: data.imageUrl || prev.imageUrl, purchaseUrl: scrapeUrl, purchaseLabel: new URL(scrapeUrl).hostname.replace('www.', ''), })); } catch (error: any) { setScrapeError(error.message || 'Failed to scrape URL'); } finally { setIsScraping(false); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (isSubmitting) return; setSubmitError(''); setIsSubmitting(true); try { const purchaseUrls = formData.purchaseUrl ? [ { url: formData.purchaseUrl, label: formData.purchaseLabel || 'Link', }, ] : null; await onSubmit({ name: formData.name, description: formData.description || null, price: formData.price ? parseFloat(formData.price) : null, currency: formData.currency, quantity: parseInt(formData.quantity) || 1, imageUrl: formData.imageUrl || null, purchaseUrls, }); } catch (error: any) { setSubmitError(error.message || 'Failed to save item'); } finally { setIsSubmitting(false); } }; return (
{submitError && (
{submitError}
)} {/* URL Scraper */} {!isEditing && (
setScrapeUrl(e.target.value)} />
{scrapeError && (

{scrapeError}

)}

Supports common retailers like Amazon, eBay, etc.

)} {/* Basic Info */}
setFormData((prev) => ({ ...prev, name: e.target.value }))} />