import { c as _c } from "react/compiler-runtime";
import { memo } from "react";

// This component always renders the server time / UTC.
// It does not (yet) support rendering some parts in the time zone of the client.
// It is also not language-/locale-aware.

// For DE locale, usually returns something like "vor 10 Tagen"
// `numeric: "auto"` results in additional wordings to be used.
// For example, instead of "vor 1 Tag", it will return "gestern"
// `style: "long"` will return "vor 6 Minuten"
// `style: "short"` will return "vor 6 Min."
const relativeDateFormatter = new Intl.RelativeTimeFormat(["de", "en"], {
  style: "long",
  numeric: "auto"
});
const relativeDateFormatterNarrow = new Intl.RelativeTimeFormat(["de", "en"], {
  style: "narrow",
  numeric: "auto"
});
const absoluteFormatter = new Intl.DateTimeFormat(["de", "en"], {
  dateStyle: "long",
  timeStyle: "long"
});
const formatterMap = {
  long: relativeDateFormatter,
  narrow: relativeDateFormatterNarrow,
  short: {
    // Intl does not offer a meaningful "short" style for relative time. We use our own.
    format(value, unit) {
      const v = Math.abs(Math.round(value));
      switch (unit) {
        // The char " " between the number and the unit is a narrow no-break space (U+202F).
        case "day":
          return `${v} T`;
        case "hour":
          return `${v} Std.`;
        case "minute":
          return `${v} min`;
        case "second":
          return `${v} s`;
        case "month":
          return `${v} M`;
        case "week":
          return `${v} W`;
        case "year":
          return `${v} J`;
      }
    }
  }
};

/**
 * @remarks This component uses api.Timestamp instead of `Date` to avoid re-renders (Dates are objects and therefore compared by reference).
 */

export default memo(function RelativeTimestamp(t0) {
  const $ = _c(12);
  const {
    date,
    relativeToDate,
    style
  } = t0;
  const t1 = date * 1000;
  let longDateTime;
  let relativeDate;
  let t2;
  if ($[0] !== relativeToDate || $[1] !== style || $[2] !== t1) {
    const d = new Date(t1);
    longDateTime = absoluteFormatter.format(d);
    let t3;
    if ($[6] !== relativeToDate) {
      t3 = typeof relativeToDate === "number" ? new Date(relativeToDate * 1000) : relativeToDate;
      $[6] = relativeToDate;
      $[7] = t3;
    } else {
      t3 = $[7];
    }
    relativeDate = getRelativeDate(d, t3, style);
    t2 = d.toISOString();
    $[0] = relativeToDate;
    $[1] = style;
    $[2] = t1;
    $[3] = longDateTime;
    $[4] = relativeDate;
    $[5] = t2;
  } else {
    longDateTime = $[3];
    relativeDate = $[4];
    t2 = $[5];
  }
  let t3;
  if ($[8] !== longDateTime || $[9] !== relativeDate || $[10] !== t2) {
    t3 = <time dateTime={t2} title={longDateTime}>{relativeDate}</time>;
    $[8] = longDateTime;
    $[9] = relativeDate;
    $[10] = t2;
    $[11] = t3;
  } else {
    t3 = $[11];
  }
  return t3;
});
const unitsInMs = {
  year: 365 * 24 * 60 * 60 * 1000,
  month: 365 * 24 * 60 * 60 * 1000 / 12,
  week: 7 * 24 * 60 * 60 * 1000,
  day: 24 * 60 * 60 * 1000,
  hour: 60 * 60 * 1000,
  minute: 60 * 1000,
  second: 1000
};
function getRelativeDate(date, relativeTo, style = "long") {
  const elapsed = date.getTime() - relativeTo.getTime();
  for (const [unit, divisor] of Object.entries(unitsInMs)) {
    if (Math.abs(elapsed) > divisor || unit === "second") {
      const formatter = formatterMap[style];
      return formatter.format(Math.round(elapsed / divisor), unit);
    }
  }
  return absoluteFormatter.format(date);
}
//# sourceMappingURL=RelativeTimestamp.jsx.map