import { FormData } from './types'; export class ApiError extends Error { constructor(message: string) { super(message); this.name = 'ApiError'; } } const FORM_PATH = '/holidays/wp-admin/admin-ajax.php'; const getSubmissionUrl = (): string => { if (typeof window !== 'undefined') { if (window.location.hostname.includes('thetimes')) { return `${window.location.origin}${FORM_PATH}`; } return `https://www.staging-thetimes.com${FORM_PATH}`; } return `https://www.thetimes.com${FORM_PATH}`; }; const buildComments = (comments: string): string => { const pageUrl = typeof window !== 'undefined' ? window.location.href : ''; const pageTitle = typeof document !== 'undefined' ? document.title : ''; return [comments, `\nSubmitted from: ${pageUrl}`, `Page title: ${pageTitle}`] .filter(Boolean) .join('\n'); }; const buildRequestBody = (formData: FormData): string => { const body = new URLSearchParams(); const requiredFields: Record = { action: 'tt_ContactUsHook', first_name: formData.firstName, last_name: formData.lastName, telephone_number: formData.telephone, email_address: formData.email, depart_from: formData.departurePort, destination: formData.destination, month: formData.month, year: formData.year, duration: formData.duration, adults: formData.adults, children: formData.children, budget: `${formData.budgetMin},${formData.budgetMax}` }; Object.keys(requiredFields).forEach((key: string) => { body.append(key, requiredFields[key]); }); // Contact type (optional) const contactMethods: string[] = []; if (formData.contactByTelephone) { contactMethods.push('Telephone'); } if (formData.contactByEmail) { contactMethods.push('Email'); } if (contactMethods.length > 0) { body.append('contact_type', contactMethods.join(', ')); } // Appointment type (optional) const appointmentTypes: string[] = []; if (formData.appointmentVideoCall) { appointmentTypes.push('Video call'); } if (formData.appointmentTelephoneCall) { appointmentTypes.push('Telephone call'); } if (appointmentTypes.length > 0) { body.append('appointment_type', appointmentTypes.join(', ')); } // Appointment date & time (optional) if (formData.preferredDate) { body.append('appointment_date', formData.preferredDate); } if (formData.preferredTime) { body.append('appointment_time', formData.preferredTime); } // Discount code (optional) if (formData.subscriberCode) { body.append('discount_code', formData.subscriberCode); } // Comments (optional) const comments = buildComments(formData.comments); if (comments) { body.append('comments', comments); } // Newsletter opt-in (optional) if (formData.newsletterOptIn) { body.append('newsletter', '1'); } return body.toString(); }; export const submitEnquiry = async (formData: FormData): Promise => { const response = await fetch(getSubmissionUrl(), { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'X-Requested-With': 'XMLHttpRequest' }, body: buildRequestBody(formData), mode: 'cors', credentials: 'omit' }); const data = await response.json().catch(() => ({})); if (!response.ok || !data.success) { if (data && data.data) { throw new ApiError(data.data); } throw new Error(`HTTP error ${response.status}`); } };