I’m currently learning some phoenix and built a counting app with a simple increase/decrease. Both worked fine so I decided to implement GenServers and PubSub to see how many users currently are on the page (presence).
Whole error:
GenServer #PID<0.511.0> terminating
** (FunctionClauseError) no function clause matching in CounterWeb.Counter.handle_info/2
(counter 0.1.0) lib/counter_web/live/counter.ex:45: CounterWeb.Counter.handle_info({:count, 1}, #Phoenix.LiveView.Socket<assigns: %{__changed__: %{}, flash: %{}, live_action: nil, present: 1, val:
1}, endpoint: CounterWeb.Endpoint, id: "phx-FtSq5dehn8AlGgAF", parent_pid: nil, root_pid: #PID<0.511.0>, router: CounterWeb.Router, transport_pid: #PID<0.506.0>, view: CounterWeb.Counter, ...>)
I think it’s coming from my make change function
defp make_change(count, change) do
new_count = count + change
PubSub.broadcast(Counter.PubSub, topic(), {:count, new_count})
{:reply, new_count, new_count}
end
and my handle info
def handle_info(
%{event: "presence_diff", payload: %{joins: joins, leaves: leaves}},
%{assigns: %{present: present}} = socket
) do
new_present = present + map_size(joins) - map_size(leaves)
{:noreply, assign(socket, :present, new_present)}
end
Someone recommended me to create another clause and do the same kind of setup as I did with the previous functions to handle the calls, example:
def handle_call(:reply, _from, count) do
{:ok, count, count}
end
def handle_call(:incr, _from, count) do
make_change(count, +1)
end
def handle_call(:decr, _from, count) do
make_change(count, -1)
end
My first argument is the message I receive, I am sending a tuple and I have to match that tuple.
I think I have to add another handle_info, like this
def handle_info({count: count}, socket) do
# ???
{:noreply, socket}
end
How would I handle/implement that? Can anyone help me by explaining that a bit?