import InputError from '@/components/input-error'; import LoadingButton from '@/components/loading-button'; import { Button } from '@/components/ui/button'; import { Dialog, DialogClose, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Switch } from '@/components/ui/switch'; import { onHandleChange } from '@/lib/inertia'; import { useForm } from '@inertiajs/react'; import { Shuffle } from 'lucide-react'; import { useEffect, useState } from 'react'; interface Props { title: string; handler: React.ReactNode; coupon?: CourseCoupon; courses: Course[]; } const CouponForm = ({ title, handler, coupon, courses }: Props) => { const [open, setOpen] = useState(false); // Convert datetime from "2025-11-19 18:00:00" to "2025-11-19T18:00" for datetime-local input const formatDatetimeLocal = (datetime?: string) => { if (!datetime) return ''; return datetime.replace(' ', 'T').substring(0, 16); }; const { data, setData, post, put, reset, processing, errors } = useForm({ code: coupon?.code || '', course_id: coupon?.course_id || '', discount_type: coupon?.discount_type || 'percentage', discount: coupon?.discount || 0, valid_from: formatDatetimeLocal(coupon?.valid_from), valid_to: formatDatetimeLocal(coupon?.valid_to), is_active: coupon?.is_active ?? true, }); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (coupon) { put(route('course-coupons.update', coupon.id), { preserveScroll: true, onSuccess: () => { setOpen(false); }, }); } else { post(route('course-coupons.store'), { preserveScroll: true, onSuccess: () => { reset(); setOpen(false); }, }); } }; const generateCode = () => { const code = Math.random().toString(36).substring(2, 10).toUpperCase(); setData('code', code); }; useEffect(() => { if (open && coupon) { // When opening for edit, set the form data with properly formatted datetime values setData({ course_id: coupon.course_id || '', code: coupon.code || '', discount_type: coupon.discount_type || 'percentage', discount: coupon.discount || 0, valid_from: formatDatetimeLocal(coupon.valid_from), valid_to: formatDatetimeLocal(coupon.valid_to), is_active: coupon.is_active ?? true, }); } else if (!open) { reset(); } }, [open, coupon]); return ( {handler} {title}
setData('code', e.target.value.toUpperCase())} placeholder="SUMMER2024" required />
onHandleChange(e, setData)} min="0" step="0.01" required />
onHandleChange(e, setData)} />
onHandleChange(e, setData)} />
{/*
onHandleChange(e, setData)} min="1" placeholder="Unlimited" />
*/}
setData('is_active', checked)} />
{coupon ? 'Update' : 'Create'}
); }; export default CouponForm;