defmodule ExshomeWeb.Live.SettingsComponent do @moduledoc """ A component to render form for settings. """ use ExshomeWeb, :live_component alias Exshome.Settings @impl Phoenix.LiveComponent def update(%{settings: %module{} = settings}, socket) do socket = socket |> assign_new(:changeset, fn -> Settings.changeset(settings) end) |> assign_new(:module, fn -> module end) {:ok, socket} end @impl Phoenix.LiveComponent def handle_event("save", %{"settings" => clock_settings}, socket) do result = socket.assigns.module |> Settings.changeset(clock_settings) |> Ecto.Changeset.apply_action(:validate) changeset = case result do {:ok, settings} -> Settings.save_settings(settings) Settings.changeset(settings) {:error, invalid_changeset} -> invalid_changeset end {:noreply, assign(socket, changeset: changeset)} end def handle_event("validate", %{"settings" => clock_settings}, socket) do changeset = Settings.changeset(socket.assigns.module, clock_settings) {:noreply, assign(socket, changeset: changeset)} end @impl Phoenix.LiveComponent def render(assigns) do ~H"""
<.live_form changeset={@changeset} phx-target={@myself} as="settings" fields={@module.fields()} />
""" end end