feat(medication): improve snooze timer handling

This commit is contained in:
William Valentin
2025-09-23 10:45:18 -07:00
parent 9b4ee116e6
commit 2cb56d5f5f
3 changed files with 153 additions and 18 deletions

View File

@@ -0,0 +1,63 @@
import { determineDoseStatus } from '../doseStatus';
import { DoseStatus } from '../../types';
describe('determineDoseStatus', () => {
const scheduledTime = new Date('2024-05-10T08:00:00.000Z');
const now = new Date('2024-05-10T07:00:00.000Z');
it('returns TAKEN when dose has been recorded as taken', () => {
const status = determineDoseStatus({
takenAt: new Date().toISOString(),
snoozedUntil: undefined,
scheduledTime,
now,
});
expect(status).toBe(DoseStatus.TAKEN);
});
it('returns SNOOZED when snooze time is in the future', () => {
const status = determineDoseStatus({
takenAt: undefined,
snoozedUntil: new Date(now.getTime() + 5 * 60 * 1000).toISOString(),
scheduledTime,
now,
});
expect(status).toBe(DoseStatus.SNOOZED);
});
it('returns UPCOMING when snooze time has expired', () => {
const pastSnooze = new Date(now.getTime() - 5 * 60 * 1000).toISOString();
const status = determineDoseStatus({
takenAt: undefined,
snoozedUntil: pastSnooze,
scheduledTime: new Date(now.getTime() - 60 * 60 * 1000),
now,
});
expect(status).toBe(DoseStatus.UPCOMING);
});
it('returns MISSED when scheduled time is in the past without snooze', () => {
const status = determineDoseStatus({
takenAt: undefined,
snoozedUntil: undefined,
scheduledTime: new Date(now.getTime() - 60 * 60 * 1000),
now,
});
expect(status).toBe(DoseStatus.MISSED);
});
it('returns UPCOMING when scheduled time is in the future without snooze', () => {
const status = determineDoseStatus({
takenAt: undefined,
snoozedUntil: undefined,
scheduledTime: new Date(now.getTime() + 60 * 60 * 1000),
now,
});
expect(status).toBe(DoseStatus.UPCOMING);
});
});

35
utils/doseStatus.ts Normal file
View File

@@ -0,0 +1,35 @@
import { DoseStatus } from '../types';
export interface DoseStatusParams {
takenAt?: string;
snoozedUntil?: string;
scheduledTime: Date;
now: Date;
}
export const determineDoseStatus = ({
takenAt,
snoozedUntil,
scheduledTime,
now,
}: DoseStatusParams): DoseStatus => {
if (takenAt) {
return DoseStatus.TAKEN;
}
if (snoozedUntil) {
const snoozeTime = new Date(snoozedUntil);
if (!Number.isNaN(snoozeTime.getTime())) {
if (snoozeTime.getTime() > now.getTime()) {
return DoseStatus.SNOOZED;
}
return DoseStatus.UPCOMING;
}
}
if (scheduledTime.getTime() < now.getTime()) {
return DoseStatus.MISSED;
}
return DoseStatus.UPCOMING;
};