'use client'; import { useState, useEffect } from 'react'; import { Promotion, CreatePromotionData, UpdatePromotionData, PROMOTION_TYPES } from '@/types/promotion'; import { PhotoIcon, XMarkIcon } from '@heroicons/react/24/outline'; interface PromotionFormProps { promotion?: Promotion | null; onSubmit: (data: CreatePromotionData | UpdatePromotionData) => Promise; onCancel: () => void; isLoading: boolean; } export default function PromotionForm({ promotion, onSubmit, onCancel, isLoading }: PromotionFormProps) { const [formData, setFormData] = useState({ type: 'slider', title: '', subtitle: '', action_text: '', url_myket: '', url_bazzar: '', url_google_play: '', url_site: '', priority: 0, start_at: '', end_at: '', }); const [imageFile, setImageFile] = useState(null); const [imagePreview, setImagePreview] = useState(null); const [isActive, setIsActive] = useState(true); useEffect(() => { if (promotion) { const startAt = promotion.start_at ? promotion.start_at.slice(0, 16) : ''; const endAt = promotion.end_at ? promotion.end_at.slice(0, 16) : ''; setFormData({ type: promotion.type || 'slider', title: promotion.title || '', subtitle: promotion.subtitle || '', action_text: promotion.action_text || '', url_myket: promotion.url_myket || '', url_bazzar: promotion.url_bazzar || '', url_google_play: promotion.url_google_play || '', url_site: promotion.url_site || '', priority: promotion.priority || 0, start_at: startAt, end_at: endAt, }); setIsActive(promotion.is_active); if (promotion.image_url) setImagePreview(promotion.image_url); } else { setFormData(prev => ({ ...prev, priority: 0 })); } }, [promotion]); const handleInputChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value === '' ? null : value })); }; const handleNumberChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value === '' ? null : parseInt(value, 10) })); }; const handleImageChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { setImageFile(file); setFormData(prev => ({ ...prev, image: file })); const reader = new FileReader(); reader.onloadend = () => setImagePreview(reader.result as string); reader.readAsDataURL(file); } }; const removeImage = () => { setImageFile(null); setImagePreview(null); setFormData(prev => ({ ...prev, image: null })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); let submitData: any = { ...formData }; if (submitData.start_at) submitData.start_at = submitData.start_at.replace('T', ' ') + ':00'; if (submitData.end_at) submitData.end_at = submitData.end_at.replace('T', ' ') + ':00'; if (promotion) submitData.is_active = isActive; await onSubmit(submitData); }; const inputClass = 'block w-full px-4 py-2.5 text-sm text-gray-900 dark:text-gray-100 border border-gray-200 dark:border-gray-700 rounded-xl bg-gray-50 dark:bg-gray-800/60 placeholder-gray-400 dark:placeholder-gray-500 focus:ring-2 focus:ring-indigo-500/20 focus:border-indigo-500 dark:focus:border-indigo-400 transition-colors'; const labelClass = 'block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1.5'; return (

{promotion ? 'ویرایش تبلیغ' : 'ایجاد تبلیغ جدید'}

لینک‌ها

{imagePreview && ( )}
{imagePreview && (
Preview
)}

حداکثر حجم: ۲ مگابایت

{promotion && (
)}
); }