         assign @conn is read only.
         """
     end
+    assigns_to_update = Enum.into(assigns, %{})
 
     view = view || Drab.get_view(socket)
-
     partial =
       if partial_name, do: Partial.hash_for_view_and_name(view, partial_name), else: index(socket)
 
     current_assigns = assign_data_for_partial(socket, partial, partial_name, :assigns)
-
-    current_assigns_keys = Map.keys(current_assigns)
-    assigns_to_update = Enum.into(assigns, %{})
+    nodrab_assigns = assign_data_for_partial(socket, partial, partial_name, :nodrab)
+    all_assigns = all_assigns(assigns_to_update, current_assigns, nodrab_assigns)
+
+    html = rerender_template(socket, view, partial, all_assigns)
+
+    update_javascripts =
+      update_javascripts(socket, html, partial, assigns_to_update, current_assigns)
+    assign_updates = assign_updates_js(assigns_to_update, partial, drab_commander_id(socket))
+    all_javascripts = (assign_updates ++ update_javascripts) |> Enum.uniq() |> Enum.join(";")
+
+    # IO.inspect update_javascripts
+    # IO.inspect(all_javascripts)
+
+    case function.(socket, all_javascripts) do
+      {:ok, _} ->
+        update_assigns_cache(socket, assigns_to_update, partial, drab_commander_id(socket))
+        socket
+
+      {:error, _} = other ->
+        other
+
+      {:timeout, _} = other ->
+        other
+
+      # poke! with exec_js!
+      _ ->
+        :ok
+    end
+  end
+
+  defp all_assigns(assigns, current_assigns, nodrab_assigns) do
+    updated_assigns = Map.merge(current_assigns, assigns)
+    all_assigns = Map.merge(nodrab_assigns, updated_assigns)
+    Enum.into(all_assigns, [])
+  end
+
+  defp rerender_template(socket, view, partial, all_assigns) do
+    template = Partial.template_filename(view, partial)
+    html = Phoenix.View.render_to_string(view, template, all_assigns)
+    update_csrf_token(html, csrf_token(socket))
+  end
+
+  defp assigns_to_update_keys(assigns_to_update, current_assigns_keys) do
     assigns_to_update_keys = Map.keys(assigns_to_update)
 
     for as <- assigns_to_update_keys do

    peek(socket, view, partial, String.to_existing_atom(assign))
  end



  @doc """
  Updates the current page in the browser with the new assign value.


  """
  @spec poke(Phoenix.Socket.t(), atom | nil, String.t() | nil, Keyword.t()) :: result
  def poke(socket, view, partial, assigns) do
    Deppie.once("""
    `poke` return value will be changed to `{:ok, :ok}`, `{:error, reason}` in v0.9.0.
    """)

    do_poke(socket, view, partial, assigns, &Drab.Core.exec_js/2)
  end

  @doc """
  Exception raising version of `poke/2`.
