/
counter.ex
54 lines (43 loc) 路 1.38 KB
/
counter.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
defmodule LiveViewCounterWeb.Counter do
use Phoenix.LiveView
alias LiveViewCounter.Count
alias Phoenix.PubSub
alias LiveViewCounter.Presence
@topic Count.topic
@presence_topic "presence"
def mount(_params, _session, socket) do
PubSub.subscribe(LiveViewCounter.PubSub, @topic)
Presence.track(self(), @presence_topic, socket.id, %{})
LiveViewCounterWeb.Endpoint.subscribe(@presence_topic)
initial_present =
Presence.list(@presence_topic)
|> map_size
{:ok, assign(socket, val: Count.current(), present: initial_present) }
end
def handle_event("inc", _, socket) do
{:noreply, assign(socket, :val, Count.incr())}
end
def handle_event("dec", _, socket) do
{:noreply, assign(socket, :val, Count.decr())}
end
def handle_info({:count, count}, socket) do
{:noreply, assign(socket, val: count)}
end
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
def render(assigns) do
~L"""
<div id="livecount_container">
<h1>The count is: <%= @val %></h1>
<button phx-click="dec">-</button>
<button phx-click="inc">+</button>
<h1>Current users: <%= @present %></h1>
</div>
"""
end
end