import React, { useState, useEffect, useRef } from 'react'; import { Medication, Frequency } from '../../types'; import { medicationIcons } from '../icons/Icons'; interface AddMedicationModalProps { isOpen: boolean; onClose: () => void; onAdd: (medication: Omit) => Promise; } const AddMedicationModal: React.FC = ({ isOpen, onClose, onAdd, }) => { const [name, setName] = useState(''); const [dosage, setDosage] = useState(''); const [frequency, setFrequency] = useState(Frequency.Daily); const [hoursBetween, setHoursBetween] = useState(8); const [startTime, setStartTime] = useState('09:00'); const [notes, setNotes] = useState(''); const [icon, setIcon] = useState('pill'); const [isSaving, setIsSaving] = useState(false); const modalRef = useRef(null); const nameInputRef = useRef(null); useEffect(() => { if (isOpen) { setName(''); setDosage(''); setFrequency(Frequency.Daily); setHoursBetween(8); setStartTime('09:00'); setNotes(''); setIcon('pill'); setIsSaving(false); setTimeout(() => nameInputRef.current?.focus(), 100); } }, [isOpen]); useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { if (event.key === 'Escape' && !isSaving) onClose(); }; if (isOpen) { window.addEventListener('keydown', handleKeyDown); } return () => window.removeEventListener('keydown', handleKeyDown); }, [isOpen, onClose, isSaving]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!name || !dosage || !startTime || isSaving) { return; } setIsSaving(true); try { await onAdd({ name, dosage, frequency, hoursBetween: frequency === Frequency.EveryXHours ? hoursBetween : undefined, startTime, notes, icon, }); } catch (error) { console.error('Failed to add medication', error); alert('There was an error saving your medication. Please try again.'); setIsSaving(false); } }; if (!isOpen) return null; return (

Add New Medication

setName(e.target.value)} required ref={nameInputRef} 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' />
setDosage(e.target.value)} required 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' />
{frequency === Frequency.EveryXHours && (
setHoursBetween(parseInt(e.target.value, 10))} min='1' max='23' 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' />
)}
setStartTime(e.target.value)} required 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' />
{Object.entries(medicationIcons).map(([key, IconComponent]) => ( ))}
); }; const Spinner = () => ( ); export default AddMedicationModal;