From 8179b4317ccc339a6764b67cb7ed810816722fe0 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Wed, 22 Apr 2026 18:14:14 +0100 Subject: [PATCH] ML-142: forgot to support timezones --- lib/music_library_web/components/release.ex | 35 +++++++++++-------- .../live/collection_live/show.ex | 1 + 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/lib/music_library_web/components/release.ex b/lib/music_library_web/components/release.ex index e492e0a3..fa5f8c19 100644 --- a/lib/music_library_web/components/release.ex +++ b/lib/music_library_web/components/release.ex @@ -14,24 +14,27 @@ defmodule MusicLibraryWeb.Components.Release do @impl true def mount(socket) do - current_time = DateTime.utc_now() - {:ok, socket |> assign(:can_scrobble?, ScrobbleActivity.can_scrobble?()) |> assign(:release_with_tracks, AsyncResult.loading()) |> assign(:already_scrobbled, false) |> assign(:selected_tracks, MapSet.new()) - |> assign(:finished_at, current_time) - |> assign(:form, to_form(%{"finished_at" => current_time}, as: :release)) + |> assign(:timezone, MusicLibrary.default_timezone()) + |> assign(:finished_at, nil) + |> assign(:form, to_form(%{"finished_at" => nil}, as: :release)) |> assign(:pending_form_params, nil)} end @impl true def update(%{record: record} = assigns, socket) do + socket = assign(socket, assigns) + current_time = DateTime.utc_now() |> DateTime.shift_zone!(socket.assigns.timezone) + {:ok, socket - |> assign(assigns) + |> assign(:finished_at, current_time) + |> assign(:form, to_form(%{"finished_at" => DateTime.to_naive(current_time)}, as: :release)) |> assign(:release_with_tracks, AsyncResult.loading()) |> start_async(:release_with_tracks, fn -> load_release_with_tracks(record.selected_release_id) @@ -81,32 +84,33 @@ defmodule MusicLibraryWeb.Components.Release do params -> release = socket.assigns.release_with_tracks.result new_selected = apply_form_params(release, params, socket.assigns.selected_tracks) + finished_at = parse_finished_at(params["finished_at"], socket.assigns.timezone) socket |> assign(:selected_tracks, new_selected) - |> assign(:finished_at, parse_finished_at(params["finished_at"])) + |> assign(:finished_at, finished_at) |> assign(:pending_form_params, nil) end end - @spec parse_finished_at(term()) :: DateTime.t() | nil - defp parse_finished_at(nil), do: nil - defp parse_finished_at(""), do: nil + @spec parse_finished_at(term(), String.t()) :: DateTime.t() | nil + defp parse_finished_at(nil, _timezone), do: nil + defp parse_finished_at("", _timezone), do: nil - defp parse_finished_at(value) when is_binary(value) do + defp parse_finished_at(value, timezone) when is_binary(value) do case DateTime.from_iso8601(value) do {:ok, datetime, _offset} -> datetime {:error, _} -> case NaiveDateTime.from_iso8601(value) do - {:ok, naive} -> DateTime.from_naive!(naive, "Etc/UTC") + {:ok, naive} -> DateTime.from_naive!(naive, timezone) {:error, _} -> nil end end end - defp parse_finished_at(_), do: nil + defp parse_finished_at(_, _), do: nil @impl true def render(assigns) do @@ -535,11 +539,12 @@ defmodule MusicLibraryWeb.Components.Release do release = socket.assigns.release_with_tracks.result new_selected = apply_form_params(release, params, socket.assigns.selected_tracks) finished_at_raw = params["finished_at"] + finished_at = parse_finished_at(finished_at_raw, socket.assigns.timezone) {:noreply, socket |> assign(:selected_tracks, new_selected) - |> assign(:finished_at, parse_finished_at(finished_at_raw)) + |> assign(:finished_at, finished_at) |> assign(:form, to_form(%{"finished_at" => finished_at_raw}, as: :release))} end @@ -558,12 +563,12 @@ defmodule MusicLibraryWeb.Components.Release do end def handle_event("reset_to_now", _params, socket) do - current_time = DateTime.utc_now() + current_time = DateTime.utc_now() |> DateTime.shift_zone!(socket.assigns.timezone) {:noreply, socket |> assign(:finished_at, current_time) - |> assign(:form, to_form(%{"finished_at" => current_time}, as: :release))} + |> assign(:form, to_form(%{"finished_at" => DateTime.to_naive(current_time)}, as: :release))} end def handle_event("scrobble_selected_tracks", _params, socket) diff --git a/lib/music_library_web/live/collection_live/show.ex b/lib/music_library_web/live/collection_live/show.ex index df57b20e..708fb115 100644 --- a/lib/music_library_web/live/collection_live/show.ex +++ b/lib/music_library_web/live/collection_live/show.ex @@ -297,6 +297,7 @@ defmodule MusicLibraryWeb.CollectionLive.Show do sheet_id="release-with-tracks-sheet" module={MusicLibraryWeb.Components.Release} record={@record} + timezone={@timezone} /> <.live_component