diff --git a/src/cards/trash-card/items/icon.ts b/src/cards/trash-card/items/icon.ts index 71b7520..aca427e 100644 --- a/src/cards/trash-card/items/icon.ts +++ b/src/cards/trash-card/items/icon.ts @@ -32,7 +32,7 @@ class IconCard extends BaseItemElement<{ nextEvent: boolean }> { futureEvent: !this.item.nextEvent }; - const daysLeft = daysTill(item); + const daysLeft = daysTill(new Date(), item); const pictureUrl = this.getPictureUrl(); diff --git a/src/utils/daysTill.test.ts b/src/utils/daysTill.test.ts new file mode 100644 index 0000000..a89618b --- /dev/null +++ b/src/utils/daysTill.test.ts @@ -0,0 +1,78 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +import { daysTill } from './daysTill'; + +import type { CalendarItem } from './calendarItem'; + +describe('daysTill', (): void => { + test('2 days till whole day events', async () => { + const date = new Date(`1970-01-02T00:00:00.000`); + + const item = { + date: { + start: new Date(`1970-01-04T00:00:00.000`) + } + } as CalendarItem; + + const result = daysTill(date, item); + + expect(result).toEqual(2); + }); + + test('2 days till event at the evening', async () => { + const date = new Date(`1970-01-02T00:00:00.000`); + + const item = { + date: { + start: new Date(`1970-01-04T22:00:00.000`) + } + } as CalendarItem; + + const result = daysTill(date, item); + + expect(result).toEqual(2); + }); + + test('2 days till event during leap ear', async () => { + const date = new Date(`2024-02-28T00:00:00.000`); + + const item = { + date: { + start: new Date(`2024-03-01T00:00:00.000`) + } + } as CalendarItem; + + const result = daysTill(date, item); + + expect(result).toEqual(2); + }); + + describe('calculate correct during time changeover', (): void => { + test('from normal to day light saving', async () => { + const date = new Date(`2024-03-30T00:00:00.000`); + + const item = { + date: { + start: new Date(`2024-04-01T00:00:00.000`) + } + } as CalendarItem; + + const result = daysTill(date, item); + + expect(result).toEqual(2); + }); + + test('from day light saving to normal', async () => { + const date = new Date(`2024-10-26T00:00:00.000`); + + const item = { + date: { + start: new Date(`2024-10-29T00:00:00.000`) + } + } as CalendarItem; + + const result = daysTill(date, item); + + expect(result).toEqual(3); + }); + }); +}); diff --git a/src/utils/daysTill.ts b/src/utils/daysTill.ts index b458fc0..f5d52a5 100644 --- a/src/utils/daysTill.ts +++ b/src/utils/daysTill.ts @@ -1,15 +1,21 @@ import type { CalendarItem } from './calendarItem'; -const daysTill = (item: CalendarItem) => { +const daysTill = (from: Date, item: CalendarItem) => { const oneDay = 24 * 60 * 60 * 1_000; - const todayMorning = new Date(); + const todayMorning = new Date(from.getTime()); todayMorning.setHours(0); todayMorning.setMinutes(0); todayMorning.setSeconds(0); - return Math.round(Math.abs((todayMorning.getTime() - item.date.start.getTime()) / oneDay)); + const startTimeMorning = new Date(item.date.start.getTime()); + + startTimeMorning.setHours(0); + startTimeMorning.setMinutes(0); + startTimeMorning.setSeconds(0); + + return Math.round(Math.abs((todayMorning.getTime() - startTimeMorning.getTime()) / oneDay)); }; export { diff --git a/src/utils/getDateString.ts b/src/utils/getDateString.ts index a2d014f..cfc680d 100644 --- a/src/utils/getDateString.ts +++ b/src/utils/getDateString.ts @@ -44,7 +44,7 @@ const getDateString = (item: CalendarItem, excludeTime?: boolean, dayStyle?: Tra } if (dayStyle === 'counter') { - const daysLeft = daysTill(item); + const daysLeft = daysTill(new Date(), item); return `${customLocalize(`card.trash.daysleft${daysLeft > 1 ? '_more' : ''}${startTime && !excludeTime ? '_from_till' : ''}`).replace('', `${daysLeft}`).replace('', startTime ?? '').replace('', endTime ?? '')}`; }