format static method

String format(
  1. DateTime dateTime, {
  2. RealtimeTextFormats? formats,
  3. RealtimeOptions? options,
  4. String separator = " at ",
  5. String time(
    1. DateTime date
    )?,
  6. String date(
    1. DateTime date
    )?,
})

Implementation

static String format(
  DateTime dateTime, {
  RealtimeTextFormats? formats,
  RealtimeOptions? options,
  String separator = " at ",
  String Function(DateTime date)? time,
  String Function(DateTime date)? date,
}) {
  formats = Realtime.formats.merge(formats);
  options = Realtime.options.merge(options);
  time ??= Realtime.time;
  date ??= Realtime.date;

  final rt = Realtime.parse(dateTime);

  final diff = rt.diff;

  String suffix = rt.future
      ? options.after
          ? ' ${formats.after}'
          : ''
      : options.ago
          ? ' ${formats.ago}'
          : '';

  if (!options.today &&
      options.now &&
      options.onSeconds == null &&
      diff.inSeconds <= options.nowShowingBeforeSeconds) {
    return formats.now;
  }

  if (!options.today && options.second && diff.inSeconds < 60) {
    final seconds = diff.inSeconds;
    if (options.onSeconds != null) {
      return options.onSeconds!(rt);
    }
    return "$seconds ${formats.second.apply(seconds)}$suffix";
  }

  if (!options.today && options.minute && diff.inMinutes < 60) {
    final minutes = diff.inMinutes;
    if (options.onMinutes != null) {
      return options.onMinutes!(rt);
    }
    return "$minutes ${formats.minute.apply(minutes)}$suffix";
  }

  if (!options.today && options.hour && diff.inHours < 24) {
    final hours = diff.inHours;
    if (options.onHours != null) return options.onHours!(rt);
    return "$hours ${formats.hour.apply(hours)}$suffix";
  }

  if (options.today && diff.inDays == 0) {
    if (options.onToday != null) options.onToday!(rt);
    if (time == null) return formats.today;
    final t = time(dateTime);
    return "${formats.today}$separator$t";
  }

  if ((options.tomorrow || options.yesterday) && diff.inDays == 1) {
    if (rt.future) {
      if (options.tomorrow) {
        if (options.onTomorrow != null) return options.onTomorrow!(rt);
        if (time == null) return formats.tomorrow;
        final t = time(dateTime);
        return "${formats.tomorrow}$separator$t";
      }
    } else {
      if (options.yesterday) {
        if (options.onYesterday != null) return options.onYesterday!(rt);
        if (time == null) return formats.yesterday;
        final t = time(dateTime);
        return "${formats.yesterday}$separator$t";
      }
    }
  }

  if (options.day && diff.inDays < 7) {
    final days = diff.inDays;
    if (options.onDays != null) return options.onDays!(rt);
    return "$days ${formats.day.apply(days)}$suffix";
  }

  if (options.week && diff.inDays < 30) {
    final weeks = (diff.inDays / 7).floor();
    if (options.onWeeks != null) return options.onWeeks!(rt);
    return "$weeks ${formats.week.apply(weeks)}$suffix";
  }

  if (options.month && diff.inDays < 365) {
    final months = (diff.inDays / 30).floor();
    if (options.onMonths != null) return options.onMonths!(rt);
    return "$months ${formats.month.apply(months)}$suffix";
  }

  if (options.year || date == null) {
    final years = (diff.inDays / 365).floor();
    if (options.onYears != null) return options.onYears!(rt);
    return "$years ${formats.year.apply(years)}$suffix";
  }

  return date(dateTime);
}