Hello there, long time no see
I started to play around with a old project (phoenix 1.6, not the new one .7
), a little question I have considering live view and real-time updates. I have a non-working (:D) chat app. When a message
is created:
def subscribe do
Phoenix.PubSub.subscribe(Friendczar.PubSub, "messages")
end
def create_message(attrs \\ %{}) do
%Message{}
|> Message.changeset(attrs)
|> Repo.insert()
|> broadcast(:message_created)
end
def broadcast({:ok, message}, event) do
Phoenix.PubSub.broadcast(
Friendczar.PubSub,
"messages",
{event, message}
)
{:ok, message}
end
then, in live view on /messages:
def mount (...) if connected?(socket), do: Messages.subscribe() (...) end
def handle_event("send_message", %{"message" => attrs}, socket) do
case Messages.create_message(attrs) do
{:ok, message} ->
changeset_for_message = Messages.change_message(%Message{})
socket = assign(socket, changeset_for_message: changeset_for_message)
{:noreply, socket}
{:error, %Ecto.Changeset{} = changeset_for_message} ->
socket = assign(socket, changeset_for_message: changeset_for_message)
{:noreply, socket}
end
end
def handle_info({:message_created, message}, socket) do
messages = socket.assigns[:messages] || []
socket =
update(
socket,
:messages,
fn messages -> messages ++ [message] end
)
{:noreply, socket}
end
and that works pretty well. I mean that on creation of a message, it live broad casts itself on all subscribed to the Pub “users”.
However, in a another live view, lets say /test
I do subscribe again to the “topic” in mount, then I do have the same handle_info function, but when a message is created it does not live-updates in /test. Only in /messages. What am I missing? I think the logic is right.
Best Regards