/** * Contact API Service * Handles communication with the Django REST API for contact form submissions */ import { API_CONFIG } from '@/lib/config/api'; export interface ContactFormData { first_name: string; last_name: string; email: string; phone?: string; company: string; job_title: string; industry?: string; company_size?: string; project_type?: string; timeline?: string; budget?: string; message: string; newsletter_subscription: boolean; privacy_consent: boolean; } export interface ContactSubmissionResponse { message: string; submission_id: number; status: string; } export interface ApiError { message: string; errors?: Record; status: number; } class ContactApiService { private baseUrl: string; constructor() { this.baseUrl = `${API_CONFIG.BASE_URL}${API_CONFIG.ENDPOINTS.CONTACT}`; } /** * Submit a contact form to the Django API */ async submitContactForm(data: ContactFormData): Promise { try { const response = await fetch(`${this.baseUrl}/submissions/`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(data), }); if (!response.ok) { const errorData = await response.json().catch(() => ({})); throw new Error( errorData.message || errorData.detail || `HTTP error! status: ${response.status}` ); } const result = await response.json(); return result; } catch (error) { if (error instanceof Error) { throw new Error(`Failed to submit contact form: ${error.message}`); } throw new Error('Failed to submit contact form: Unknown error'); } } /** * Get contact submission statistics (admin only) */ async getContactStats(): Promise { try { const response = await fetch(`${this.baseUrl}/submissions/stats/`, { method: 'GET', headers: { 'Content-Type': 'application/json', }, }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } return await response.json(); } catch (error) { if (error instanceof Error) { throw new Error(`Failed to fetch contact stats: ${error.message}`); } throw new Error('Failed to fetch contact stats: Unknown error'); } } /** * Get recent contact submissions (admin only) */ async getRecentSubmissions(): Promise { try { const response = await fetch(`${this.baseUrl}/submissions/recent/`, { method: 'GET', headers: { 'Content-Type': 'application/json', }, }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } return await response.json(); } catch (error) { if (error instanceof Error) { throw new Error(`Failed to fetch recent submissions: ${error.message}`); } throw new Error('Failed to fetch recent submissions: Unknown error'); } } } // Create and export a singleton instance export const contactApiService = new ContactApiService(); // Export the class for testing purposes export default ContactApiService;