lib/slurpee_web/live/log_subscription_live.ex

defmodule SlurpeeWeb.LogSubscriptionLive do
  use SlurpeeWeb, :live_view
  import SlurpeeWeb.ViewHelpers.SearchQueryHelper, only: [assign_search_query: 2]
  import SlurpeeWeb.ViewHelpers.EllipsisHelper, only: [ellipsis: 2]

  @impl true
  def mount(_params, _session, socket) do
    socket =
      socket
      |> assign(:query, nil)

    {:ok, socket}
  end

  @impl true
  def handle_params(params, _uri, socket) do
    socket =
      socket
      |> assign_search_query(params)
      |> assign_search()

    {:noreply, socket}
  end

  @impl true
  def handle_event("search", params, socket) do
    socket =
      socket
      |> assign_search_query(params)
      |> send_search_after(200)

    {:noreply, socket}
  end

  @impl true
  def handle_info(:search, socket) do
    socket =
      socket
      |> assign(:search_timer, nil)
      |> assign_search()

    {:noreply, socket}
  end

  defp send_search_after(socket, after_ms) do
    if socket.assigns[:search_timer] do
      socket
    else
      timer = Process.send_after(self(), :search, after_ms)
      assign(socket, :search_timer, timer)
    end
  end

  defp assign_search(socket) do
    socket
    |> assign(log_subscriptions: search_log_subscriptions(socket.assigns.query))
  end

  defp search_log_subscriptions(search_term) do
    []
    |> Slurp.Commander.log_subscriptions()
    |> search_log_subscriptions(search_term)
  end

  defp search_log_subscriptions(log_subscriptions, nil) do
    log_subscriptions
  end

  defp search_log_subscriptions(log_subscriptions, search_term) do
    log_subscriptions
    |> Enum.filter(fn s ->
      String.contains?(s.blockchain_id, search_term) ||
      String.contains?(s.event_signature, search_term) ||
      String.contains?(s.hashed_event_signature, search_term) ||
      String.contains?(s.enabled |> to_string(), search_term) ||
      String.contains?(s.handler |> inspect(), search_term)
    end)
  end
end