import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useToast } from '../Shared/ToastContext'; import { createCalendar, createRemoteCalendar, testConnection, } from '../../utils/caldavService'; interface CalendarFormProps { onComplete: () => void; onCancel: () => void; } const DEFAULT_COLORS = [ '#3b82f6', '#ef4444', '#10b981', '#f59e0b', '#8b5cf6', '#ec4899', '#06b6d4', '#84cc16', ]; const CalendarForm: React.FC = ({ onComplete, onCancel }) => { const { t } = useTranslation(); const { showSuccessToast, showErrorToast } = useToast(); const [formData, setFormData] = useState({ calendarName: '', calendarDescription: '', calendarColor: DEFAULT_COLORS[0], serverUrl: '', calendarPath: '', username: '', password: '', authType: 'basic' as 'basic' | 'bearer', syncDirection: 'bidirectional' as 'bidirectional' | 'pull' | 'push', syncInterval: 15, conflictResolution: 'manual' as 'last_write_wins' | 'local_wins' | 'remote_wins' | 'manual', enabled: true, }); const [testResult, setTestResult] = useState<{ success: boolean; message: string; } | null>(null); const [isTesting, setIsTesting] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); const [errors, setErrors] = useState>({}); const validateForm = (): boolean => { const newErrors: Record = {}; if (!formData.calendarName.trim()) { newErrors.calendarName = t( 'profile.caldavWizard.calendarNameRequired', 'Calendar name is required' ); } if (!formData.serverUrl.trim()) { newErrors.serverUrl = t( 'profile.caldavWizard.serverUrlRequired', 'Server URL is required' ); } if (!formData.calendarPath.trim()) { newErrors.calendarPath = t( 'profile.caldavWizard.calendarPathRequired', 'Calendar path is required' ); } if (!formData.username.trim()) { newErrors.username = t( 'profile.caldavWizard.credentialsRequired', 'Username is required' ); } if (!formData.password.trim()) { newErrors.password = t( 'profile.caldavWizard.credentialsRequired', 'Password is required' ); } if (!testResult?.success) { newErrors.connection = t( 'profile.caldavWizard.testRequired', 'You must test the connection before saving' ); } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleTestConnection = async () => { if (!formData.serverUrl.trim() || !formData.calendarPath.trim() || !formData.username.trim() || !formData.password.trim()) { showErrorToast(t( 'profile.caldavWizard.fillServerDetails', 'Please fill in all server connection details first' )); return; } setIsTesting(true); setTestResult(null); setErrors({}); try { const result = await testConnection({ server_url: formData.serverUrl, calendar_path: formData.calendarPath, username: formData.username, password: formData.password, }); setTestResult({ success: result.success && result.supportsCalDAV, message: result.message, }); if (result.success && result.supportsCalDAV) { showSuccessToast( t( 'profile.caldavWizard.connectionSuccess', 'Connection successful!' ) ); } else { showErrorToast(result.message); } } catch (err: any) { const message = err.message || t( 'profile.caldavWizard.connectionFailed', 'Failed to connect to server' ); setTestResult({ success: false, message }); showErrorToast(message); } finally { setIsTesting(false); } }; const handleSubmit = async (e?: React.FormEvent) => { if (e) { e.preventDefault(); e.stopPropagation(); } if (!validateForm()) { showErrorToast( t( 'profile.caldavWizard.validationError', 'Please fill in all required fields and test the connection' ) ); return; } setIsSubmitting(true); try { const calendar = await createCalendar({ name: formData.calendarName, description: formData.calendarDescription || null, color: formData.calendarColor, enabled: formData.enabled, sync_direction: formData.syncDirection, sync_interval_minutes: formData.syncInterval, conflict_resolution: formData.conflictResolution, }); await createRemoteCalendar({ local_calendar_id: calendar.id, name: formData.calendarName, server_url: formData.serverUrl, calendar_path: formData.calendarPath, username: formData.username, password: formData.password, auth_type: formData.authType, }); showSuccessToast( t( 'profile.caldavWizard.setupSuccess', 'Calendar configured successfully!' ) ); onComplete(); } catch (err: any) { showErrorToast( err.message || t( 'profile.caldavWizard.setupFailed', 'Failed to create calendar' ) ); } finally { setIsSubmitting(false); } }; const handleCreateClick = (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); handleSubmit(); }; return (

{t('profile.caldavWizard.calendarSettings', 'Calendar Settings')}

{ setFormData({ ...formData, calendarName: e.target.value }); setErrors({ ...errors, calendarName: '' }); }} className={`block w-full border rounded-md px-3 py-2 bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500 ${ errors.calendarName ? 'border-red-500' : 'border-gray-300 dark:border-gray-600' }`} placeholder={t('profile.caldavWizard.calendarNamePlaceholder', 'e.g., Work Tasks')} /> {errors.calendarName && (

{errors.calendarName}

)}