defmodule Moon.Components.Calendar do @moduledoc false use Moon.StatefulComponent alias Moon.Assets.Icons.IconChevronLeftRounded alias Moon.Assets.Icons.IconChevronRightRounded alias Moon.Components.Button alias Moon.Components.Calendar.Month alias Moon.Components.Calendar.Week prop(week_starts_on, :integer, default: 1, values: Enum.to_list(1..7)) prop(events, :list, default: []) data(date, :datetime, default: Timex.today()) data(show_month, :boolean, default: true) def render(assigns) do ~F"""
{calendar_title(@date, @week_starts_on, @show_month)}
{day_name}
""" end defp days_names(weekstart) do date = Timex.today() Timex.Interval.new( from: Timex.beginning_of_week(date, weekstart), until: Timex.end_of_week(date, weekstart), left_open: false, right_open: false ) |> Enum.map(fn day -> Timex.format!(day, "%a", :strftime) end) end defp calendar_title(date, _, true), do: Timex.format!(date, "%B %Y", :strftime) defp calendar_title(date, weekstart, false) do date |> Timex.beginning_of_week(weekstart) |> calendar_title(weekstart, true) end def handle_event("set_today", _, socket) do {:noreply, assign(socket, date: Timex.today())} end def handle_event("shift_range", %{"shift" => shift}, socket) do shift = String.to_integer(shift) if socket.assigns.show_month do {:noreply, update(socket, :date, &Timex.shift(&1, months: shift))} else {:noreply, update(socket, :date, &Timex.shift(&1, weeks: shift))} end end def handle_event("toggle_view", _, socket) do date = socket.assigns.date date = if socket.assigns.show_month do Timex.beginning_of_week(date, socket.assigns.week_starts_on) else date end {:noreply, assign(socket, show_month: !socket.assigns.show_month, date: date)} end end