import React, { useEffect, useRef, useState } from 'react' import { useNavigate, useParams } from 'react-router-dom' import { createEvent, getAdminToken, getEvent, updateEvent, uploadImage } from '../../utils/api' const apiBaseUrl = (import.meta.env.VITE_API_BASE_URL || 'http://localhost:4001').replace(/\/$/, '') function resolveImageUrl(value) { if (!value) return '' const trimmed = value.trim() if (!trimmed) return '' if (/^(?:https?:)?\/\//i.test(trimmed) || trimmed.startsWith('data:')) { return trimmed } const path = trimmed.startsWith('/') ? trimmed : `/${trimmed}` if (apiBaseUrl) { return `${apiBaseUrl}${path}` } return path } const emptyForm = { title: '', date: '', time: '', location: '', description: '', category: '', image: '', slug: '', } export default function AdminEventForm() { const { slug } = useParams() const isEdit = Boolean(slug) const navigate = useNavigate() const [form, setForm] = useState(emptyForm) const [loading, setLoading] = useState(isEdit) const [saving, setSaving] = useState(false) const [error, setError] = useState('') const [selectedFile, setSelectedFile] = useState(null) const [uploading, setUploading] = useState(false) const [uploadError, setUploadError] = useState('') const [uploadMessage, setUploadMessage] = useState('') const fileInputRef = useRef(null) const previewSrc = resolveImageUrl(form.image) useEffect(() => { if (!isEdit) return let ignore = false async function loadEvent() { setLoading(true) setError('') try { const data = await getEvent(slug) if (!ignore) { setForm({ title: data.title || '', date: data.date || '', time: data.time || '', location: data.location || '', description: data.description || '', category: data.category || '', image: data.image || '', slug: data.slug || '', }) } } catch (err) { console.error('Failed to load event for editing', err) if (!ignore) { setError(err.message || 'Unable to load event data.') } } finally { if (!ignore) { setLoading(false) } } } loadEvent() return () => { ignore = true } }, [isEdit, slug]) const handleChange = (event) => { const { name, value } = event.target setForm((prev) => ({ ...prev, [name]: value })) } const handleFileSelect = (event) => { const file = event.target.files && event.target.files[0] ? event.target.files[0] : null setSelectedFile(file) setUploadError('') setUploadMessage('') } const handleUpload = async () => { setUploadError('') setUploadMessage('') if (!selectedFile) { setUploadError('Select an image file before uploading.') return } const token = getAdminToken() if (!token) { setError('No admin token found. Please log in again.') return } setUploading(true) try { const { url } = await uploadImage(selectedFile, token) setForm(prev => ({ ...prev, image: url })) setSelectedFile(null) if (fileInputRef.current) { fileInputRef.current.value = '' } setUploadMessage('Image uploaded successfully.') } catch (err) { console.error('Failed to upload image', err) setUploadError(err.message || 'Unable to upload image. Please try again.') } finally { setUploading(false) } } const handleSubmit = async (event) => { event.preventDefault() setError('') if (!form.title || !form.date) { setError('Title and date are required.') return } const token = getAdminToken() if (!token) { setError('No admin token found. Please log in again.') return } setSaving(true) let imageValue = form.image try { if (selectedFile) { setUploadError('') setUploadMessage('') setUploading(true) try { const { url, path } = await uploadImage(selectedFile, token) imageValue = path || url setForm(prev => ({ ...prev, image: imageValue })) setSelectedFile(null) if (fileInputRef.current) { fileInputRef.current.value = '' } setUploadMessage('Image uploaded successfully.') } catch (err) { console.error('Failed to upload image', err) setError(err.message || 'Unable to upload image. Please try again.') setSaving(false) setUploading(false) return } finally { setUploading(false) } } const payload = { title: form.title, date: form.date, time: form.time, location: form.location, description: form.description, category: form.category, image: imageValue, } if (form.slug) { payload.slug = form.slug } if (isEdit) { await updateEvent(slug, payload, token) } else { await createEvent(payload, token) } navigate('/admin/events', { replace: true }) } catch (err) { console.error('Failed to save event', err) setError(err.message || 'Unable to save event. Please try again.') } finally { setSaving(false) } } return (
Provide the event details below. Title and date are required. Slug is optional and generated automatically if left blank.
{error &&Loading event...
) : ( )}