lib/live_reloader/channel.ex

defmodule KinoLiveView.LiveReloader.Channel do
  @moduledoc """
  The client listens on the phoenix:live_reload channel for the "assets_change" message.
  So we send "assets_change" js event, the client will reload the page.

  Further explanation here: https://shankardevy.com/code/phoenix-live-reload/
  """
  use Phoenix.Channel

  def join("phoenix:live_reload", _msg, socket) do
    {:ok, _} = Application.ensure_all_started(:phoenix_live_reload)

    Phoenix.PubSub.subscribe(Application.fetch_env!(:kino_live_view, :pubsub_server), "reloader")

    {:ok, socket}
  end

  def handle_info(:trigger, socket) do
    push(socket, "assets_change", %{asset_type: ""})

    {:noreply, socket}
  end
end