import React, { useEffect, useRef, useState } from 'react' import { FaBuilding, FaUser, FaEnvelope, FaPhone, FaMapPin, FaUsers, FaRegComment, FaPaperPlane, FaCheckCircle, } from 'react-icons/fa' import { useLocalization } from '@/utils/hooks/useLocalization' import { createDemoAsync } from '@/services/demo.service' import { DemoDto } from '@/proxy/demo/models' import { Button, Notification, toast } from '@/components/ui' import { translateLabel } from './localization' import Input from '@/components/ui/Input' interface DemoModalProps { isOpen: boolean onClose: () => void } type DemoErrors = Partial> const NUMERIC_FIELDS: Array = ['numberOfBranches', 'numberOfUsers'] function createEmptyForm(): DemoDto { return { id: crypto.randomUUID(), organizationName: '', name: '', email: '', phoneNumber: '', address: '', numberOfBranches: 0, numberOfUsers: 0, message: '', } } const inputClass = (hasError: boolean) => `w-full rounded-xl border bg-gray-50 py-2.5 pl-11 pr-4 text-gray-800 placeholder-gray-500 transition-all duration-300 focus:outline-none dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-400 ${ hasError ? 'border-red-500 focus:border-red-500 focus:ring-red-500/20' : 'border-gray-200 focus:border-blue-500 focus:ring-blue-500/20 dark:border-gray-700' }` interface FieldProps { label: string error?: string icon: React.ReactNode children: React.ReactNode } const Field: React.FC = ({ label, error, icon, children }) => (
{icon} {children}
{error &&

{error}

}
) const Demo: React.FC = ({ isOpen, onClose }) => { const { translate } = useLocalization() const [formData, setFormData] = useState(createEmptyForm) const [errors, setErrors] = useState({}) const [isSubmitting, setIsSubmitting] = useState(false) const [isSubmitted, setIsSubmitted] = useState(false) const firstFieldRef = useRef(null) useEffect(() => { if (!isOpen) { return } const handleKeyDown = (event: KeyboardEvent) => { if (event.key === 'Escape') { onClose() } } window.addEventListener('keydown', handleKeyDown) firstFieldRef.current?.focus() return () => window.removeEventListener('keydown', handleKeyDown) }, [isOpen, onClose]) const requiredMessage = translateLabel(translate, 'App.Validation.Required') const handleInputChange = ( event: React.ChangeEvent, ) => { const { name, value } = event.target const key = name as keyof DemoDto setFormData((previous) => ({ ...previous, // Sayisal alanlar string olarak saklanirsa sunucu tarafinda tip hatasi olusuyor. [key]: NUMERIC_FIELDS.includes(key) ? Number(value) || 0 : value, })) setErrors((previous) => (previous[key] ? { ...previous, [key]: undefined } : previous)) } const validateForm = () => { const nextErrors: DemoErrors = {} if (!formData.organizationName.trim()) nextErrors.organizationName = requiredMessage if (!formData.name.trim()) nextErrors.name = requiredMessage if (!formData.email.trim()) { nextErrors.email = requiredMessage } else if (!/\S+@\S+\.\S+/.test(formData.email)) { nextErrors.email = translateLabel(translate, 'App.Validation.InvalidEmail') } if (!formData.phoneNumber.trim()) nextErrors.phoneNumber = requiredMessage if (!formData.address.trim()) nextErrors.address = requiredMessage if (!formData.message.trim()) nextErrors.message = requiredMessage setErrors(nextErrors) return Object.keys(nextErrors).length === 0 } const handleSubmit = async (event: React.FormEvent) => { event.preventDefault() if (isSubmitting || !validateForm()) { return } setIsSubmitting(true) try { await createDemoAsync(formData) setIsSubmitted(true) } catch (error) { console.error('Demo talebi gonderilemedi:', error) toast.push( {translateLabel(translate, 'App.Errors.ServerUnreachable')} , { placement: 'bottom-end' }, ) } finally { setIsSubmitting(false) } } const resetForm = () => { setIsSubmitted(false) setErrors({}) setFormData(createEmptyForm()) } if (!isOpen && !isSubmitted) { return null } if (isSubmitted) { return (

{translate('::App.PublicDemo.ThankYou')}

{translate('::App.PublicDemo.ResultMessage')}

) } return (

{translate('::App.PublicDemo.DemoTitle')}

{translate('::App.PublicDemo.Subtitle')}

} > } >
} > } >
} >