I am puzzled by the callback to the “presence_diff” event from Presence
.
I set up Presence.track
on mount:
Presence.track(self(), "presence", System.os_time(:second), %{user_id: user_id})
When a user connects, I inspect the message
def handle_info(data, socket) do
IO.inspect(data)
{:noreply, socket}
end
This returns:
data = %Phoenix.Socket.Broadcast{
topic: "presence",
event: "presence_diff",
payload: %{
joins: %{
"1669885850" => %{metas: [%{phx_ref: "FyygVNocRKcFfiRl", user_id: 1}]}
},
leaves: %{}
}
}
However, the pattern match below doesn’t work:
def handle_info(%{event: "presence_diff", payload: %{joins: %{}}}, socket ) do
IO.puts "leaves"
{:noreply, socket}
end
def handle_info(%{event: "presence_diff", payload: %{leaves: %{}}}, socket ) do
IO.puts "joins"
{:noreply, socket}
end
This always returns “leaves” (in this order), so will:
def handle_info(%{event: "presence_diff", payload: %{joins: joins, leaves: leaves}}, socket ) do
case {joins, leaves} do
{ %{}, _} ->
IO.puts "leaves"
{ _, %(} } ->
IO.puts "joins"
end
Only this one works.
def handle_info(%{event: "presence_diff", payload: %{joins: joins, leaves: leaves}}, socket ) do
cond do
joins == %(} ->
IO.puts "leaves"
leaves == %(} ->
IO.puts "joins"
end
Why can’t I use pattern matching?