diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index bab2ad4..5fa921b 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -1445,6 +1445,11 @@ export default function App() { + {selectedMed.slices.length > 0 && ( + + )} @@ -1557,6 +1562,63 @@ function formatDateTime(value: string) { return d.toLocaleString([], { weekday: "short", day: "2-digit", month: "short", hour: "2-digit", minute: "2-digit" }); } +function generateICS(med: Medication) { + const formatICSDate = (date: Date) => { + return date.toISOString().replace(/[-:]/g, '').replace(/\.\d{3}/, ''); + }; + + const events = med.slices.map((slice, idx) => { + const start = new Date(slice.start); + const end = new Date(start.getTime() + 15 * 60 * 1000); // 15 min duration + const interval = slice.every; + + const pillInfo = `${slice.usage} pill${slice.usage !== 1 ? 's' : ''}${med.pillWeightMg ? ` (${slice.usage * med.pillWeightMg} mg)` : ''}`; + const summary = `💊 ${med.name} - ${pillInfo}`; + const description = [ + `Medication: ${med.name}`, + med.genericName ? `Generic: ${med.genericName}` : '', + med.takenBy ? `For: ${med.takenBy}` : '', + `Dosage: ${pillInfo}`, + `Frequency: every ${interval} day${interval !== 1 ? 's' : ''}`, + med.notes ? `Notes: ${med.notes}` : '', + ].filter(Boolean).join('\\n'); + + return `BEGIN:VEVENT +UID:medassist-${med.id}-${idx}@medassist +DTSTAMP:${formatICSDate(new Date())} +DTSTART:${formatICSDate(start)} +DTEND:${formatICSDate(end)} +RRULE:FREQ=DAILY;INTERVAL=${interval} +SUMMARY:${summary} +DESCRIPTION:${description} +BEGIN:VALARM +TRIGGER:-PT5M +ACTION:DISPLAY +DESCRIPTION:Time to take ${med.name} +END:VALARM +END:VEVENT`; + }).join('\n'); + + const ics = `BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//MedAssist//Medication Schedule//EN +CALSCALE:GREGORIAN +METHOD:PUBLISH +X-WR-CALNAME:${med.name} Schedule +${events} +END:VCALENDAR`; + + const blob = new Blob([ics], { type: 'text/calendar;charset=utf-8' }); + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = `${med.name.replace(/[^a-zA-Z0-9]/g, '_')}_schedule.ics`; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + URL.revokeObjectURL(url); +} + function buildSchedulePreview(meds: Medication[]) { const events: Array<{ id: string; medName: string; timeStr: string; dateStr: string; usage: number; when: number }> = []; const now = new Date();