All files / app/utils timeAgo.ts

82.6% Statements 76/92
54.54% Branches 18/33
100% Functions 2/2
88.88% Lines 56/63

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122    26x 26x 26x 28x 26x 26x 26x 26x 26x 26x 26x 26x 26x   26x                   197x 197x 197x 197x   197x   1x     196x 195x 194x     194x 193x 1x   192x 191x 1x   190x 189x 1x   188x 187x 1x   186x 28x               346x                 346x 346x 346x   346x         346x   346x 346x         346x 346x         346x 346x         346x 346x         346x 346x 34x       312x 312x        
import { TFunction } from "i18next";
 
export const minuteMillis = 60000;
export const twoMinuteMillis = 120000;
export const quarterHourMillis = 900000;
export const hourMillis = 3600000;
export const twoHourMillis = 7200000;
export const dayMillis = 86400000;
export const twoDayMillis = 172800000;
export const weekMillis = 604800000;
export const twoWeekMillis = 1209600000;
export const monthMillis = weekMillis * 4;
export const twoMonthMillis = weekMillis * 8;
export const yearMillis = 31557600000;
export const twoYearMillis = 31557600000 * 2;
 
export const lessThanHour = "Less than an hour ago";
 
export interface FuzzySpec {
  millis: number;
  text: string;
}
 
/**
 * @deprecated Use `timeAgoI18n` instead.
 */
export function timeAgo(input: Date | string, fuzzy?: FuzzySpec) {
  Iif (input === undefined) return "";
  const date = new Date(input);
  const diffMillis = Date.now() - date.getTime();
 
  if (fuzzy && diffMillis < fuzzy.millis) {
    // if fuzzyMillis and fuzzyText are both set, then for times less than fuzzyMillis, we return fuzzyText
    return fuzzy.text;
  }
 
  if (diffMillis <= minuteMillis) return "< 1 minute ago";
  if (diffMillis <= twoMinuteMillis) return "1 minute ago";
  Iif (diffMillis < hourMillis)
    return "" + (diffMillis / minuteMillis).toFixed() + " minutes ago";
 
  if (diffMillis < twoHourMillis) return "1 hour ago";
  if (diffMillis < dayMillis)
    return "" + (diffMillis / hourMillis).toFixed() + " hours ago";
 
  if (diffMillis < twoDayMillis) return "1 day ago";
  if (diffMillis < weekMillis)
    return "" + (diffMillis / dayMillis).toFixed() + " days ago";
 
  if (diffMillis < twoWeekMillis) return "1 week ago";
  if (diffMillis < monthMillis)
    return "" + (diffMillis / weekMillis).toFixed() + " weeks ago";
 
  if (diffMillis < twoMonthMillis) return "1 month ago";
  if (diffMillis < yearMillis)
    return "" + (diffMillis / monthMillis).toFixed() + " months ago";
 
  if (diffMillis < twoYearMillis) return "1 year ago";
  return "" + (diffMillis / yearMillis).toFixed() + " years ago";
}
 
export interface FuzzySpecT {
  millis: number;
  translationKey: Parameters<TFunction<"global", undefined>>[0];
}
 
export function timeAgoI18n({
  input,
  t,
  fuzzy = undefined,
}: {
  input: Date | string;
  t: TFunction<"global", undefined>;
  fuzzy?: FuzzySpecT;
}) {
  Iif (input === undefined) return "";
  const date = new Date(input);
  const diffMillis = Date.now() - date.getTime();
 
  Iif (fuzzy && diffMillis < fuzzy.millis) {
    // if fuzzyMillis and fuzzyText are both set, then for times less than fuzzyMillis, we return fuzzyText
    return t(fuzzy.translationKey) as string;
  }
 
  Iif (diffMillis < minuteMillis)
    return t("relative_time.less_than_a_minute_ago");
  Iif (diffMillis < twoMinuteMillis) return t("relative_time.one_minute_ago");
  Iif (diffMillis < hourMillis)
    return t("relative_time.x_minutes_ago", {
      date: (diffMillis / minuteMillis).toFixed(),
    });
 
  Iif (diffMillis < twoHourMillis) return t("relative_time.one_hour_ago");
  Iif (diffMillis < dayMillis)
    return t("relative_time.x_hours_ago", {
      date: (diffMillis / hourMillis).toFixed(),
    });
 
  Iif (diffMillis < twoDayMillis) return t("relative_time.one_day_ago");
  Iif (diffMillis < weekMillis)
    return t("relative_time.x_days_ago", {
      date: (diffMillis / dayMillis).toFixed(),
    });
 
  Iif (diffMillis < twoWeekMillis) return t("relative_time.one_week_ago");
  Iif (diffMillis < monthMillis)
    return t("relative_time.x_weeks_ago", {
      date: (diffMillis / weekMillis).toFixed(),
    });
 
  Iif (diffMillis < twoMonthMillis) return t("relative_time.one_month_ago");
  if (diffMillis < yearMillis)
    return t("relative_time.x_months_ago", {
      date: (diffMillis / monthMillis).toFixed(),
    });
 
  Iif (diffMillis < twoYearMillis) return t("relative_time.one_year_ago");
  return t("relative_time.x_years_ago", {
    date: (diffMillis / yearMillis).toFixed(),
  });
}