// Schedule & Intake Log — slot-based, collapsed by default
const { TODAY_INTAKE: INTAKE_SEED, MED: MED_S, REGIMENS: REGS_S } = window.MESHI;
const SchedulePage = () => {
const [intake, setIntake] = useState(INTAKE_SEED);
const [day, setDay] = useState(5);
const [expanded, setExpanded] = useState(null); // slot time
const weekDays = ['Mon 13', 'Tue 14', 'Wed 15', 'Thu 16', 'Fri 17', 'Sat 18', 'Sun 19'];
const adherence = [1.0, 1.0, 1.0, 0.88, 1.0, 0.50, 0.0];
const toggle = (id) => setIntake(intake.map(i => i.id === id ? { ...i, status: i.status === 'taken' ? 'upcoming' : 'taken', takenAt: '21:04' } : i));
const markSlot = (time) => setIntake(intake.map(i => i.scheduled === time ? { ...i, status: 'taken', takenAt: time } : i));
// Group by scheduled time
const slots = [
{ time: '08:00', label: 'Morning', icon: 'sun' },
{ time: '21:00', label: 'Evening', icon: 'moon' },
].map(s => {
const items = intake.filter(i => i.scheduled === s.time);
const done = items.filter(i => i.status === 'taken').length;
return { ...s, items, done, total: items.length, complete: done === items.length && items.length > 0 };
});
const totalDone = intake.filter(i => i.status === 'taken').length;
return (
{/* Week strip — adherence heatmap */}
This week
{Math.round(adherence.reduce((a,b)=>a+b,0)/adherence.length*100)}% adherence
{weekDays.map((d, i) => {
const isToday = i === day;
const a = adherence[i];
return (
Saturday, April 18
{totalDone} of {intake.length} doses · 18:30 now
{slots.map(slot => {
const isOpen = expanded === slot.time;
const now = 18.5;
const slotHr = parseInt(slot.time);
const status = slot.complete ? 'done' : slotHr < now ? 'overdue' : 'upcoming';
return (
{isOpen && (
{slot.items.map(i => {
const m = MED_S[i.medId];
return (
toggle(i.id)}>
{i.status === 'taken' && }
{m.name}
{i.qty} {m.form.toLowerCase()} · {m.strength}
{i.status === 'taken' && {i.takenAt}}
);
})}
)}
);
})}
Tap a slot to see individual medicines. Off-schedule doses logged separately.
Active regimens
{REGS_S.length} configured
{REGS_S.map(r => (
Aeri's {r.name}
{r.time} · {r.freq}
Active
{r.items.map(it => {
const m = MED_S[it.medId];
return (
{m.name}
);
})}
))}
);
};
window.SchedulePage = SchedulePage;