gastonrey

gastonrey

Phoenix LiveView and handle a broadcast from outside module

Hi guys, I got a question about something I was not able to solve at all. Am just starting in this world so, sorry if it’s so trivial. This is not a professional thing, am just trying things out to learn.

The point is, I have a Phoenix app running which shows some information when you visit the /feed url. At the moment what it is doing is so simple, using the :timer it refreshes my html every X ms. and it happens all in my LiveView module.

But now I have created a new module which uses GenServer and is started when the app starts (at the application.ex), this module contains all the :timer and command output extracted from the LiveView module and when handles the event I broadcast the information that I would to handle in my LiveView module when am subscribed and handling this event.

Unfortunately something is wrong, since the handle thing is not getting anything and my html never gets refreshed.

Summarizing:

GenServer module A which has a :timer, then handles this :tick event and broadcast some information. To broadcast am doing:
Endpoint.broadcast_from!(self(), @topic, "message", %{name: 'foo'})

Liveview module which renders some information that is expecting to get by handleing the broadcasted message above and assigns it. For that purpose at the mount() method I subscribe this module to the topic above and then created a handler for that event, looks something like this:

def handle_info("message", %{name: name}) do // .... {:noreply, []} end
But nothing comes up and my html keeps as it is. In console I can see the GenServer module is in the loop by the :timer added so that is broadcasting, but can not catch it.

What am I doing wrong?

Most Liked

gastonrey

gastonrey

This was exactly the problem, this is wrapped into broadcast struct, I tried this but in the wrong way, so after broadcasting this from my GenServer module:

LiveViewTodosWeb.Endpoint.broadcast_from!(self(), @topic, "message", %{name: 'grey'})

From my live view module I handle the event by this way and it works as expected:

def handle_info(%Broadcast{event: "message"}, socket) do
   IO.puts "GASTY !!!!"
   {:noreply, []}
end

Thanks a lot for the quick help guys!!!

idi527

idi527

:waving_hand:

You might need to check if the socket is connected?(socket) before doing any statefull work like subscribing to a pubsub topic. Also note that the message you’d receive will be probably wrapped in the phoenix’s broadcast struct.

# ...
@impl true
def mount(_session, socket) do
  if connected?(socket) do
    Phoenix.PubSub.subscribe(YourApp.PubSub, "some_topic")
  end
  {:ok, socket}
end

@impl true
def handle_info(%Phoenix.Socket.Broadcast{event: "message", topic: topic, payload: %{name: name}}, socket) do
  # ...
  {:noreply, socket}
end

Check out a presense example in the live view demo repo: phoenix_live_view_example/lib/demo_web/live/user_live/presence_index.ex at master · chrismccord/phoenix_live_view_example · GitHub.

Where Next?

Popular in Questions Top

myronmarston
The Elixir Typespec docs show the following syntax for keyword lists in typespecs: # ... | [key: type] # keyword lists...
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set? Thanks.
New
LegitStack
I’m trying to make a websocket server in Phoenix or raw Elixir. I heard about gun, I think I could use cowboy, but since I’m not that sma...
New
hariharasudhan94
lets say i have a sample like a = 20; b = 10; if (a > b) do {:ok, "a"} end if (a < b) do {:ok, b} end if (a == b) do {:ok, "equa...
New
jaysoifer
Is there a way to rollback a specific migration and only that one (“skipping” all the other ones)? Would mix ecto.rollback -v 200809061...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
script
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this "1000" What is the ...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New

Other popular topics Top

9mm
I am constructing a JSON object (map) and I need to conditionally set a field. I’m trying to write proper elixir-way code… and I’m at a l...
New
chrismccord
Phoenix 1.4.0 released Phoenix 1.4 is out! This release ships with exciting new features, most notably with HTTP2 support, improved deve...
688 30877 112
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? Ecto.Repo — Ecto v3.14.0 has exampl...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
Emily
I have VueJS GUIs with the project generated using Webpack. I have Elixir modules that will need to be used by the VueJS GUIs. I forese...
New
grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 52341 488
New
komlanvi
Hi everyone, I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
marick
I had some trouble figuring out how to make many-to-many associations work. Once I got it working, I wrote a blog post. Because I’m a nov...
New

We're in Beta

About us Mission Statement