'use client'; import { useState, useEffect } from 'react'; import { Promotion, CreatePromotionData, UpdatePromotionData, PROMOTION_TYPES } from '@/types/promotion'; import { PhotoIcon, XMarkIcon } from '@heroicons/react/24/outline'; import Image from 'next/image'; 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) { // Format dates for input fields 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 { // Set default priority 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 })); // Create preview 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(); // Format dates properly 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'; } // Add is_active for updates if (promotion) { submitData.is_active = isActive; } await onSubmit(submitData); }; return (

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

{/* Type */}
{/* Title */}
{/* Subtitle */}
{/* Action Text */}
{/* Priority */}
{/* Start Date */}
{/* End Date */}
{/* URLs Section */}

لینک‌ها

{/* Myket URL */}
{/* Bazaar URL */}
{/* Google Play URL */}
{/* Site URL */}
{/* Image Upload */}
{imagePreview && ( )}
{imagePreview && (
Preview
)}

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

{/* Active Status (only for edit) */} {promotion && (
setIsActive(e.target.checked)} className="h-4 w-4 text-indigo-600 focus:ring-indigo-500 border-gray-300 dark:border-gray-600 dark:bg-gray-800 rounded" />
)} {/* Form Actions */}
); }