ML-142: forgot to support timezones

This commit is contained in:
Claudio Ortolina
2026-04-22 18:14:14 +01:00
parent 1b782d910b
commit 8179b4317c
2 changed files with 21 additions and 15 deletions
+20 -15
View File
@@ -14,24 +14,27 @@ defmodule MusicLibraryWeb.Components.Release do
@impl true @impl true
def mount(socket) do def mount(socket) do
current_time = DateTime.utc_now()
{:ok, {:ok,
socket socket
|> assign(:can_scrobble?, ScrobbleActivity.can_scrobble?()) |> assign(:can_scrobble?, ScrobbleActivity.can_scrobble?())
|> assign(:release_with_tracks, AsyncResult.loading()) |> assign(:release_with_tracks, AsyncResult.loading())
|> assign(:already_scrobbled, false) |> assign(:already_scrobbled, false)
|> assign(:selected_tracks, MapSet.new()) |> assign(:selected_tracks, MapSet.new())
|> assign(:finished_at, current_time) |> assign(:timezone, MusicLibrary.default_timezone())
|> assign(:form, to_form(%{"finished_at" => current_time}, as: :release)) |> assign(:finished_at, nil)
|> assign(:form, to_form(%{"finished_at" => nil}, as: :release))
|> assign(:pending_form_params, nil)} |> assign(:pending_form_params, nil)}
end end
@impl true @impl true
def update(%{record: record} = assigns, socket) do def update(%{record: record} = assigns, socket) do
socket = assign(socket, assigns)
current_time = DateTime.utc_now() |> DateTime.shift_zone!(socket.assigns.timezone)
{:ok, {:ok,
socket 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()) |> assign(:release_with_tracks, AsyncResult.loading())
|> start_async(:release_with_tracks, fn -> |> start_async(:release_with_tracks, fn ->
load_release_with_tracks(record.selected_release_id) load_release_with_tracks(record.selected_release_id)
@@ -81,32 +84,33 @@ defmodule MusicLibraryWeb.Components.Release do
params -> params ->
release = socket.assigns.release_with_tracks.result release = socket.assigns.release_with_tracks.result
new_selected = apply_form_params(release, params, socket.assigns.selected_tracks) new_selected = apply_form_params(release, params, socket.assigns.selected_tracks)
finished_at = parse_finished_at(params["finished_at"], socket.assigns.timezone)
socket socket
|> assign(:selected_tracks, new_selected) |> assign(:selected_tracks, new_selected)
|> assign(:finished_at, parse_finished_at(params["finished_at"])) |> assign(:finished_at, finished_at)
|> assign(:pending_form_params, nil) |> assign(:pending_form_params, nil)
end end
end end
@spec parse_finished_at(term()) :: DateTime.t() | nil @spec parse_finished_at(term(), String.t()) :: DateTime.t() | nil
defp parse_finished_at(nil), do: nil defp parse_finished_at(nil, _timezone), do: nil
defp parse_finished_at(""), 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 case DateTime.from_iso8601(value) do
{:ok, datetime, _offset} -> {:ok, datetime, _offset} ->
datetime datetime
{:error, _} -> {:error, _} ->
case NaiveDateTime.from_iso8601(value) do case NaiveDateTime.from_iso8601(value) do
{:ok, naive} -> DateTime.from_naive!(naive, "Etc/UTC") {:ok, naive} -> DateTime.from_naive!(naive, timezone)
{:error, _} -> nil {:error, _} -> nil
end end
end end
end end
defp parse_finished_at(_), do: nil defp parse_finished_at(_, _), do: nil
@impl true @impl true
def render(assigns) do def render(assigns) do
@@ -535,11 +539,12 @@ defmodule MusicLibraryWeb.Components.Release do
release = socket.assigns.release_with_tracks.result release = socket.assigns.release_with_tracks.result
new_selected = apply_form_params(release, params, socket.assigns.selected_tracks) new_selected = apply_form_params(release, params, socket.assigns.selected_tracks)
finished_at_raw = params["finished_at"] finished_at_raw = params["finished_at"]
finished_at = parse_finished_at(finished_at_raw, socket.assigns.timezone)
{:noreply, {:noreply,
socket socket
|> assign(:selected_tracks, new_selected) |> 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))} |> assign(:form, to_form(%{"finished_at" => finished_at_raw}, as: :release))}
end end
@@ -558,12 +563,12 @@ defmodule MusicLibraryWeb.Components.Release do
end end
def handle_event("reset_to_now", _params, socket) do 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, {:noreply,
socket socket
|> assign(:finished_at, current_time) |> 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 end
def handle_event("scrobble_selected_tracks", _params, socket) def handle_event("scrobble_selected_tracks", _params, socket)
@@ -297,6 +297,7 @@ defmodule MusicLibraryWeb.CollectionLive.Show do
sheet_id="release-with-tracks-sheet" sheet_id="release-with-tracks-sheet"
module={MusicLibraryWeb.Components.Release} module={MusicLibraryWeb.Components.Release}
record={@record} record={@record}
timezone={@timezone}
/> />
<.live_component <.live_component