summaryrefslogtreecommitdiff
path: root/src/utils
diff options
context:
space:
mode:
authorJoão Augusto Costa Branco Marado Torres <torres.dev@disroot.org>2025-07-27 12:34:14 -0300
committerJoão Augusto Costa Branco Marado Torres <torres.dev@disroot.org>2025-07-27 12:34:14 -0300
commitbd27bbb073465be77e4e752e6bf9bc4cf5e84c60 (patch)
treeaeca59ee65177259a71f6068269451a3a4512001 /src/utils
parent9f3b746f72bc7895d3f659a7201969349f5e5298 (diff)
feat: styling microblogs
Signed-off-by: João Augusto Costa Branco Marado Torres <torres.dev@disroot.org>
Diffstat (limited to 'src/utils')
-rw-r--r--src/utils/datetime.test.ts74
-rw-r--r--src/utils/datetime.ts25
2 files changed, 98 insertions, 1 deletions
diff --git a/src/utils/datetime.test.ts b/src/utils/datetime.test.ts
index 5f0749d..03e2771 100644
--- a/src/utils/datetime.test.ts
+++ b/src/utils/datetime.test.ts
@@ -1,6 +1,10 @@
import { assertEquals, assertMatch } from "@std/assert";
import { describe, it } from "@std/testing/bdd";
-import { toIso8601Full, toIso8601FullUTC } from "./datetime.ts";
+import {
+ getRelativeTimeUnit,
+ toIso8601Full,
+ toIso8601FullUTC,
+} from "./datetime.ts";
describe("toIso8601Full", () => {
it("formats current local time with offset", () => {
@@ -60,3 +64,71 @@ describe("toIso8601FullUTC", () => {
assertMatch(result, /^-\d{6}-03-15T12:00:00\.000Z$/);
});
});
+
+describe("getRelativeTimeUnit", () => {
+ const now = new Date();
+
+ it("returns seconds for differences under a minute", () => {
+ const future = new Date(now.getTime() + 45 * 1000);
+ const [value, unit] = getRelativeTimeUnit(future);
+
+ assertEquals(unit, "second");
+ assertEquals(value, 1);
+ });
+
+ it("returns minutes for differences under an hour but over a minute", () => {
+ const future = new Date(now.getTime() + 15 * 60 * 1000);
+ const [value, unit] = getRelativeTimeUnit(future);
+
+ assertEquals(unit, "minute");
+ assertEquals(value, 15);
+ });
+
+ it("returns hours for differences under a day but over an hour", () => {
+ const past = new Date(now.getTime() - 3.2 * 60 * 60 * 1000);
+ const [value, unit] = getRelativeTimeUnit(past);
+
+ assertEquals(unit, "hour");
+ assertEquals(value, -3);
+ });
+
+ it("returns days for differences under a week but over a day", () => {
+ const past = new Date(now.getTime() - 2.5 * 24 * 60 * 60 * 1000);
+ const [value, unit] = getRelativeTimeUnit(past);
+
+ assertEquals(unit, "day");
+ assertEquals(value, -3);
+ });
+
+ it("returns weeks for differences under a month but over a week", () => {
+ const future = new Date(now.getTime() + 2.3 * 7 * 24 * 60 * 60 * 1000);
+ const [value, unit] = getRelativeTimeUnit(future);
+
+ assertEquals(unit, "week");
+ assertEquals(value, 2);
+ });
+
+ it("returns months for differences under a quarter but over a month", () => {
+ const past = new Date(now.getTime() - 1.5 * 30 * 24 * 60 * 60 * 1000);
+ const [value, unit] = getRelativeTimeUnit(past);
+
+ assertEquals(unit, "month");
+ assertEquals(value, -2);
+ });
+
+ it("returns quarters for differences under a year but over a quarter", () => {
+ const future = new Date(now.getTime() + 5 * 30 * 24 * 60 * 60 * 1000);
+ const [value, unit] = getRelativeTimeUnit(future);
+
+ assertEquals(unit, "quarter");
+ assertEquals(value, 2);
+ });
+
+ it("returns years for differences over a year", () => {
+ const past = new Date(now.getTime() - 3.4 * 365 * 24 * 60 * 60 * 1000);
+ const [value, unit] = getRelativeTimeUnit(past);
+
+ assertEquals(unit, "year");
+ assertEquals(value, -3);
+ });
+});
diff --git a/src/utils/datetime.ts b/src/utils/datetime.ts
index 3a2cd25..c32fde0 100644
--- a/src/utils/datetime.ts
+++ b/src/utils/datetime.ts
@@ -41,3 +41,28 @@ export function toIso8601FullUTC(date: Date): string {
}
const pad = (num: number, len = 2) => String(Math.abs(num)).padStart(len, "0");
+
+export function getRelativeTimeUnit(
+ date: Date,
+ now: Date = new Date(),
+): Parameters<Intl.RelativeTimeFormat["format"]> {
+ const diffMs = date.getTime() - now.getTime();
+
+ const seconds = diffMs / 1000;
+ const minutes = seconds / 60;
+ const hours = minutes / 60;
+ const days = hours / 24;
+ const weeks = days / 7;
+ const months = days / 30;
+ const quarters = months / 3;
+ const years = days / 365;
+
+ if (Math.abs(years) >= 1) return [Math.round(years), "year"];
+ if (Math.abs(quarters) >= 1) return [Math.round(quarters), "quarter"];
+ if (Math.abs(months) >= 1) return [Math.round(months), "month"];
+ if (Math.abs(weeks) >= 1) return [Math.round(weeks), "week"];
+ if (Math.abs(days) >= 1) return [Math.round(days), "day"];
+ if (Math.abs(hours) >= 1) return [Math.round(hours), "hour"];
+ if (Math.abs(minutes) >= 1) return [Math.round(minutes), "minute"];
+ return [Math.round(seconds), "second"];
+}