83 lines
2.2 KiB
Elixir
Raw Normal View History

defmodule SlaxWeb.ChatRoomLive.Edit do
@moduledoc false
use SlaxWeb, :live_view
alias Slax.Chat
@impl Phoenix.LiveView
def render(assigns) do
~H"""
<div class="mx-auto w-96 mt-12">
<.header>
{@page_title}
<:actions>
<.link
class="font-normal text-xs text-blue-600 hover:text-blue-700"
navigate={~p"/rooms/#{@room}"}
>
Back
</.link>
</:actions>
</.header>
<.simple_form for={@form} id="room-form" phx-change="validate-room" phx-submit="save-room">
<.input field={@form[:name]} type="text" label="Name" phx-debounce />
<.input field={@form[:topic]} type="text" label="Topic" phx-debounce />
<:actions>
<.button phx-disable-with="Saving..." class="w-full">Save</.button>
</:actions>
</.simple_form>
</div>
"""
end
@impl Phoenix.LiveView
def mount(%{"id" => id}, _session, socket) do
room = Chat.get_room!(id)
socket =
if Chat.joined?(room, socket.assigns.current_user) do
changeset = Chat.change_room(room)
socket
|> assign(page_title: "Edit chat room", room: room)
|> assign_form(changeset)
else
socket
|> put_flash(:error, "Permission denied")
|> push_navigate(to: ~p"/")
end
{:ok, socket}
end
@impl Phoenix.LiveView
def handle_event("save-room", %{"room" => room_params}, socket) do
socket =
case Chat.update_room(socket.assigns.room, room_params) do
{:ok, room} ->
socket
|> put_flash(:info, "Room #{room.name} updated succesfully")
|> push_navigate(to: ~p"/rooms/#{room}")
{:error, changeset} ->
assign_form(socket, changeset)
end
{:noreply, socket}
end
@impl Phoenix.LiveView
def handle_event("validate-room", %{"room" => room_params}, socket) do
changeset =
socket.assigns.room
|> Chat.change_room(room_params)
|> Map.put(:action, :validate)
{:noreply, assign_form(socket, changeset)}
end
defp assign_form(socket, %Ecto.Changeset{} = changeset) do
assign(socket, :form, to_form(changeset))
end
end