defmodule ExshomePlayer.Web.Live.EditLinkModal do @moduledoc """ Modal for editing links. """ use ExshomeWeb.Live.AppPage, dependencies: [] alias ExshomePlayer.Schemas.Track @fields [ title: [], path: [] ] @impl LiveView def mount(_params, session, %Socket{} = socket) do socket = socket |> assign(:error, nil) |> assign(:fields, @fields) |> fetch_track_from_session(session) {:ok, socket} end @impl LiveView def handle_event("validate", %{"data" => data}, %Socket{} = socket) do data = sanitize_data(data) changeset = socket.assigns.changeset new_changeset = changeset.data |> Track.changeset(data) |> Map.put(:action, changeset.action) {:noreply, assign(socket, :changeset, new_changeset)} end @impl LiveView def handle_event("save", %{"data" => data}, %Socket{} = socket) do data = sanitize_data(data) track = socket.assigns.changeset.data result = if track.id do Track.update(track, data) else Track.create(data) end socket = case result do {:ok, _result} -> close_modal(socket) {:error, changeset} -> assign(socket, :changeset, changeset) end {:noreply, socket} end defp sanitize_data(data) do allowed_fields = for {field, _} <- @fields, do: "#{field}" for {field, value} <- data, field in allowed_fields, into: %{"type" => "url"} do {field, value} end end defp fetch_track_from_session(%Socket{} = socket, session) do case get_track_by_session(session) do {:ok, track} -> assign(socket, :changeset, Track.changeset(track)) {:error, reason} -> assign(socket, :error, reason) end end def get_track_by_session(%{"track_id" => track_id}) do case Track.get!(track_id) do %Track{type: :url} = track -> {:ok, track} _ -> {:error, "unable to edit data for this track"} end end def get_track_by_session(_session) do {:ok, %Track{type: :url, path: ""}} end end