- 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
108 lines
3.2 KiB
TypeScript
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()
|
|
);
|
|
};
|