LiveView - Live Component - send_update with socket as argument

Hi!

Suggest to add the ability to do use the components socket as input into Phoenix.LiveView.send_update/3 function to make it easier to send an update to self.

Using @myself as an argument is good, but think it would be easier to grasp when just using the current socket.
I think the cid is present in the socket and the module can be fetched using __MODULE__ is guess? :slight_smile:

Example:

@impl true
def update(%{title: title}, socket) do
  updated_socket = socket
  |> assign(:title, title)

  {:ok, updated_socket}
end

@impl true
def handle_event("update_title", %{"title" => title} = _params, socket) do
  updated_socket = socket
  |> send_update(title: title)

  {:noreply, updated_socket}
end

You can always write a helper function and import that:

def send_update(%Phoenix.LiveView.Socket{assigns: %{myself: cid}}, assigns) do
  Phoenix.LiveView.send_update(cid, assigns)
end

Your example is also a bit contrived, since you could just assign the value directly. Also note that send_update is asynchronous. It sends a message to the LiveView process, which invokes the update callback as soon as it handles the message. If your code relies on some data wrangling update/2 does, you can just directly call update instead:

@impl true
def handle_event("update_title", %{"title" => title} = _params, socket) do
  {:ok, updated_socket} = update([title: title], socket)

  {:noreply, updated_socket}
end
1 Like

Hi, yes I can write such a function, and I have :slight_smile:
Just thought it would be a nice addition to the standard library :slight_smile:

And yes, you are right, my example was not very good, and after your example I am not so sure why I did not think of that :stuck_out_tongue: