"use client"; import { useState, FormEvent, useEffect, useRef } from 'react'; import { createTicket, CreateTicketData } from '@/lib/api/supportService'; import { useTicketCategories } from '@/lib/hooks/useSupport'; interface CreateTicketFormProps { onOpenStatusCheck?: () => void; } const CreateTicketForm = ({ onOpenStatusCheck }: CreateTicketFormProps) => { const { categories, loading: categoriesLoading } = useTicketCategories(); const [formData, setFormData] = useState({ title: '', description: '', ticket_type: 'general', user_name: '', user_email: '', user_phone: '', company: '', category: undefined }); const [isSubmitting, setIsSubmitting] = useState(false); const [submitError, setSubmitError] = useState(null); const [submitSuccess, setSubmitSuccess] = useState(false); const [ticketNumber, setTicketNumber] = useState(''); const [fieldErrors, setFieldErrors] = useState>({}); // Refs for scrolling to messages const errorRef = useRef(null); const successRef = useRef(null); const formRef = useRef(null); // Scroll to error/success messages when they appear useEffect(() => { if (submitError && errorRef.current) { setTimeout(() => { errorRef.current?.scrollIntoView({ behavior: 'smooth', block: 'center' }); }, 100); } }, [submitError]); useEffect(() => { if (submitSuccess && successRef.current) { setTimeout(() => { successRef.current?.scrollIntoView({ behavior: 'smooth', block: 'center' }); }, 100); } }, [submitSuccess]); // Scroll to first validation error useEffect(() => { if (Object.keys(fieldErrors).length > 0 && formRef.current) { const firstErrorField = formRef.current.querySelector('.field-error'); if (firstErrorField) { setTimeout(() => { firstErrorField.scrollIntoView({ behavior: 'smooth', block: 'center' }); }, 100); } } }, [fieldErrors]); const handleInputChange = ( e: React.ChangeEvent ) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: name === 'category' ? (value ? parseInt(value) : undefined) : value })); // Clear field error when user starts typing if (fieldErrors[name]) { setFieldErrors(prev => ({ ...prev, [name]: '' })); } }; const validateForm = () => { const errors: Record = {}; if (!formData.user_name.trim()) { errors.user_name = 'Full name is required'; } if (!formData.user_email.trim()) { errors.user_email = 'Email address is required'; } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.user_email)) { errors.user_email = 'Please enter a valid email address'; } if (!formData.title.trim()) { errors.title = 'Subject is required'; } if (!formData.description.trim()) { errors.description = 'Description is required'; } else if (formData.description.trim().length < 10) { errors.description = 'Please provide a more detailed description (minimum 10 characters)'; } setFieldErrors(errors); return Object.keys(errors).length === 0; }; const handleSubmit = async (e: FormEvent) => { e.preventDefault(); if (!validateForm()) { // Scroll to first error after validation setTimeout(() => { const firstErrorField = formRef.current?.querySelector('.field-error'); if (firstErrorField) { firstErrorField.scrollIntoView({ behavior: 'smooth', block: 'center' }); } }, 100); return; } setIsSubmitting(true); setSubmitError(null); setSubmitSuccess(false); try { const response = await createTicket(formData); setTicketNumber(response.ticket_number); setSubmitSuccess(true); // Reset form setFormData({ title: '', description: '', ticket_type: 'general', user_name: '', user_email: '', user_phone: '', company: '', category: undefined }); setFieldErrors({}); } catch (error: any) { console.error('Ticket creation error:', error); // Provide user-friendly error messages based on error type let errorMessage = 'Failed to submit ticket. Please try again.'; if (error.message) { if (error.message.includes('email')) { errorMessage = 'There was an issue with your email address. Please check and try again.'; } else if (error.message.includes('network') || error.message.includes('fetch')) { errorMessage = 'Network error. Please check your connection and try again.'; } else if (error.message.includes('validation')) { errorMessage = 'Please check all required fields and try again.'; } else if (error.message.includes('server') || error.message.includes('500')) { errorMessage = 'Server error. Our team has been notified. Please try again later.'; } else { // Use the actual error message if it's user-friendly errorMessage = error.message; } } setSubmitError(errorMessage); } finally { setIsSubmitting(false); } }; if (submitSuccess) { return (

Ticket Created Successfully!

Your Ticket Number
{ticketNumber}

We've received your support request and will respond as soon as possible. Please save your ticket number for future reference.

{onOpenStatusCheck && ( )}
); } const issueTypeIcons: Record = { general: 'fa-info-circle', technical: 'fa-tools', billing: 'fa-credit-card', feature_request: 'fa-lightbulb', bug_report: 'fa-bug', account: 'fa-user-circle' }; return (

Submit a Support Ticket

Fill out the form below and our dedicated support team will get back to you within 24 hours.

Secure & Confidential All tickets are encrypted and handled with enterprise-grade security standards.
{submitError && (
Submission Error

{submitError}

)}
{/* Personal Information */}

Personal Information

{fieldErrors.user_name && ( {fieldErrors.user_name} )}
{fieldErrors.user_email && ( {fieldErrors.user_email} )}
{/* Ticket Details */}

Ticket Details

{fieldErrors.title && ( {fieldErrors.title} )}