'use client'; import React, { useState, useEffect, ChangeEvent, FormEvent } from 'react'; import IconTrashLines from '../icon/icon-trash-lines'; import axios from 'axios'; import Cookies from 'universal-cookie'; import { useRouter, useSearchParams } from 'next/navigation'; import { showMessage } from '@/utils/CommonFunction.utils'; import { buildApiUrl } from '@/utils/BaseUrl.utils'; interface FormValues { title: string; slug: string; date: string; time: string; location: string; image: File | null; existingImageUrl: string; link: string; btn_text: string; admission: string; description: string; } interface FormErrors { [key: string]: string; } const slugify = (text: string) => { if (!text) return ''; return text .toString() .toLowerCase() .trim() .replace(/\s+/g, '-') .replace(/[^\w\-]+/g, '') .replace(/\-\-+/g, '-'); }; const EditUpcomingEventForm: React.FC = () => { const router = useRouter(); const searchParams = useSearchParams(); const id = searchParams.get('id'); const [formData, setFormData] = useState({ title: '', slug: '', date: '', time: '', location: '', image: null, existingImageUrl: '', link: '', btn_text: 'Details Coming Soon', admission: '', description: '', }); const [errors, setErrors] = useState({}); const [previewUrl, setPreviewUrl] = useState(null); const [loading, setLoading] = useState(false); const [fetching, setFetching] = useState(true); useEffect(() => { if (id) { fetchEventDetails(id); } else { showMessage('Invalid Event ID'); router.push('/upcoming-events'); } }, [id]); const fetchEventDetails = async (eventId: string) => { try { const cookies = new Cookies(); const token = cookies.get('token'); const res = await axios.get(buildApiUrl(`upcoming-events/${eventId}`), { headers: { Authorization: `Bearer ${token}` }, }); if (res?.data?.success && res?.data?.data) { const ev = res.data.data; const titleStr = ev.title || ev.eventtitle || ''; const computedSlug = (ev.slug && ev.slug.trim()) ? ev.slug.trim() : slugify(titleStr); const computedLink = (ev.link && ev.link.trim()) ? ev.link.trim() : `/upcoming-event/${computedSlug}`; setFormData({ title: titleStr, slug: computedSlug, date: ev.date || ev.eventdate || '', time: ev.time || '', location: ev.location || '', image: null, existingImageUrl: ev.image || ev.eventimageurl || '', link: computedLink, btn_text: ev.btn_text || ev.btnText || 'Details Coming Soon', admission: ev.admission || '', description: ev.description || ev.desc || ev.eventdescription || '', }); setPreviewUrl(ev.image || ev.eventimageurl || null); } } catch (error) { console.error('Error fetching event details:', error); showMessage('Failed to load event details'); } finally { setFetching(false); } }; const handleChange = (e: ChangeEvent) => { const { name, value } = e.target; setFormData(prev => { const nextState = { ...prev, [name]: value }; if (name === 'title') { const autoSlug = slugify(value); if (!prev.slug || prev.slug === slugify(prev.title)) { nextState.slug = autoSlug; } if (!prev.link || prev.link === `/upcoming-event/${slugify(prev.title)}`) { nextState.link = `/upcoming-event/${autoSlug}`; } } return nextState; }); }; const handleFileChange = (e: ChangeEvent) => { const file = e.target.files?.[0] || null; setFormData(prev => ({ ...prev, image: file, })); if (file) { const url = URL.createObjectURL(file); setPreviewUrl(url); } else { setPreviewUrl(formData.existingImageUrl || null); } }; const validateForm = (): boolean => { const newErrors: FormErrors = {}; if (!formData.title.trim()) newErrors.title = 'Event title is required'; if (!formData.date.trim()) newErrors.date = 'Event date is required'; if (formData.image && !formData.image.type.startsWith('image/')) { newErrors.image = 'Only image files are allowed'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = async (e: FormEvent) => { e.preventDefault(); if (!validateForm() || !id) return; setLoading(true); try { const cookies = new Cookies(); const token = cookies.get('token'); let imageUrl = formData.existingImageUrl; // Upload new image if selected if (formData.image && formData.image.type.startsWith('image/')) { const data = new FormData(); data.append('file', formData.image); const imageUpload = await axios.post(buildApiUrl('upload/single'), data, { headers: { 'Content-Type': 'multipart/form-data', Authorization: `Bearer ${token}`, }, }); imageUrl = imageUpload?.data?.data?.fullUrl || imageUpload?.data?.data?.path || imageUrl; } const updateData = { title: formData.title, slug: formData.slug, date: formData.date, time: formData.time, location: formData.location, image: imageUrl, link: formData.link, btn_text: formData.btn_text, admission: formData.admission, description: formData.description, }; await axios.put(buildApiUrl(`upcoming-events/${id}`), updateData, { headers: { Authorization: `Bearer ${token}`, }, }); showMessage('Upcoming Event Updated Successfully', 'success'); router.push('/upcoming-events'); } catch (error: any) { console.error('Update error:', error); showMessage(error?.response?.data?.message || 'Failed to update upcoming event'); } finally { setLoading(false); } }; const handleImageDelete = () => { setFormData(prev => ({ ...prev, image: null, existingImageUrl: '', })); setPreviewUrl(null); }; if (fetching) { return (
Loading event details...
); } return (

Edit Upcoming Event

{/* Event Title */}
{errors.title &&

{errors.title}

}
{/* Event Date */}
{errors.date &&

{errors.date}

}
{/* Event Time */}
{/* Venue / Location */}
{/* Button Text */}
{/* Slug */}
{/* Event Link */}
{/* Admission */}
{/* Event Description */}