import React, { useState, useRef, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { Calendar, Mail, Lock, Clock, ArrowLeft, Palette, Eye, EyeOff } from 'lucide-react'; import { format, addDays } from 'date-fns'; import { enUS, de } from 'date-fns/locale'; import { toast } from 'react-toastify'; import { Button, Input, Card } from '../../components/common'; import { ThemeCustomizerEnhanced, GalleryPreview } from '../../components/admin'; import { useMutation, useQuery } from '@tanstack/react-query'; import { eventsService } from '../../services/events.service'; import { categoriesService } from '../../services/categories.service'; import { settingsService } from '../../services/settings.service'; import { useTranslation } from 'react-i18next'; import { ThemeConfig, GALLERY_THEME_PRESETS } from '../../types/theme.types'; interface FormData { event_type: string; event_name: string; event_date: string; host_name: string; host_email: string; admin_email: string; password: string; confirm_password: string; welcome_message: string; theme_preset: string; theme_config: ThemeConfig; expires_in_days: number; allow_user_uploads: boolean; upload_category_id: number | null; } const EVENT_TYPE_PRESETS: Record = { wedding: 'elegantWedding', birthday: 'birthdayFun', corporate: 'corporateTimeline', other: 'default' }; const EVENT_TYPES = [ { value: 'wedding', labelKey: 'events.types.wedding', emoji: '💒' }, { value: 'birthday', labelKey: 'events.types.birthday', emoji: '🎂' }, { value: 'corporate', labelKey: 'events.types.corporate', emoji: '🏢' }, { value: 'other', labelKey: 'events.types.other', emoji: '📸' }, ]; export const CreateEventPageEnhanced: React.FC = () => { const navigate = useNavigate(); const { t, i18n } = useTranslation(); const isMountedRef = useRef(true); const [showThemeCustomizer, setShowThemeCustomizer] = useState(false); // const [showPreview, setShowPreview] = useState(false); useEffect(() => { return () => { isMountedRef.current = false; }; }, []); const [formData, setFormData] = useState({ event_type: 'wedding', event_name: '', event_date: format(new Date(), 'yyyy-MM-dd'), host_name: '', host_email: '', admin_email: '', password: '', confirm_password: '', welcome_message: '', theme_preset: 'elegantWedding', theme_config: GALLERY_THEME_PRESETS.elegantWedding.config, expires_in_days: 30, allow_user_uploads: false, upload_category_id: null, }); const [errors, setErrors] = useState>>({}); const [showPassword, setShowPassword] = useState(false); // Fetch categories for user upload selection const { data: categories } = useQuery({ queryKey: ['categories', 'global'], queryFn: () => categoriesService.getGlobalCategories() }); // Fetch default settings const { data: settings } = useQuery({ queryKey: ['admin-settings'], queryFn: () => settingsService.getAllSettings() }); // Update default expiration days when settings are loaded useEffect(() => { if (settings?.general_default_expiration_days) { setFormData(prev => ({ ...prev, expires_in_days: settings.general_default_expiration_days })); } }, [settings]); // Update theme when event type changes useEffect(() => { const recommendedPreset = EVENT_TYPE_PRESETS[formData.event_type]; if (recommendedPreset && GALLERY_THEME_PRESETS[recommendedPreset]) { setFormData(prev => ({ ...prev, theme_preset: recommendedPreset, theme_config: GALLERY_THEME_PRESETS[recommendedPreset].config })); } }, [formData.event_type]); const createMutation = useMutation({ mutationFn: eventsService.createEvent, onSuccess: (data) => { if (isMountedRef.current) { toast.success(t('toast.eventCreated')); navigate(`/admin/events/${data.id}`); } }, onError: (error: any) => { console.error('Create event error:', error); console.error('Error response:', error.response?.data); console.error('Error status:', error.response?.status); console.error('Full error object:', JSON.stringify(error.response, null, 2)); const errorMessage = error.response?.data?.error || error.message || t('errors.eventCreationFailed'); // If validation errors exist, show them if (error.response?.data?.errors) { const validationErrors = error.response.data.errors; console.error('Validation errors:', validationErrors); validationErrors.forEach((err: any) => { toast.error(`${err.param}: ${err.msg}`); }); } else { toast.error(errorMessage); } }, }); const validateForm = (): boolean => { const newErrors: Partial> = {}; if (!formData.event_name) { newErrors.event_name = t('validation.eventNameRequired'); } if (!formData.event_date) { newErrors.event_date = t('validation.eventDateRequired'); } if (!formData.host_name) { newErrors.host_name = t('validation.hostNameRequired'); } if (!formData.host_email) { newErrors.host_email = t('validation.hostEmailRequired'); } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.host_email)) { newErrors.host_email = t('validation.invalidEmailFormat'); } if (!formData.admin_email) { newErrors.admin_email = t('validation.adminEmailRequired'); } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.admin_email)) { newErrors.admin_email = t('validation.invalidEmailFormat'); } if (!formData.password) { newErrors.password = t('validation.passwordRequired'); } else if (formData.password.length < 6) { newErrors.password = t('validation.passwordMinLength'); } if (formData.password !== formData.confirm_password) { newErrors.confirm_password = t('validation.passwordsDoNotMatch'); } if (formData.expires_in_days < 1 || formData.expires_in_days > 365) { newErrors.expires_in_days = t('validation.expirationRange'); } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) { return; } const payload = { event_type: formData.event_type, event_name: formData.event_name, event_date: formData.event_date, host_name: formData.host_name, host_email: formData.host_email, admin_email: formData.admin_email, password: formData.password, welcome_message: formData.welcome_message || '', color_theme: JSON.stringify(formData.theme_config), expiration_days: formData.expires_in_days, allow_user_uploads: formData.allow_user_uploads, upload_category_id: formData.upload_category_id, }; console.log('Submitting payload:', payload); createMutation.mutate(payload); }; const handleInputChange = (field: keyof FormData) => ( e: React.ChangeEvent ) => { setFormData({ ...formData, [field]: e.target.value }); setErrors({ ...errors, [field]: undefined }); }; const handleThemeChange = (newTheme: ThemeConfig) => { setFormData(prev => ({ ...prev, theme_config: newTheme })); }; const handlePresetChange = (presetName: string) => { const preset = GALLERY_THEME_PRESETS[presetName]; if (preset) { setFormData(prev => ({ ...prev, theme_preset: presetName, theme_config: preset.config })); } }; return (

{t('events.create')}

{/* Event Details */}

{t('events.eventDetails')}

{EVENT_TYPES.map((type) => ( ))}
} /> } />