aboutsummaryrefslogtreecommitdiffstats
path: root/src/tasks.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/tasks.ts')
-rw-r--r--src/tasks.ts39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/tasks.ts b/src/tasks.ts
new file mode 100644
index 0000000..b370aad
--- /dev/null
+++ b/src/tasks.ts
@@ -0,0 +1,39 @@
+import { add, parse, format, startOfWeek, addWeeks, isWithinInterval, Duration } from "date-fns";
+import { RecurringTask } from "./db";
+import config from "./config";
+
+const INTERVAL_ABBREVS: Record<string, number> = {
+ pv: 1,
+ vk: 7,
+ kk: 30,
+ v: 365,
+};
+
+export const now = (): Date => {
+ return new Date(new Date().toLocaleString("en-US", { timeZone: config.tz }));
+};
+
+export const parseInterval = (intervalStr: string): Duration => {
+ const match = /^(\d+)(pv|vk|kk|v)$/.exec(intervalStr);
+ if (!match) throw new Error(`Virheellinen intervalli: "${intervalStr}"`);
+ const num = parseInt(match[1]);
+ const days = num * INTERVAL_ABBREVS[match[2]];
+ return { days };
+};
+
+export const getNextDate = (task: RecurringTask): Date => {
+ if (!task.last_done) return now();
+ const lastDate = parse(task.last_done, "yyyy-MM-dd", now());
+ return add(lastDate, parseInterval(task.interval));
+};
+
+export const isThisWeek = (task: RecurringTask): boolean => {
+ const nextDate = getNextDate(task);
+ const weekStart = startOfWeek(now(), { weekStartsOn: 1 });
+ const weekEnd = addWeeks(weekStart, 1);
+ return isWithinInterval(nextDate, { start: weekStart, end: weekEnd });
+};
+
+export const formatDate = (d: Date): string => format(d, "yyyy-MM-dd");
+
+export const today = (): string => format(now(), "yyyy-MM-dd");