defmodule MihainatorWeb.ResultComponent do @moduledoc false use Phoenix.LiveComponent @impl true def update(assigns, socket) do months = get_one_day_for_each_month(assigns.calendar_dates) socket = assign(socket, assigns: assigns, months: months) {:ok, socket} end def time_button(%{day: day_info} = assigns) do {day, info} = day_info parsed_day = get_date(day) classes = get_button_classes(info) style = get_button_style(day) assigns = assign(assigns, classes: classes, day: parsed_day.day, style: style) ~H""" """ end def month(%{day: day_info} = assigns) do parsed_day = get_date(day_info) formatted_month = parsed_day |> Calendar.strftime("%B") assigns = assign(assigns, formatted_month: formatted_month, year: parsed_day.year) ~H"""
<%= @formatted_month %> <%= @year %>
""" end def get_days_of_month(socket, first_of_month) do first_of_month = get_date(first_of_month) start_of_range = NaiveDateTime.to_date(first_of_month) |> Date.shift(day: -1) end_of_range = Date.end_of_month(first_of_month) |> Date.shift(day: 1) Map.filter(socket.assigns.calendar_dates, fn {date, _} -> date = get_date(date) Date.after?(date, start_of_range) and Date.before?(date, end_of_range) end) end defp get_one_day_for_each_month(calendar_dates) do Map.keys(calendar_dates) |> Enum.sort() |> Enum.filter(fn x -> String.ends_with?(x, "-01") end) end defp get_date(date) do Timex.parse!(date, "{YYYY}-{M}-{D}") end defp get_button_classes(info) do {out_messages, in_messages} = Enum.split_with(info, fn %{direction: direction} -> direction == "out" end) length_out = length(out_messages) length_in = length(in_messages) cond do length_in < length_out -> "bg-green-300 dark:text-slate-600" length_in > length_out -> "bg-red-300 dark:text-slate-600" true -> "" end end defp get_button_style(day) do is_first_of_month = String.ends_with?(day, "-01") day = get_date(day) case is_first_of_month do true -> "grid-column: #{Date.day_of_week(day)}" _ -> "" end end end