From 95f504c0bc0b9ec0930b6c6facefc1a8ea093192 Mon Sep 17 00:00:00 2001 From: Brandon Wong <29965003+brandonw3612@users.noreply.github.com> Date: Sun, 13 Apr 2025 22:50:45 +0200 Subject: feat: add support for filtering by bookmark age (#1228) --- packages/shared/utils/relativeDateUtils.ts | 42 ++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 packages/shared/utils/relativeDateUtils.ts (limited to 'packages/shared/utils') diff --git a/packages/shared/utils/relativeDateUtils.ts b/packages/shared/utils/relativeDateUtils.ts new file mode 100644 index 00000000..437c3ea8 --- /dev/null +++ b/packages/shared/utils/relativeDateUtils.ts @@ -0,0 +1,42 @@ +interface RelativeDate { + direction: "newer" | "older"; + amount: number; + unit: "day" | "week" | "month" | "year"; +} + +const parseRelativeDate = (date: string): RelativeDate => { + const match = date.match(/^([<>])(\d+)([dwmy])$/); + if (!match) { + throw new Error(`Invalid relative date format: ${date}`); + } + const direction = match[1] === "<" ? "newer" : "older"; + const amount = parseInt(match[2], 10); + const unit = { + d: "day", + w: "week", + m: "month", + y: "year", + }[match[3]] as "day" | "week" | "month" | "year"; + return { direction, amount, unit }; +}; + +const toAbsoluteDate = (relativeDate: RelativeDate): Date => { + const date = new Date(); + switch (relativeDate.unit) { + case "day": + date.setDate(date.getDate() - relativeDate.amount); + break; + case "week": + date.setDate(date.getDate() - relativeDate.amount * 7); + break; + case "month": + date.setMonth(date.getMonth() - relativeDate.amount); + break; + case "year": + date.setFullYear(date.getFullYear() - relativeDate.amount); + break; + } + return date; +}; + +export { parseRelativeDate, toAbsoluteDate }; -- cgit v1.2.3-70-g09d2