defmodule PhilomenaWeb.AppView do use Phoenix.HTML @time_strings %{ seconds: "less than a minute", minute: "about a minute", minutes: "%d minutes", hour: "about an hour", hours: "about %d hours", day: "a day", days: "%d days", month: "about a month", months: "%d months", year: "about a year", years: "%d years" } def pretty_time(time) do seconds = NaiveDateTime.diff(NaiveDateTime.utc_now(), time, :second) relation = if seconds < 0, do: "from now", else: "ago" time = time |> DateTime.from_naive!("Etc/UTC") |> DateTime.to_iso8601() seconds = abs(seconds) minutes = abs(div(seconds, 60)) hours = abs(div(minutes, 60)) days = abs(div(hours, 24)) months = abs(div(days, 30)) years = abs(div(days, 365)) words = cond do seconds < 45 -> String.replace(@time_strings[:seconds], "%d", to_string(seconds)) seconds < 90 -> String.replace(@time_strings[:minute], "%d", to_string(1)) minutes < 45 -> String.replace(@time_strings[:minutes], "%d", to_string(minutes)) minutes < 90 -> String.replace(@time_strings[:hour], "%d", to_string(1)) hours < 24 -> String.replace(@time_strings[:hours], "%d", to_string(hours)) hours < 42 -> String.replace(@time_strings[:day], "%d", to_string(1)) days < 30 -> String.replace(@time_strings[:days], "%d", to_string(days)) days < 45 -> String.replace(@time_strings[:month], "%d", to_string(1)) days < 365 -> String.replace(@time_strings[:months], "%d", to_string(months)) days < 548 -> String.replace(@time_strings[:year], "%d", to_string(1)) true -> String.replace(@time_strings[:years], "%d", to_string(years)) end content_tag(:time, "#{words} #{relation}", datetime: time, title: time) end def can?(conn, action, model) do Canada.Can.can?(conn.assigns.current_user, action, model) end def number_with_delimiter(number) do number |> to_charlist() |> Enum.reverse() |> Enum.chunk_every(3) |> Enum.map(&Enum.reverse(&1)) |> Enum.reverse() |> Enum.join(",") end def pluralize(singular, plural, count) do if count == 1 do singular else plural end end def button_to(text, route, args) do method = Keyword.get(args, :method, "get") class = Keyword.get(args, :class, nil) data = Keyword.get(args, :data, []) form_for(nil, route, [method: method, class: "button_to"], fn _f -> submit text, class: class, data: data end) end end