From 713ced9c68cd70a8e56e8ce5ed27cb9bbe3e55c4 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Wed, 6 May 2026 21:46:21 +0300 Subject: Add shopping list features, rework --- src/tasks.ts | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/tasks.ts (limited to 'src/tasks.ts') 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 = { + 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"); -- cgit v1.3