aboutsummaryrefslogtreecommitdiffstats
path: root/src/tasks.ts
blob: b370aad0a11ad4ebac8245992e00226fe49987bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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");