You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
2.0 KiB
82 lines
2.0 KiB
2 years ago
|
defmodule ChirpWeb.PostLive.FormComponent do
|
||
|
use ChirpWeb, :live_component
|
||
|
|
||
|
alias Chirp.Timeline
|
||
|
|
||
|
@impl true
|
||
|
def render(assigns) do
|
||
|
~H"""
|
||
|
<div>
|
||
|
<.header>
|
||
|
<%= @title %>
|
||
|
<:subtitle>Use this form to manage post records in your database.</:subtitle>
|
||
|
</.header>
|
||
|
|
||
|
<.simple_form
|
||
|
:let={f}
|
||
|
for={@changeset}
|
||
|
id="post-form"
|
||
|
phx-target={@myself}
|
||
|
phx-change="validate"
|
||
|
phx-submit="save"
|
||
|
>
|
||
|
<.input field={{f, :body}} type="textarea" label="body" />
|
||
|
<:actions>
|
||
|
<.button phx-disable-with="Saving...">Save Post</.button>
|
||
|
</:actions>
|
||
|
</.simple_form>
|
||
|
</div>
|
||
|
"""
|
||
|
end
|
||
|
|
||
|
@impl true
|
||
|
def update(%{post: post} = assigns, socket) do
|
||
|
changeset = Timeline.change_post(post)
|
||
|
|
||
|
{:ok,
|
||
|
socket
|
||
|
|> assign(assigns)
|
||
|
|> assign(:changeset, changeset)}
|
||
|
end
|
||
|
|
||
|
@impl true
|
||
|
def handle_event("validate", %{"post" => post_params}, socket) do
|
||
|
changeset =
|
||
|
socket.assigns.post
|
||
|
|> Timeline.change_post(post_params)
|
||
|
|> Map.put(:action, :validate)
|
||
|
|
||
|
{:noreply, assign(socket, :changeset, changeset)}
|
||
|
end
|
||
|
|
||
|
def handle_event("save", %{"post" => post_params}, socket) do
|
||
|
save_post(socket, socket.assigns.action, post_params)
|
||
|
end
|
||
|
|
||
|
defp save_post(socket, :edit, post_params) do
|
||
|
case Timeline.update_post(socket.assigns.post, post_params) do
|
||
|
{:ok, _post} ->
|
||
|
{:noreply,
|
||
|
socket
|
||
|
|> put_flash(:info, "Post updated successfully")
|
||
|
|> push_navigate(to: socket.assigns.navigate)}
|
||
|
|
||
|
{:error, %Ecto.Changeset{} = changeset} ->
|
||
|
{:noreply, assign(socket, :changeset, changeset)}
|
||
|
end
|
||
|
end
|
||
|
|
||
|
defp save_post(socket, :new, post_params) do
|
||
|
case Timeline.create_post(post_params) do
|
||
|
{:ok, _post} ->
|
||
|
{:noreply,
|
||
|
socket
|
||
|
|> put_flash(:info, "Post created successfully")
|
||
|
|> push_navigate(to: socket.assigns.navigate)}
|
||
|
|
||
|
{:error, %Ecto.Changeset{} = changeset} ->
|
||
|
{:noreply, assign(socket, changeset: changeset)}
|
||
|
end
|
||
|
end
|
||
|
end
|