All files / app/utils timeAgo.ts

82.6% Statements 76/92
51.51% Branches 17/33
100% Functions 2/2
87.3% Lines 55/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    25x 25x 25x 25x 25x 25x 25x 25x 25x 25x 25x 25x 25x   25x                   25x 242x 242x 242x   242x   1x     241x 240x 239x     239x 238x 1x   237x 236x 1x   235x 234x 1x   233x 232x 1x   231x 32x               25x                 800x 800x 800x   800x         800x   800x 800x         800x 800x         800x 800x         800x 800x         800x 800x         800x 800x        
import { TFunction } from "react-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");
  Iif (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(),
  });
}