defmodule Web.PostLive do @moduledoc false use Web, :live_view @impl true def mount(_params, _session, socket) do socket = assign(socket, :load_trix?, true) {:ok, socket} end @impl true def handle_params(_params, _uri, %{assigns: %{live_action: :new}} = socket) do post = %Schema.Post{} changeset = Core.Posts.changeset(post, %{}) socket = assign(socket, post: post, form: to_form(changeset)) {:noreply, socket} end def handle_params(%{"post_id" => post_id}, _uri, %{assigns: %{live_action: :edit}} = socket) do post = Core.Posts.get_post!(post_id) changeset = Core.Posts.changeset(post, %{}) socket = assign(socket, post: post, form: to_form(changeset)) {:noreply, socket} end @impl true def handle_event("save_post", %{"post" => attrs}, %{assigns: %{live_action: :new}} = socket) do socket = case Core.Posts.create_post(attrs) do {:ok, post} -> push_navigate(socket, to: ~p"/admin/posts/#{post}") {:error, changeset} -> assign(socket, form: to_form(changeset)) end {:noreply, socket} end def handle_event("save_post", %{"post" => attrs}, %{assigns: %{post: post, live_action: :edit}} = socket) do socket = case Core.Posts.update_post(post, attrs) do {:ok, post} -> assign(socket, post: post, form: post |> Core.Posts.changeset(%{}) |> to_form() ) {:error, changeset} -> assign(socket, form: to_form(changeset)) end {:noreply, socket} end @impl true def render(assigns) do ~H""" <.form for={@form} class="flex flex-col gap-y-2" phx-submit="save_post"> <.input type="hidden" field={@form[:body]} /> <.input class="text-lg" field={@form[:title]} placeholder="Title" /> <div id="editor" phx-update="ignore"> <trix-editor input={@form[:body].id} class="prose prose-cms max-w-none"></trix-editor> </div> <button type="submit" class="self-end">save</button> </.form> """ end end