import React, { useState, useEffect, useRef } from 'react'; import { CustomReminder } from '../../types'; import { reminderIcons } from '../icons/Icons'; import { MIN_REMINDER_FREQUENCY_MINUTES, MAX_REMINDER_FREQUENCY_MINUTES, validateReminderInputs, } from './reminderValidation'; import { logger } from '../../services/logging'; interface AddReminderModalProps { isOpen: boolean; onClose: () => void; onAdd: (reminder: Omit) => Promise; } const AddReminderModal: React.FC = ({ isOpen, onClose, onAdd, }) => { const [title, setTitle] = useState(''); const [icon, setIcon] = useState('bell'); const [frequencyMinutes, setFrequencyMinutes] = useState(60); const [startTime, setStartTime] = useState('09:00'); const [endTime, setEndTime] = useState('17:00'); const [isSaving, setIsSaving] = useState(false); const [errors, setErrors] = useState<{ frequency?: string; timeRange?: string; }>({}); const titleInputRef = useRef(null); const validate = () => { return validateReminderInputs({ frequencyMinutes, startTime, endTime, }); }; useEffect(() => { if (isOpen) { setTitle(''); setIcon('bell'); setFrequencyMinutes(60); setStartTime('09:00'); setEndTime('17:00'); setIsSaving(false); setErrors({}); setTimeout(() => titleInputRef.current?.focus(), 100); } }, [isOpen]); useEffect(() => { if (!isOpen) return; setErrors(validate()); }, [isOpen, frequencyMinutes, startTime, endTime]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!title || isSaving) return; const validation = validate(); setErrors(validation); if (Object.keys(validation).length > 0) { return; } setIsSaving(true); try { await onAdd({ title, icon, frequencyMinutes, startTime, endTime, }); } catch (error) { logger.ui.error('Failed to add reminder', error as Error); alert('There was an error saving your reminder. Please try again.'); } finally { setIsSaving(false); } }; if (!isOpen) return null; return (

Add New Reminder

setTitle(e.target.value)} required ref={titleInputRef} className='mt-1 block w-full px-3 py-2 border border-slate-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm bg-white dark:bg-slate-700 dark:border-slate-600 dark:placeholder-slate-400 dark:text-white' placeholder='e.g., Drink water' />
{Object.entries(reminderIcons).map(([key, IconComponent]) => ( ))}
setFrequencyMinutes( Number.isNaN(parseInt(e.target.value, 10)) ? 0 : parseInt(e.target.value, 10) ) } min={MIN_REMINDER_FREQUENCY_MINUTES} max={MAX_REMINDER_FREQUENCY_MINUTES} aria-invalid={Boolean(errors.frequency)} aria-describedby='rem-frequency-help' className='mt-1 block w-full px-3 py-2 border border-slate-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm bg-white dark:bg-slate-700 dark:border-slate-600' />

{errors.frequency ? errors.frequency : `Minimum ${MIN_REMINDER_FREQUENCY_MINUTES} minutes, maximum ${MAX_REMINDER_FREQUENCY_MINUTES} minutes.`}

setStartTime(e.target.value)} required aria-invalid={Boolean(errors.timeRange)} aria-describedby={ errors.timeRange ? 'rem-time-help' : undefined } className='mt-1 block w-full px-3 py-2 border border-slate-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm bg-white dark:bg-slate-700 dark:border-slate-600' />
setEndTime(e.target.value)} required aria-invalid={Boolean(errors.timeRange)} aria-describedby={ errors.timeRange ? 'rem-time-help' : undefined } className='mt-1 block w-full px-3 py-2 border border-slate-300 rounded-md shadow-sm focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 sm:text-sm bg-white dark:bg-slate-700 dark:border-slate-600' />
{errors.timeRange && (

{errors.timeRange}

)}
); }; export default AddReminderModal;