76 lines
2 KiB
Elixir
76 lines
2 KiB
Elixir
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
|