Here is some more code.
This is the live component:
defmodule OHA.Components.Live.Jobs do
@moduledoc """
A live component to render long running jobs.
"""
use OHAWeb, :live_component
import OHA.Gettext
@confirm_message dgettext("oha", "Are you sure?")
@impl true
def mount(socket) do
{:ok, socket}
end
@impl true
def update(%{selected_ids: selected_ids} = assigns, socket) do
require Logger
Logger.error("== LOG UPDATE HERE ==")
{:ok,
socket
|> assign(assigns)
|> assign(jobs_started: OHA.LFT.list_started_jobs())
|> assign(selected_ids_attr: Enum.join(selected_ids, "|"))
|> assign(jobs_disabled: selected_ids == [])}
end
def update(_assigns, socket) do
require Logger
Logger.error("== LOG UPDATE THERE ==")
{:ok, socket}
end
@impl true
def render(assigns) do
~H"""
<div class="Card mb-4 text-right">
<div class="w-full text-left">
<div :for={job <- @jobs_started} class="bg-info text-white p-4 rounded mb-4">
<span><%= job.id %> - <%= job.payload["run"] %></span>
</div>
</div>
<button
:for={job <- @jobs}
type="button"
phx-click={job.name || "job"}
phx-value-ids={@selected_ids_attr}
class={["Btn ml-2", job.class || "", @jobs_disabled && "cursor-not-allowed"]}
disabled={@jobs_disabled}
{[data: dataset_of(job)]}
>
<%= job.label %>
<OHA.Components.Icon.icon :if={job.icon} name={job.icon} class="ml-2" />
</button>
</div>
"""
end
defp dataset_of(%{must_confirm: true}), do: [confirm: @confirm_message]
defp dataset_of(_), do: []
end
Then I have a live view where I would like to update this component with new assigns (jobs_started
):
defmodule OHAWeb.Live.Header do
@moduledoc false
use OHAWeb, :live_view
@impl true
def mount(_params, _session, socket) do
if connected?(socket) do
Phoenix.PubSub.subscribe(OHA.PubSub, "lft:jobs")
end
{:ok, socket}
end
@impl true
def render(assigns) do
~H"""
<p>HEADER</p>
"""
end
@impl true
def handle_info({:job_started, _job}, socket) do
require Logger
Logger.error("== JOB STARTED ==")
jobs_started = OHA.LFT.list_started_jobs()
send_update(OHA.Components.Live.Jobs, id: "jobs", jobs_started: jobs_started)
{:noreply, socket}
end
def handle_info({:job_done, _job}, socket) do
require Logger
Logger.error("== JOB DONE ==")
jobs_started = OHA.LFT.list_started_jobs()
send_update(OHA.Components.Live.Jobs, id: "jobs", jobs_started: jobs_started)
{:noreply, socket}
end
end
What I get in the console is:
[error] == LOG UPDATE HERE ==
[error] == LOG UPDATE HERE ==
[error] == JOB STARTED ==
[error] == LOG UPDATE HERE ==
[error] == JOB DONE ==
Which in my understanding means the send_update
works only once?
Cheers!