diff --git a/lib/chat_app_live_web/live/chat_form_component.ex b/lib/chat_app_live_web/live/chat_form_component.ex new file mode 100644 index 0000000..881d99c --- /dev/null +++ b/lib/chat_app_live_web/live/chat_form_component.ex @@ -0,0 +1,44 @@ +defmodule ChatAppLiveWeb.ChatFormComponent do + use ChatAppLiveWeb, :live_component + + alias ChatAppLive.Messages + alias ChatAppLive.Messages.Message + + def mount(socket) do + changeset = Messages.change_message(%Message{}) + {:ok, assign(socket, form: to_form(changeset))} + end + + def render(assigns) do + ~H""" +
+ <.form for={@form} phx-submit="save" phx-target={@myself}> + + <.input type="textarea" field={@form[:content]} /> + +
+ +
+ +
+ """ + end + + def handle_event("save", %{"message" => message_params}, socket) do + case Messages.create_message(message_params) do + {:ok, message} -> + send(self(), {:message_created, message}) + + changeset = Messages.change_message(%Message{}) + {:noreply, assign(socket, form: to_form(changeset))} + + {:error, %Ecto.Changeset{} = changeset} -> + {:noreply, assign(socket, form: to_form(changeset))} + end + end +end diff --git a/lib/chat_app_live_web/live/chat_form_live.ex b/lib/chat_app_live_web/live/chat_form_live.ex index f7350af..5ffd59b 100644 --- a/lib/chat_app_live_web/live/chat_form_live.ex +++ b/lib/chat_app_live_web/live/chat_form_live.ex @@ -2,21 +2,11 @@ defmodule ChatAppLiveWeb.ChatFormLive do use ChatAppLiveWeb, :live_view alias ChatAppLive.Messages - alias ChatAppLive.Messages.Message + alias ChatAppLiveWeb.ChatFormComponent def mount(_params, _session, socket) do messages = Messages.list_messages() - {:ok, assign(socket, form: to_form(Messages.change_message(%Message{})), messages: messages)} - end - - def handle_event("save", %{"message" => message_params}, socket) do - case Messages.create_message(message_params) do - {:ok, _message} -> - {:noreply, assign(socket, push_patch(socket, to: ~p"/messages"))} - - {:error, %Ecto.Changeset{} = changeset} -> - {:noreply, assign(socket, form: to_form(changeset))} - end + {:ok, assign(socket, messages: messages)} end def render(assigns) do @@ -30,19 +20,7 @@ defmodule ChatAppLiveWeb.ChatFormLive do />
- <.form for={@form} phx-submit="save"> - - <.input type="textarea" field={@form[:content]} /> - -
- -
- + <.live_component module={ChatFormComponent} id={:new} />
@@ -54,58 +32,66 @@ defmodule ChatAppLiveWeb.ChatFormLive do
""" end + + def message(assigns) do + ~H""" +
  • +
    +

    + <.link navigate={~p"/message/#{@message_id}"} class="hover:underline"> + <%= @message.content %> + +

    +
    +

    + Njoki K +

    + + + +

    +
    +
    +
    + +
    +
    + Total comments + +
    +
    2
    +
    +
    +
  • + """ + end + + def handle_info({:message_created, message}, socket) do + {:noreply, assign(socket, messages: [message | socket.assigns.messages])} + end end