Aggiedit/lib/aggiedit_web/live/post_live/form_component.ex

88 lines
2.5 KiB
Elixir

defmodule AggieditWeb.PostLive.FormComponent do
use AggieditWeb, :live_component
alias Aggiedit.Rooms
alias Aggiedit.Rooms.Post
alias Aggiedit.Uploads
alias Aggiedit.Repo
@impl true
def update(%{current_user: current_user, post: post} = assigns, socket) do
changeset = Rooms.change_post(post)
{:ok,
socket
|> assign(assigns)
|> assign(%{changeset: changeset, current_user: current_user, uploaded_files: []})
|> allow_upload(:upload, accept: ~w(.jpg .jpeg .png .gif), max_entries: 1)
}
end
@impl true
def handle_event("validate", %{"post" => post_params}, socket) do
changeset =
socket.assigns.post
|> Rooms.change_post(post_params)
|> Map.put(:action, :validate)
{:noreply, assign(socket, :changeset, changeset)}
end
def handle_event("save", %{"post" => post_params}, socket) do
socket
|> save_post(socket.assigns.action, post_params)
end
defp save_upload(socket, %Post{} = post) do
consume_uploaded_entries(socket, :upload, fn data, upload ->
[extension | _] = MIME.extensions(upload.client_type)
filename = "#{upload.uuid}.#{extension}"
dest = Path.join("priv/static/uploads", filename)
with :ok <- File.mkdir_p(Path.dirname(dest)) do
File.cp!(data.path, dest)
end
{:ok, upload} = Uploads.create_upload(%{
file: filename,
size: upload.client_size,
mime: upload.client_type,
}, socket.assigns.current_user)
post
|> Repo.preload(:upload)
|> Post.change_upload(upload)
|> Repo.update()
{:ok, upload}
end)
{:ok, post}
end
defp save_post(socket, :edit, post_params) do
case Rooms.update_post(socket.assigns.post, post_params, &save_upload(socket, &1)) do
{:ok, _post} ->
{:noreply,
socket
|> put_flash(:info, "Post updated successfully")
|> push_redirect(to: socket.assigns.return_to)}
{:error, %Ecto.Changeset{} = changeset} ->
{:noreply, assign(socket, :changeset, changeset)}
end
end
defp save_post(socket, :new, post_params) do
case Rooms.create_post(post_params, socket.assigns.current_user, &save_upload(socket, &1)) do
{:ok, _post} ->
{:noreply,
socket
|> put_flash(:info, "Post created successfully")
|> push_redirect(to: socket.assigns.return_to)}
{:error, %Ecto.Changeset{} = changeset} ->
{:noreply, assign(socket, changeset: changeset)}
end
end
end