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
- <%= for message <- @messages do %>
- -
-
-
-
-
-
-
- Total comments
-
-
-
- 2
-
-
-
- <% end %>
+ <.message :for={message <- @messages} message={message} message_id={message.id} />
"""
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