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.
81 lines
2.0 KiB
81 lines
2.0 KiB
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
|
|
|