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