feat(medication): improve snooze timer handling
This commit is contained in:
63
utils/__tests__/doseStatus.test.ts
Normal file
63
utils/__tests__/doseStatus.test.ts
Normal 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
35
utils/doseStatus.ts
Normal 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;
|
||||
};
|
||||
Reference in New Issue
Block a user