feat(chat): notify message add/removal with pubsub
This commit is contained in:
parent
c788bfa8d8
commit
137b9b4581
@ -10,6 +10,8 @@ defmodule Slax.Chat do
|
|||||||
alias Slax.Chat.Room
|
alias Slax.Chat.Room
|
||||||
alias Slax.Repo
|
alias Slax.Repo
|
||||||
|
|
||||||
|
@pubsub Slax.PubSub
|
||||||
|
|
||||||
def create_room(attrs) do
|
def create_room(attrs) do
|
||||||
%Room{}
|
%Room{}
|
||||||
|> change_room(attrs)
|
|> change_room(attrs)
|
||||||
@ -53,9 +55,13 @@ defmodule Slax.Chat do
|
|||||||
end
|
end
|
||||||
|
|
||||||
def create_message(room, user, attrs) do
|
def create_message(room, user, attrs) do
|
||||||
%Message{room: room, user: user}
|
with {:ok, message} <-
|
||||||
|> change_message(attrs)
|
%Message{room: room, user: user}
|
||||||
|> Repo.insert()
|
|> change_message(attrs)
|
||||||
|
|> Repo.insert() do
|
||||||
|
Phoenix.PubSub.broadcast!(@pubsub, topic(room), {:new_message, message})
|
||||||
|
{:ok, message}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def change_message(message, attrs \\ %{}) do
|
def change_message(message, attrs \\ %{}) do
|
||||||
@ -63,8 +69,24 @@ defmodule Slax.Chat do
|
|||||||
end
|
end
|
||||||
|
|
||||||
def delete_message_by_id(message_id, %User{id: user_id}) do
|
def delete_message_by_id(message_id, %User{id: user_id}) do
|
||||||
Message
|
with {:ok, message} <-
|
||||||
|> Repo.get_by(id: message_id, user_id: user_id)
|
Message
|
||||||
|> Repo.delete()
|
|> Repo.get_by(id: message_id, user_id: user_id)
|
||||||
|
|> Repo.delete() do
|
||||||
|
Phoenix.PubSub.broadcast!(@pubsub, topic(message.room_id), {:deleted_message, message})
|
||||||
|
{:ok, message}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def subscribe_to_room(room) do
|
||||||
|
Phoenix.PubSub.subscribe(@pubsub, topic(room))
|
||||||
|
end
|
||||||
|
|
||||||
|
def unsubscribe_from_room(room) do
|
||||||
|
Phoenix.PubSub.unsubscribe(@pubsub, topic(room))
|
||||||
|
end
|
||||||
|
|
||||||
|
defp topic(%Room{id: room_id}), do: "chat_room:#{room_id}"
|
||||||
|
|
||||||
|
defp topic(room_id), do: topic(%Room{id: room_id})
|
||||||
end
|
end
|
||||||
|
@ -2,6 +2,8 @@ defmodule SlaxWeb.ChatRoomLive do
|
|||||||
@moduledoc false
|
@moduledoc false
|
||||||
use SlaxWeb, :live_view
|
use SlaxWeb, :live_view
|
||||||
|
|
||||||
|
require Logger
|
||||||
|
|
||||||
alias Slax.Accounts.User
|
alias Slax.Accounts.User
|
||||||
alias Slax.Chat
|
alias Slax.Chat
|
||||||
alias Slax.Chat.Message
|
alias Slax.Chat.Message
|
||||||
@ -133,6 +135,8 @@ defmodule SlaxWeb.ChatRoomLive do
|
|||||||
|
|
||||||
@impl Phoenix.LiveView
|
@impl Phoenix.LiveView
|
||||||
def handle_params(params, _session, socket) do
|
def handle_params(params, _session, socket) do
|
||||||
|
if socket.assigns[:room], do: Chat.unsubscribe_from_room(socket.assigns.room)
|
||||||
|
|
||||||
room =
|
room =
|
||||||
case Map.fetch(params, "id") do
|
case Map.fetch(params, "id") do
|
||||||
{:ok, id} ->
|
{:ok, id} ->
|
||||||
@ -144,6 +148,8 @@ defmodule SlaxWeb.ChatRoomLive do
|
|||||||
|
|
||||||
messages = Chat.list_messages_in_room(room)
|
messages = Chat.list_messages_in_room(room)
|
||||||
|
|
||||||
|
Chat.subscribe_to_room(room)
|
||||||
|
|
||||||
{:noreply,
|
{:noreply,
|
||||||
socket
|
socket
|
||||||
|> assign(hide_topic?: false, page_title: "# #{room.name}", room: room)
|
|> assign(hide_topic?: false, page_title: "# #{room.name}", room: room)
|
||||||
@ -168,10 +174,8 @@ defmodule SlaxWeb.ChatRoomLive do
|
|||||||
|
|
||||||
socket =
|
socket =
|
||||||
case Chat.create_message(room, user, message_params) do
|
case Chat.create_message(room, user, message_params) do
|
||||||
{:ok, message} ->
|
{:ok, _message} ->
|
||||||
socket
|
assign_message_form(socket, Chat.change_message(%Message{}))
|
||||||
|> stream_insert(:messages, message)
|
|
||||||
|> assign_message_form(Chat.change_message(%Message{}))
|
|
||||||
|
|
||||||
{:error, changeset} ->
|
{:error, changeset} ->
|
||||||
assign_message_form(socket, changeset)
|
assign_message_form(socket, changeset)
|
||||||
@ -182,8 +186,18 @@ defmodule SlaxWeb.ChatRoomLive do
|
|||||||
|
|
||||||
@impl Phoenix.LiveView
|
@impl Phoenix.LiveView
|
||||||
def handle_event("delete-message", %{"id" => message_id}, socket) do
|
def handle_event("delete-message", %{"id" => message_id}, socket) do
|
||||||
{:ok, message} = Chat.delete_message_by_id(message_id, socket.assigns.current_user)
|
Chat.delete_message_by_id(message_id, socket.assigns.current_user)
|
||||||
|
|
||||||
|
{:noreply, socket}
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl Phoenix.LiveView
|
||||||
|
def handle_info({:new_message, message}, socket) do
|
||||||
|
{:noreply, stream_insert(socket, :messages, message)}
|
||||||
|
end
|
||||||
|
|
||||||
|
@impl Phoenix.LiveView
|
||||||
|
def handle_info({:deleted_message, message}, socket) do
|
||||||
{:noreply, stream_delete(socket, :messages, message)}
|
{:noreply, stream_delete(socket, :messages, message)}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user