Files
rxminder/utils/schedule.ts
William Valentin e48adbcb00 Initial commit: Complete NodeJS-native setup
- Migrated from Python pre-commit to NodeJS-native solution
- Reorganized documentation structure
- Set up Husky + lint-staged for efficient pre-commit hooks
- Fixed Dockerfile healthcheck issue
- Added comprehensive documentation index
2025-09-06 01:42:48 -07:00

108 lines
3.2 KiB
TypeScript

import {
Medication,
Dose,
Frequency,
CustomReminder,
ReminderInstance,
} from '../types';
export const generateSchedule = (
medications: Medication[],
forDate: Date
): Dose[] => {
const schedule: Dose[] = [];
const today = new Date(forDate);
today.setHours(0, 0, 0, 0);
medications.forEach(med => {
const [startHour, startMinute] = med.startTime.split(':').map(Number);
const createDose = (hour: number, minute: number): Dose => {
const scheduledTime = new Date(today);
scheduledTime.setHours(hour, minute, 0, 0);
const dateString = scheduledTime.toISOString().split('T')[0];
const timeString = scheduledTime
.toTimeString()
.split(' ')[0]
.replace(/:/g, '');
return {
id: `${med._id}-${dateString}-${timeString}`,
medicationId: med._id,
scheduledTime,
};
};
switch (med.frequency) {
case Frequency.Daily:
schedule.push(createDose(startHour, startMinute));
break;
case Frequency.TwiceADay:
schedule.push(createDose(startHour, startMinute));
schedule.push(createDose((startHour + 12) % 24, startMinute));
break;
case Frequency.ThreeTimesADay:
schedule.push(createDose(startHour, startMinute));
schedule.push(createDose((startHour + 8) % 24, startMinute));
schedule.push(createDose((startHour + 16) % 24, startMinute));
break;
case Frequency.EveryXHours:
if (med.hoursBetween && med.hoursBetween > 0) {
for (let h = 0; h < 24; h += med.hoursBetween) {
schedule.push(createDose((startHour + h) % 24, startMinute));
}
}
break;
}
});
return schedule.sort(
(a, b) => a.scheduledTime.getTime() - b.scheduledTime.getTime()
);
};
export const generateReminderSchedule = (
reminders: CustomReminder[],
forDate: Date
): ReminderInstance[] => {
const schedule: ReminderInstance[] = [];
const today = new Date(forDate);
today.setHours(0, 0, 0, 0);
reminders.forEach(reminder => {
const [startHour, startMinute] = reminder.startTime.split(':').map(Number);
const [endHour, endMinute] = reminder.endTime.split(':').map(Number);
const firstReminderTime = new Date(today);
firstReminderTime.setHours(startHour, startMinute, 0, 0);
const endOfWindowTime = new Date(today);
endOfWindowTime.setHours(endHour, endMinute, 0, 0);
let currentReminderTime = firstReminderTime;
while (currentReminderTime.getTime() <= endOfWindowTime.getTime()) {
const dateString = currentReminderTime.toISOString().split('T')[0];
const timeString = currentReminderTime
.toTimeString()
.split(' ')[0]
.replace(/:/g, '');
schedule.push({
id: `${reminder._id}-${dateString}-${timeString}`,
reminderId: reminder._id,
title: reminder.title,
icon: reminder.icon,
scheduledTime: new Date(currentReminderTime),
});
currentReminderTime = new Date(
currentReminderTime.getTime() + reminder.frequencyMinutes * 60000
);
}
});
return schedule.sort(
(a, b) => a.scheduledTime.getTime() - b.scheduledTime.getTime()
);
};