import React from 'react'; import { Medication, Dose, DoseStatus } from '../../types'; import { ClockIcon, CheckCircleIcon, XCircleIcon, InfoIcon, getMedicationIcon, ZzzIcon, } from '../icons/Icons'; interface DoseCardProps { dose: Dose & { takenAt?: string }; medication: Medication; status: DoseStatus; onToggleDose: (doseId: string) => void; onSnooze: (doseId: string) => void; snoozedUntil?: Date; } const statusStyles = { [DoseStatus.UPCOMING]: { bg: 'bg-white dark:bg-slate-800', icon: , text: 'text-slate-500 dark:text-slate-400', button: 'border-indigo-600 text-indigo-600 hover:bg-indigo-600 hover:text-white dark:text-indigo-400 dark:border-indigo-400 dark:hover:bg-indigo-400 dark:hover:text-white', buttonText: 'Take', ring: 'hover:ring-indigo-300 dark:hover:ring-indigo-500', }, [DoseStatus.TAKEN]: { bg: 'bg-green-50 dark:bg-green-900/20', icon: ( ), text: 'text-green-700 dark:text-green-400', button: 'border-green-500 text-green-500 hover:bg-green-500 hover:text-white dark:text-green-400 dark:border-green-400 dark:hover:bg-green-400 dark:hover:text-slate-900', buttonText: 'Untake', ring: '', }, [DoseStatus.MISSED]: { bg: 'bg-red-50 dark:bg-red-900/20', icon: , text: 'text-red-700 dark:text-red-400', button: 'border-red-500 text-red-500 hover:bg-red-500 hover:text-white dark:text-red-400 dark:border-red-400 dark:hover:bg-red-400 dark:hover:text-slate-900', buttonText: 'Take Now', ring: '', }, [DoseStatus.SNOOZED]: { bg: 'bg-amber-50 dark:bg-amber-900/20', icon: , text: 'text-amber-700 dark:text-amber-400', button: 'border-indigo-600 text-indigo-600 hover:bg-indigo-600 hover:text-white dark:text-indigo-400 dark:border-indigo-400 dark:hover:bg-indigo-400 dark:hover:text-white', buttonText: 'Take', ring: '', }, }; const DoseCard: React.FC = ({ dose, medication, status, onToggleDose, onSnooze, snoozedUntil, }) => { const styles = statusStyles[status]; const timeString = dose.scheduledTime.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', }); const takenTimeString = dose.takenAt ? new Date(dose.takenAt).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', }) : ''; const snoozedTimeString = snoozedUntil ? snoozedUntil.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit', }) : ''; const MedicationIcon = getMedicationIcon(medication.icon); return ( {medication.name} {medication.dosage} {styles.icon} {timeString} {status === DoseStatus.SNOOZED && ( Snoozed until {snoozedTimeString} )} {status === DoseStatus.TAKEN && ( Taken at {takenTimeString} )} {medication.notes && ( {medication.notes} )} {status === DoseStatus.UPCOMING && ( onSnooze(dose.id)} className='w-1/3 py-2 px-2 rounded-lg font-semibold border-2 transition-colors duration-200 border-slate-300 text-slate-500 hover:bg-slate-100 dark:border-slate-600 dark:text-slate-400 dark:hover:bg-slate-700' aria-label={`Snooze ${medication.name} for 5 minutes`} > )} onToggleDose(dose.id)} className={`w-full py-2 px-4 rounded-lg font-semibold border-2 transition-colors duration-200 ${styles.button}`} aria-label={`${styles.buttonText} ${medication.name} at ${timeString}`} > {styles.buttonText} ); }; export default DoseCard;
{medication.dosage}
Snoozed until {snoozedTimeString}
Taken at {takenTimeString}
{medication.notes}