import React, { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { __ } from '@/lib/i18n'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Checkbox } from '@/components/ui/checkbox'; import { Button } from '@/components/ui/button'; import { MultiSelect } from '@/components/ui/multi-select'; import { VerticalTabForm, FormSection } from '@/components/VerticalTabForm'; import { ProductsApi } from '@/lib/api'; import { Settings, ShieldCheck, BarChart3 } from 'lucide-react'; import type { Coupon, CouponFormData } from '@/lib/api/coupons'; interface CouponFormProps { mode: 'create' | 'edit'; initial?: Coupon | null; onSubmit: (data: CouponFormData) => Promise | void; formRef?: React.RefObject; hideSubmitButton?: boolean; } export default function CouponForm({ mode, initial, onSubmit, formRef, hideSubmitButton = false, }: CouponFormProps) { const [formData, setFormData] = useState({ code: initial?.code || '', amount: initial?.amount || 0, discount_type: initial?.discount_type || 'percent', description: initial?.description || '', date_expires: initial?.date_expires || null, individual_use: initial?.individual_use || false, product_ids: initial?.product_ids || [], excluded_product_ids: initial?.excluded_product_ids || [], product_categories: initial?.product_categories || [], excluded_product_categories: initial?.excluded_product_categories || [], usage_limit: initial?.usage_limit || null, usage_limit_per_user: initial?.usage_limit_per_user || null, free_shipping: initial?.free_shipping || false, exclude_sale_items: initial?.exclude_sale_items || false, minimum_amount: initial?.minimum_amount || null, maximum_amount: initial?.maximum_amount || null, }); // Fetch products and categories const { data: productsData } = useQuery({ queryKey: ['products-list'], queryFn: () => ProductsApi.list({ per_page: 100 }), }); const { data: categoriesData } = useQuery({ queryKey: ['product-categories'], queryFn: () => ProductsApi.categories(), }); const products = (productsData as any)?.rows || []; const categories = categoriesData || []; const [submitting, setSubmitting] = useState(false); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setSubmitting(true); try { await onSubmit(formData); } finally { setSubmitting(false); } }; const updateField = (field: keyof CouponFormData, value: any) => { setFormData(prev => ({ ...prev, [field]: value })); }; const tabs = [ { id: 'general', label: __('General'), icon: }, { id: 'restrictions', label: __('Restrictions'), icon: }, { id: 'limits', label: __('Limits'), icon: }, ]; return (
{/* General Settings */} {__('General')} {/* Coupon Code */}
updateField('code', e.target.value.toUpperCase())} placeholder={__('e.g., SUMMER2024')} required disabled={mode === 'edit'} // Can't change code after creation />

{__('Unique code that customers will enter at checkout')}

{/* Description */}