lib/event_store_dashboard/components/event_link.ex

defmodule EventStoreDashboard.Components.EventLink do
  @moduledoc false

  use Phoenix.Component

  alias EventStoreDashboard.Params
  alias EventStoreDashboard.Repo.Context
  alias Phoenix.LiveDashboard.PageBuilder
  alias Phoenix.LiveView.Socket

  attr(:socket, Socket, required: true)
  attr(:page, PageBuilder, required: true)
  attr(:ctx, Context, required: true)
  attr(:stream_uuid, :string, required: true)
  attr(:event_number, :integer, default: nil)
  attr(:stop_propagation, :boolean, default: false)

  def render(assigns) do
    ~H"""
    <.link
      :if={is_integer(@event_number) and @event_number > 0}
      patch={event_path(@socket, @page, @ctx, @stream_uuid, @event_number)}
      onclick={if @stop_propagation, do: "event.stopPropagation()"}
      class="es-modal-trigger"
    >
      @{@event_number}
    </.link>
    <span :if={not (is_integer(@event_number) and @event_number > 0)}>@{@event_number}</span>
    """
  end

  defp event_path(socket, page, %Context{} = ctx, stream_uuid, event_number) do
    Params.to_live_dashboard_path(socket, page, %Params{
      eventstore: ctx.event_store,
      nav: "events",
      stream: stream_uuid,
      event: event_number
    })
  end
end