import React, { useState, useEffect } from 'react'; import { IoIosBusiness, IoIosContact, IoIosTime, IoIosRefresh } from 'react-icons/io'; import sharedStyles from '../PageManager/pages.module.css'; import styles from './SpeechSettings.module.css'; import { useLanguage } from '../../contexts/LanguageContext'; interface MandateData { id: string; mandate_general: { company_name: string; industry: string; contact_info: { email: string; phone: string; street: string; postal_code: string; city: string; country: string; }; business_hours: string; timezone: string; }; setup_contacts: boolean; } interface SpeechSettingsProps { onDataUpdate?: (data: MandateData) => void; } function SpeechSettings({ onDataUpdate }: SpeechSettingsProps) { const { t } = useLanguage(); const [formData, setFormData] = useState(null); const [isLoading, setIsLoading] = useState(true); const [isSaving, setIsSaving] = useState(false); const [saveMessage, setSaveMessage] = useState<{ type: 'success' | 'error', text: string } | null>(null); const [focusedFields, setFocusedFields] = useState>(new Set()); // Load data from localStorage on component mount useEffect(() => { const loadSpeechData = () => { try { const savedData = localStorage.getItem('speechSignUpData'); const timestamp = localStorage.getItem('speechSignUpTimestamp'); if (savedData && timestamp) { const parsedData = JSON.parse(savedData); const savedTime = parseInt(timestamp); const now = Date.now(); const twentyFourHours = 24 * 60 * 60 * 1000; // Check if data is still valid (within 24 hours) if (now - savedTime < twentyFourHours) { setFormData(parsedData); } else { // Data expired, clear it localStorage.removeItem('speechSignUpData'); localStorage.removeItem('speechSignUpTimestamp'); } } } catch (error) { console.error('Error loading speech data:', error); } finally { setIsLoading(false); } }; loadSpeechData(); }, []); const handleInputChange = (field: string, value: string) => { if (!formData) return; const newData = { ...formData }; const fieldParts = field.split('.'); if (fieldParts.length === 2) { // Handle nested fields like mandate_general.company_name const [parent, child] = fieldParts; if (parent === 'mandate_general' && child in newData.mandate_general) { (newData.mandate_general as any)[child] = value; } } else if (fieldParts.length === 3) { // Handle deeply nested fields like mandate_general.contact_info.email const [parent, child, grandchild] = fieldParts; if (parent === 'mandate_general' && child === 'contact_info' && grandchild in newData.mandate_general.contact_info) { (newData.mandate_general.contact_info as any)[grandchild] = value; } } else if (field === 'setup_contacts') { newData.setup_contacts = value === 'true'; } setFormData(newData); setSaveMessage(null); }; const handleFocus = (field: string) => { setFocusedFields(prev => new Set(prev).add(field)); }; const handleBlur = (field: string) => { setFocusedFields(prev => { const newSet = new Set(prev); newSet.delete(field); return newSet; }); }; const handleSave = async () => { if (!formData) return; setIsSaving(true); try { // Save to localStorage localStorage.setItem('speechSignUpData', JSON.stringify(formData)); localStorage.setItem('speechSignUpTimestamp', Date.now().toString()); // Dispatch event to notify other components window.dispatchEvent(new CustomEvent('speechSignUpChanged')); setSaveMessage({ type: 'success', text: t('speech.settings.save_success') }); // Notify parent component if callback provided if (onDataUpdate) { onDataUpdate(formData); } // Clear message after 3 seconds setTimeout(() => setSaveMessage(null), 3000); } catch (error) { console.error('Error saving speech settings:', error); setSaveMessage({ type: 'error', text: t('speech.settings.save_error') }); } finally { setIsSaving(false); } }; const handleReset = () => { if (window.confirm(t('speech.settings.reset_confirm'))) { localStorage.removeItem('speechSignUpData'); localStorage.removeItem('speechSignUpTimestamp'); window.dispatchEvent(new CustomEvent('speechSignUpChanged')); setFormData(null); setSaveMessage({ type: 'success', text: t('speech.settings.reset_success') }); setTimeout(() => setSaveMessage(null), 3000); } }; if (isLoading) { return (
{t('common.loading')}
); } if (!formData) { return (

{t('speech.settings.no_data')}

); } return (

{t('speech.settings.title')}

{t('speech.settings.description')}

{saveMessage && (
{saveMessage.text}
)}
{/* Company Information Section */}

{t('speech.settings.company_info')}

handleInputChange('mandate_general.company_name', e.target.value)} onFocus={() => handleFocus('company_name')} onBlur={() => handleBlur('company_name')} required />
handleInputChange('mandate_general.industry', e.target.value)} onFocus={() => handleFocus('industry')} onBlur={() => handleBlur('industry')} required />
{/* Contact Information Section */}

{t('speech.settings.contact_info')}

handleInputChange('mandate_general.contact_info.email', e.target.value)} onFocus={() => handleFocus('email')} onBlur={() => handleBlur('email')} required />
handleInputChange('mandate_general.contact_info.phone', e.target.value)} onFocus={() => handleFocus('phone')} onBlur={() => handleBlur('phone')} required />
handleInputChange('mandate_general.contact_info.street', e.target.value)} onFocus={() => handleFocus('street')} onBlur={() => handleBlur('street')} required />
handleInputChange('mandate_general.contact_info.postal_code', e.target.value)} onFocus={() => handleFocus('postal_code')} onBlur={() => handleBlur('postal_code')} required />
handleInputChange('mandate_general.contact_info.city', e.target.value)} onFocus={() => handleFocus('city')} onBlur={() => handleBlur('city')} required />
handleInputChange('mandate_general.contact_info.country', e.target.value)} onFocus={() => handleFocus('country')} onBlur={() => handleBlur('country')} required />
{/* Business Hours Section */}

{t('speech.settings.business_hours')}

handleInputChange('mandate_general.business_hours', e.target.value)} onFocus={() => handleFocus('business_hours')} onBlur={() => handleBlur('business_hours')} required />
{/* Actions */}
); } export default SpeechSettings;