Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow to configure a baseline unit #11

Open
rxaviers opened this issue Jan 23, 2020 · 0 comments
Open

Allow to configure a baseline unit #11

rxaviers opened this issue Jan 23, 2020 · 0 comments

Comments

@rxaviers
Copy link
Owner

Currently, it's possible to use this library and ignore large units by using the threshold configuration [1]. It should also be possible to ignore small units potentially by using a baseline (any better word?) configuration [2].

1:

const relativeTime = new RelativeTime();
relativeTime.format(aTwoYearsAgoDate));
// > '2 years ago'

RelativeTime.threshold.month = Infinity;
relativeTime.format(aTwoYearsAgoDate);
// > '24 months ago'

2:

relativeTime.format(new Date()));
// > "now"

RelativeTime.baseline.minute = 0
RelativeTime.threshold.second = -1
relativeTime.format(new Date()));
// > "this minute"

That could be accomplish with the following change:

diff --git a/src/relative-time.js b/src/relative-time.js
index b49e5eb..1fe5a1c 100644
--- a/src/relative-time.js
+++ b/src/relative-time.js
@@ -117,14 +117,15 @@ export default class RelativeTime {
 
 RelativeTime.bestFit = function(absDiff) {
   let threshold = this.threshold;
+  let baseline = this.baseline;
   switch(true) {
-    case absDiff.years > 0 && absDiff.months > threshold.month: return "year";
-    case absDiff.months > 0 && absDiff.days > threshold.day: return "month";
-    // case absDiff.months > 0 && absDiff.weeks > threshold.week: return "month";
-    // case absDiff.weeks > 0 && absDiff.days > threshold.day: return "week";
-    case absDiff.days > 0 && absDiff.hours > threshold.hour: return "day";
-    case absDiff.hours > 0 && absDiff.minutes > threshold.minute: return "hour";
-    case absDiff.minutes > 0 && absDiff.seconds > threshold.second: return "minute";
+    case absDiff.years >= baseline.year && absDiff.months > threshold.month: return "year";
+    case absDiff.months >= baseline.month && absDiff.days > threshold.day: return "month";
+    // case absDiff.months >= 1 && absDiff.weeks > threshold.week: return "month";
+    // case absDiff.weeks >= 1 && absDiff.days > threshold.day: return "week";
+    case absDiff.days >= baseline.day && absDiff.hours > threshold.hour: return "day";
+    case absDiff.hours >= baseline.hour && absDiff.minutes > threshold.minute: return "hour";
+    case absDiff.minutes >= baseline.minute && absDiff.seconds > threshold.second: return "minute";
     default: return "second";
   }
 };
@@ -138,6 +139,15 @@ RelativeTime.threshold = {
   second: 59 // at least 59 seconds before using minute.
 };
 
+RelativeTime.baseline = {
+  year: 1,
+  month: 1, // at least 2 months before using year. TODO
+  day: 1, // at least 6 days before using month. TODO
+  hour: 1, // at least 6 hours before using day. TODO
+  minute: 1 // at least 59 minutes before using hour. TODO
+};
+
 // TODO: Remove redundancy. The only reason this code is that ugly is to get
 // supported by globalize-compiler (which reads the static formatters).
 RelativeTime.initializeFormatters = function(globalize) {

Side-note: It's a good approach to enable "week", because it's possible to keep the existing behavior by configuring threshold and baseline.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
1 participant