clay/handlebars

View on GitHub
helpers/time/articleDate.js

Summary

Maintainability
C
1 day
Test Coverage
'use strict';
const parse = require('date-fns/parse'),
  isValid = require('date-fns/is_valid'),
  differenceInMinutes = require('date-fns/difference_in_minutes'),
  distanceInWordsStrict = require('date-fns/distance_in_words_strict'),
  subDays = require('date-fns/sub_days'),
  isSameDay = require('date-fns/is_same_day'),
  format = require('date-fns/format');

/**
 * generate article dates and times, based on a relative format
 * @param  {Date|string} datetime for `date-fns` to parse
 * @return {string}
 */
module.exports = function (datetime) {
  var date = parse(datetime),
    now = new Date(),
    yesterday = subDays(new Date(), 1),
    // we want an abbreviated version of 'minute' and 'minutes'
    tokens = {
      lessThanXSeconds: {
        one: 'less than a second',
        other: 'less than {{count}} seconds'
      },
      xSeconds: {
        one: '1 second',
        other: '{{count}} seconds'
      },
      xMinutes: {
        one: '1 min',
        other: '{{count}} mins'
      }
    },
    locale = {
      distanceInWords: {
        localize: function (token, count) {
          let result;

          if (count === 1) {
            result = tokens[token].one;
          } else {
            result = tokens[token].other.replace('{{count}}', count);
          }

          return `${result} ago`;
        }
      }
    };

  if (isValid(date)) {
    // articles < 30 min old should display 'x seconds ago / x minutes ago'
    if (differenceInMinutes(now, date) < 1) {
      return distanceInWordsStrict(now, date, { unit: 's', addSuffix: true, locale: locale });
    } else if (differenceInMinutes(now, date) < 30) {
      return distanceInWordsStrict(now, date, { unit: 'm', addSuffix: true, locale: locale });
    } else if (isSameDay(now, date)) {
      return format(date, 'h:mm aa');
    } else if (isSameDay(yesterday, date)) {
      return `Yesterday at ${format(date, 'h:mm aa')}`;
    } else {
      return format(date, 'M/D/YYYY [at] h:mm aa');
    }
  } else {
    return '';
  }
};

module.exports.example = {
  code: '{{ articleDate "Fri, 13 Jan 2017 18:22:16 GMT" }}',
  result: '"Yesterday at 6:22 p.m."'
};