From 8e01a277ad2afd0b704e2dabfe30ef355613ef00 Mon Sep 17 00:00:00 2001 From: Jorge Manrubia Date: Sat, 5 Apr 2025 13:24:46 +0200 Subject: [PATCH] Add daysago formatter and extract common helper to reuse with indays formatter --- .../controllers/local_time_controller.js | 50 ++++++++----------- app/javascript/helpers/date_helpers.js | 7 +++ app/views/bubbles/cards/_mini.html.erb | 2 +- app/views/bubbles/cards/common/_meta.html.erb | 6 +-- 4 files changed, 33 insertions(+), 32 deletions(-) create mode 100644 app/javascript/helpers/date_helpers.js diff --git a/app/javascript/controllers/local_time_controller.js b/app/javascript/controllers/local_time_controller.js index 497fbd37b..11c1bd923 100644 --- a/app/javascript/controllers/local_time_controller.js +++ b/app/javascript/controllers/local_time_controller.js @@ -1,7 +1,8 @@ import { Controller } from "@hotwired/stimulus" +import { differenceInDays } from "helpers/date_helpers"; export default class extends Controller { - static targets = [ "time", "date", "datetime", "shortdate", "ago", "indays" ] + static targets = [ "time", "date", "datetime", "shortdate", "ago", "indays", "daysago" ] #timer @@ -11,8 +12,8 @@ export default class extends Controller { this.shortDateFormatter = new Intl.DateTimeFormat(undefined, { month: "short", day: "numeric" }) this.dateTimeFormatter = new Intl.DateTimeFormat(undefined, { timeStyle: "short", dateStyle: "short" }) this.agoFormatter = new AgoFormatter() - this.daysAgoFormatter = new DaysAgoFormatter() this.indaysFormatter = new InDaysFormatter() + this.daysagoFormatter = new DaysAgoFormatter() } connect() { @@ -43,14 +44,14 @@ export default class extends Controller { this.#formatTime(this.agoFormatter, target) } - daysAgoTargetConnected(target) { - this.#formatTime(this.daysAgoFormatter, target) - } - indaysTargetConnected(target) { this.#formatTime(this.indaysFormatter, target) } + daysagoTargetConnected(target) { + this.#formatTime(this.daysagoFormatter, target) + } + #refreshRelativeTimes() { this.agoTargets.forEach(target => { this.#formatTime(this.agoFormatter, target) @@ -92,27 +93,9 @@ class AgoFormatter { } } -class DaysAgoFormatter { - format(dt) { - const now = new Date() - - const startOfToday = new Date(now.getFullYear(), now.getMonth(), now.getDate()) - const startOfGivenDay = new Date(dt.getFullYear(), dt.getMonth(), dt.getDate()) - - const msPerDay = 1000 * 60 * 60 * 24 - const dayDiff = Math.floor((startOfToday - startOfGivenDay) / msPerDay) - - if (dayDiff === 0) return "Today" - if (dayDiff === 1) return "Yesterday" - return `${dayDiff} days ago` - } -} - class InDaysFormatter { - format(dt) { - const target = this.#beginningOfDay(dt) - const today = this.#beginningOfDay(new Date()) - const days = Math.round((target - today) / (1000 * 60 * 60 * 24)) + format(date) { + const days = differenceInDays(new Date(), date) if (days <= 0) { return "today" @@ -123,8 +106,19 @@ class InDaysFormatter { return `in ${Math.round(days)} days` } +} - #beginningOfDay(dt) { - return new Date(dt.getFullYear(), dt.getMonth(), dt.getDate()) +class DaysAgoFormatter { + format(date) { + const days = differenceInDays(date, new Date()) + + if (days <= 0) { + return "today" + } + if (days === 1) { + return "yesterday" + } + + return `${Math.round(days)} days ago` } } diff --git a/app/javascript/helpers/date_helpers.js b/app/javascript/helpers/date_helpers.js new file mode 100644 index 000000000..9f3dffc4d --- /dev/null +++ b/app/javascript/helpers/date_helpers.js @@ -0,0 +1,7 @@ +export function differenceInDays(fromDate, toDate) { + return Math.round(Math.abs((beginningOfDay(toDate) - beginningOfDay(fromDate)) / (1000 * 60 * 60 * 24))) +} + +export function beginningOfDay(date) { + return new Date(date.getFullYear(), date.getMonth(), date.getDate()) +} diff --git a/app/views/bubbles/cards/_mini.html.erb b/app/views/bubbles/cards/_mini.html.erb index f90fd167d..298658446 100644 --- a/app/views/bubbles/cards/_mini.html.erb +++ b/app/views/bubbles/cards/_mini.html.erb @@ -7,7 +7,7 @@
<%= "Added to #{bubble.bucket.name} by #{bubble.creator.name}" %> - <%= local_datetime_tag(bubble.created_at, style: :daysAgo) %> + <%= local_datetime_tag(bubble.created_at, style: :daysago) %>
diff --git a/app/views/bubbles/cards/common/_meta.html.erb b/app/views/bubbles/cards/common/_meta.html.erb index 59f51c8a5..b5f644f9e 100644 --- a/app/views/bubbles/cards/common/_meta.html.erb +++ b/app/views/bubbles/cards/common/_meta.html.erb @@ -1,18 +1,18 @@
<%= bubble.creating? ? "Added" : "Updated" %> - <%= local_datetime_tag(bubble.updated_at, style: :daysAgo) %> + <%= local_datetime_tag(bubble.updated_at, style: :daysago) %>
<% if bubble.creating? %> Expires - <%= local_datetime_tag(bubble.auto_pop_at, style: :daysAgo) %> + <%= local_datetime_tag(bubble.auto_pop_at, style: :daysago) %> <% else %> Added - <%= local_datetime_tag(bubble.created_at, style: :daysAgo) %> + <%= local_datetime_tag(bubble.created_at, style: :daysago) %> <% end %>