Files
tout-doux/resources/ts/lib/tasks.ts
T

100 lines
3.0 KiB
TypeScript

import { SortType } from "@/enums";
import type { RawTask, Task, TaskCreateData } from "@/types";
import { nextCronReset } from "@/lib/recurrence";
const TEMPORARY_ID = "tmp";
export function parseTask(task: RawTask): Task {
return {
id: task.id,
name: task.name,
reset_cron: task.reset_cron,
created_at: new Date(task.created_at),
updated_at: new Date(task.updated_at),
check_date: task.check_date ? new Date(task.check_date) : null,
previous_check_date: task.previous_check_date
? new Date(task.previous_check_date)
: null,
};
}
export function newTemporaryTask(data: TaskCreateData): Task {
return {
id: TEMPORARY_ID,
name: data.name,
reset_cron: data.reset_cron,
created_at: new Date(),
updated_at: new Date(),
check_date: null,
previous_check_date: null,
};
}
export function isTemporary(task: Task): boolean {
return task.id === TEMPORARY_ID;
}
export function taskNextReset(task: Task): Date | null {
return nextCronReset(task.check_date, task.reset_cron, task.id);
}
export function taskCompleted(task: Task): boolean {
const nextReset = taskNextReset(task);
if (nextReset === null) {
return task.check_date !== null;
}
return nextReset.getTime() > new Date().getTime();
}
export function sortTasks(
tasks: Task[],
sortType: SortType,
reverse: boolean,
): Task[] {
switch (sortType) {
case SortType.CREATED_AT:
return tasks
.slice()
.sort(
(a: Task, b: Task) =>
(reverse ? -1 : 1) *
(a.created_at.getTime() - b.created_at.getTime()),
);
case SortType.UPDATED_AT:
return tasks
.slice()
.sort(
(a: Task, b: Task) =>
(reverse ? -1 : 1) *
(a.updated_at.getTime() - b.updated_at.getTime()),
);
case SortType.CHECK_DATE:
return tasks
.slice()
.sort(
(a: Task, b: Task) =>
(reverse ? -1 : 1) *
((a.check_date ?? a.created_at).getTime() -
(b.check_date ?? b.created_at).getTime()),
);
case SortType.RESET_DATE:
return tasks
.slice()
.sort(
(a: Task, b: Task) =>
(reverse ? -1 : 1) *
(taskNextReset(a) ?? a.created_at).getTime() -
(taskNextReset(b) ?? b.created_at).getTime(),
);
case SortType.NAME:
return tasks
.slice()
.sort(
(a: Task, b: Task) =>
(reverse ? -1 : 1) * a.name.localeCompare(b.name),
);
default:
return tasks.slice();
}
}