lib/phoenix/ui/components/autocomplete.ex

defmodule Phoenix.UI.Components.Autocomplete do
  @moduledoc """
  Provides text filter component.
  """
  alias Phoenix.UI.Components.TextFilter

  import Phoenix.UI.Components.Menu

  use Phoenix.UI, :live_component

  @impl true
  def render(assigns) do
    ~H"""
    <div>
      <.live_component module={TextFilter} {@text_filter_attrs} />
      <.menu extend_class="mb-6">
        <%= for option <- @options do %>
          <.menu_item>
            <%= option %>
          </.menu_item>
        <% end %>
      </.menu>
    </div>
    """
  end

  @impl true
  def update(assigns, socket) do
    {
      :ok,
      socket
      |> assign(assigns)
      |> build_text_filter_attrs()
      |> apply_options()
    }
  end

  defp apply_options(socket) do
    socket.assigns[:set_options].(socket.assigns[:value], socket)
  end

  ### Text Filter Attrs ##########################

  defp build_text_filter_attrs(%Socket{assigns: assigns} = socket) do
    attrs =
      assigns
      |> assigns_to_attributes([:text_filter_attrs, :set_options])

    assign(socket, text_filter_attrs: attrs)
  end
end