aboutsummaryrefslogtreecommitdiffstats
path: root/src/tasks.ts
blob: 6d89ada0a737b6ec03c9b3a10865715bba967c77 (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
40
41
42
43
44
45
46
47
48
import {
  add,
  parse,
  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 =>
  d.toLocaleDateString("en-CA", { timeZone: config.tz });

export const today = (): string =>
  new Date().toLocaleDateString("en-CA", { timeZone: config.tz });