Ghost/ghost/admin/app/helpers/gh-format-post-time.js
Kevin Ansfield 060d791a63 Removed need for .get() with settings service
no issue

The `settings` service has been a source of confusion when writing with modern Ember patterns because it's use of the deprecated `ProxyMixin` forced all property access/setting to go via `.get()` and `.set()` whereas the rest of the system has mostly (there are a few other uses of ProxyObjects remaining) eliminated the use of the non-native get/set methods.

- removed use of `ProxyMixin` in the `settings` service by grabbing the attributes off the setting model after fetching and using `Object.defineProperty()` to add native getters/setters that pass through to the model's getters/setters. Ember's autotracking automatically works across the native getters/setters so we can then use the service as if it was any other native object
- updated all code to use `settings.{attrName}` directly for getting/setting instead of `.get()` and `.set()`
- removed use of observer in the `customViews` service because it was being set up before the native properties had been added on the settings service meaning autotracking wasn't able to set up properly
2022-10-07 16:14:57 +01:00

65 lines
2.3 KiB
JavaScript

import Helper from '@ember/component/helper';
import moment from 'moment-timezone';
import {assert} from '@ember/debug';
import {inject as service} from '@ember/service';
export function formatPostTime(timeago, {timezone = 'etc/UTC', format, draft, scheduled, published}) {
if (draft) {
// No special handling for drafts, just use moment.from
return moment(timeago).from(moment.utc());
}
let time = moment.tz(timeago, timezone);
if (format) {
return time.format(format);
}
let now = moment.tz(moment.utc(), timezone);
let utcOffset;
if (time.utcOffset() === 0) {
utcOffset = '(UTC)';
} else {
utcOffset = `(UTC${time.format('Z').replace(/([+-])0/, '$1').replace(/:00/, '')})`;
}
// If not a draft and post was published <= 12 hours ago
// or scheduled to be published <= 12 hours from now, use moment.from
if (Math.abs(now.diff(time, 'hours')) <= 12) {
return time.from(now);
}
// If scheduled for or published on the same day, render the time + Today
if (time.isSame(now, 'day')) {
let formatted = time.format(`HH:mm [${utcOffset}] [Today]`);
return scheduled ? `at ${formatted}` : formatted;
}
// if published yesterday, render time + yesterday
// This check comes before scheduled, because there are likely to be more published
// posts than scheduled posts.
if (published && time.isSame(now.clone().subtract(1, 'days').startOf('day'), 'day')) {
return time.format(`HH:mm [${utcOffset}] [Yesterday]`);
}
// if scheduled for tomorrow, render the time + tomorrow
if (scheduled && time.isSame(now.clone().add(1, 'days').startOf('day'), 'day')) {
return time.format(`[at] HH:mm [${utcOffset}] [tomorrow]`);
}
// Else, render just the date if published, or the time & date if scheduled
let f = scheduled ? `[at] HH:mm [${utcOffset}] [on] DD MMM YYYY` : 'DD MMM YYYY';
return time.format(f);
}
export default class GhFormatPostTimeHelper extends Helper {
@service settings;
compute([timeago], options) {
assert('You must pass a time to the gh-format-post-time helper', timeago);
return formatPostTime(timeago, Object.assign({}, options, {timezone: this.settings.timezone}));
}
}