Skip to content

Commit

Permalink
fix: create repeat tasks if missed in the days before johannesjo#2694
Browse files Browse the repository at this point in the history
  • Loading branch information
ishanarora committed Jul 17, 2023
1 parent 899ac12 commit b9e08a7
Showing 1 changed file with 72 additions and 38 deletions.
110 changes: 72 additions & 38 deletions src/app/features/task-repeat-cfg/store/task-repeat-cfg.reducer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,6 @@ export const selectTaskRepeatCfgsDueOnDay = createSelector(
{ dayDate }: { dayDate: number },
): TaskRepeatCfg[] => {
const dateToCheckTimestamp = dayDate;
const dateToCheckDate = new Date(dateToCheckTimestamp);

return (
taskRepeatCfgs &&
Expand All @@ -97,6 +96,12 @@ export const selectTaskRepeatCfgsDueOnDay = createSelector(
return false;
}

let dateToCheckDate = new Date(dateToCheckTimestamp);
let numberOfDatesToCheck = getDiffInDays(
new Date(taskRepeatCfg.lastTaskCreation),
dateToCheckDate,
);

switch (taskRepeatCfg.repeatCycle) {
case 'DAILY': {
if (!taskRepeatCfg.startDate) {
Expand All @@ -106,12 +111,20 @@ export const selectTaskRepeatCfgsDueOnDay = createSelector(
throw new Error('Invalid repeatEvery value given for DAILY');
}
const startDateDate = new Date(taskRepeatCfg.startDate);
const diffInDays = getDiffInDays(startDateDate, dateToCheckDate);
while (numberOfDatesToCheck > 0) {
const diffInDays = getDiffInDays(startDateDate, dateToCheckDate);

if (
// start date is not in the future
diffInDays >= 0 &&
diffInDays % taskRepeatCfg.repeatEvery === 0
)
return true;

return (
// start date is not in the future
diffInDays >= 0 && diffInDays % taskRepeatCfg.repeatEvery === 0
);
dateToCheckDate.setDate(dateToCheckDate.getDate() - 1);
numberOfDatesToCheck -= 1;
}
return false;
}

case 'WEEKLY': {
Expand All @@ -123,16 +136,23 @@ export const selectTaskRepeatCfgsDueOnDay = createSelector(
}
const startDateDate = new Date(taskRepeatCfg.startDate);

const todayDay = dateToCheckDate.getDay();
const todayDayStr: keyof TaskRepeatCfg = TASK_REPEAT_WEEKDAY_MAP[todayDay];
const diffInWeeks = getDiffInWeeks(startDateDate, dateToCheckDate);
while (numberOfDatesToCheck > 0) {
const todayDay = dateToCheckDate.getDay();
const todayDayStr: keyof TaskRepeatCfg = TASK_REPEAT_WEEKDAY_MAP[todayDay];
const diffInWeeks = getDiffInWeeks(startDateDate, dateToCheckDate);

return (
// start date is not in the future
diffInWeeks >= 0 &&
diffInWeeks % taskRepeatCfg.repeatEvery === 0 &&
taskRepeatCfg[todayDayStr]
);
if (
// start date is not in the future
diffInWeeks >= 0 &&
diffInWeeks % taskRepeatCfg.repeatEvery === 0 &&
taskRepeatCfg[todayDayStr]
)
return true;

dateToCheckDate.setDate(dateToCheckDate.getDate() - 1);
numberOfDatesToCheck -= 1;
}
return false;
}

case 'MONTHLY': {
Expand All @@ -143,16 +163,23 @@ export const selectTaskRepeatCfgsDueOnDay = createSelector(
throw new Error('Invalid repeatEvery value given for MONTHLY');
}
const startDateDate = new Date(taskRepeatCfg.startDate);
const isCreationDayThisMonth =
dateToCheckDate.getDate() === startDateDate.getDate();

const diffInMonth = getDiffInMonth(startDateDate, dateToCheckDate);
return (
isCreationDayThisMonth &&
// start date is not in the future
diffInMonth >= 0 &&
diffInMonth % taskRepeatCfg.repeatEvery === 0
);
while (numberOfDatesToCheck > 0) {
const isCreationDayThisMonth =
dateToCheckDate.getDate() === startDateDate.getDate();

const diffInMonth = getDiffInMonth(startDateDate, dateToCheckDate);
if (
isCreationDayThisMonth &&
// start date is not in the future
diffInMonth >= 0 &&
diffInMonth % taskRepeatCfg.repeatEvery === 0
)
return true;

dateToCheckDate.setDate(dateToCheckDate.getDate() - 1);
numberOfDatesToCheck -= 1;
}
return false;
}

case 'YEARLY': {
Expand All @@ -163,19 +190,26 @@ export const selectTaskRepeatCfgsDueOnDay = createSelector(
throw new Error('Invalid repeatEvery value given for YEARLY');
}
const startDateDate = new Date(taskRepeatCfg.startDate);
const isRightMonthAndDay =
dateToCheckDate.getDate() === startDateDate.getDate() &&
dateToCheckDate.getMonth() === startDateDate.getMonth();

const diffInYears =
dateToCheckDate.getFullYear() - startDateDate.getFullYear();

return (
isRightMonthAndDay &&
// start date is not in the future
diffInYears >= 0 &&
diffInYears % taskRepeatCfg.repeatEvery === 0
);
while (numberOfDatesToCheck > 0) {
const isRightMonthAndDay =
dateToCheckDate.getDate() === startDateDate.getDate() &&
dateToCheckDate.getMonth() === startDateDate.getMonth();

const diffInYears =
dateToCheckDate.getFullYear() - startDateDate.getFullYear();

if (
isRightMonthAndDay &&
// start date is not in the future
diffInYears >= 0 &&
diffInYears % taskRepeatCfg.repeatEvery === 0
)
return true;

dateToCheckDate.setDate(dateToCheckDate.getDate() - 1);
numberOfDatesToCheck -= 1;
}
return false;
}
}
})
Expand Down

0 comments on commit b9e08a7

Please sign in to comment.