How to Create a Basic PubSub Application: Difference between revisions
From ElixirBlocks
No edit summary |
No edit summary |
||
| Line 47: | Line 47: | ||
|> broadcast_change([:testbed, :created]) | |> broadcast_change([:testbed, :created]) | ||
end | end | ||
</source> | |||
== Example Without Database == | |||
<source> | |||
defmodule AppWeb.PageLive do | |||
use AppWeb, :live_view | |||
def mount(_params, _session, socket) do | |||
if connected?(socket) do | |||
AppWeb.Endpoint.subscribe(topic) | |||
end | |||
{:ok, assign(socket, username: username, messages: [])} | |||
end | |||
def handle_info(%{event: "message", payload: message}, socket) do | |||
{:noreply, assign(socket, messages: socket.assigns.messages ++ [message])} | |||
end | |||
def handle_event("send", %{"text" => text}, socket) do | |||
AppWeb.Endpoint.broadcast(topic, "message", %{text: text, name: socket.assigns.username}) | |||
{:noreply, socket} | |||
end | |||
defp username do | |||
"User #{:rand.uniform(100)}" | |||
end | |||
defp topic do | |||
"chat" | |||
end | |||
def render(assigns)do | |||
~H""" | |||
<div> | |||
<h1>ChatLive</h1> | |||
<div class="messages" style="border: 1px solid #eee; height: 400px; overflow: scroll; margin-bottom: 8px;"> | |||
<%= for m <- @messages do %> | |||
<p style="margin: 2px;"><b><%= m.name %></b>: <%= m.text %></p> | |||
<% end %> | |||
</div> | |||
<form phx-submit="send"> | |||
<input type="text" name="text" /> | |||
<button type="submit">Send</button> | |||
</form> | |||
</div> | |||
""" | |||
end | |||
end | |||
</source> | </source> | ||
Revision as of 04:16, 16 June 2023
This page is in progress
In LiveView
def mount(_params, _session, socket) do
Testbeds.subscribe()
{:ok, assign(socket, testbeds: Testbeds.list_testbeds())}
end
def handle_info({TestBeds, [:testbed | _], _}, socket) do
{:noreply, assign(socket, testbeds: TestBeds.list_testbeds())}
end
App/test_beds.ex
@topic inspect(__MODULE__)
def subscribe do
Phoenix.PubSub.subscribe(App.PubSub, @topic)
end
defp broadcast_change({:ok, result}, event) do
Phoenix.PubSub.broadcast(App.PubSub, @topic, {__MODULE__, event, result})
{:ok, result}
end
# ....
def create_testbed(attrs \\ %{}) do
%Testbed{}
|> Testbed.changeset(attrs)
|> Repo.insert()
|> broadcast_change([:testbed, :created])
end
Example Without Database
defmodule AppWeb.PageLive do
use AppWeb, :live_view
def mount(_params, _session, socket) do
if connected?(socket) do
AppWeb.Endpoint.subscribe(topic)
end
{:ok, assign(socket, username: username, messages: [])}
end
def handle_info(%{event: "message", payload: message}, socket) do
{:noreply, assign(socket, messages: socket.assigns.messages ++ [message])}
end
def handle_event("send", %{"text" => text}, socket) do
AppWeb.Endpoint.broadcast(topic, "message", %{text: text, name: socket.assigns.username})
{:noreply, socket}
end
defp username do
"User #{:rand.uniform(100)}"
end
defp topic do
"chat"
end
def render(assigns)do
~H"""
<div>
<h1>ChatLive</h1>
<div class="messages" style="border: 1px solid #eee; height: 400px; overflow: scroll; margin-bottom: 8px;">
<%= for m <- @messages do %>
<p style="margin: 2px;"><b><%= m.name %></b>: <%= m.text %></p>
<% end %>
</div>
<form phx-submit="send">
<input type="text" name="text" />
<button type="submit">Send</button>
</form>
</div>
"""
end
end