Skip to main content

lib/continuum/observer/components.ex

if Code.ensure_loaded?(Phoenix.Component) do
  defmodule Continuum.Observer.Components do
    @moduledoc false

    use Phoenix.Component

    attr(:state, :atom, required: true)

    def state_badge(assigns) do
      ~H"""
      <span class={"co-badge co-badge-#{@state}"}><%= @state %></span>
      """
    end

    attr(:value, :any, default: nil)

    def timestamp(assigns) do
      ~H"""
      <span class="co-timestamp"><%= format_time(@value) %></span>
      """
    end

    attr(:payload, :any, required: true)

    def payload(assigns) do
      ~H"""
      <pre class="co-payload"><%= Continuum.Observer.pretty(@payload) %></pre>
      """
    end

    @doc "CSS class grouping an event type for timeline colouring."
    def event_class(type),
      do: "co-event co-event-#{Continuum.Observer.Components.event_kind(type)}"

    @doc false
    def event_kind(type) do
      case to_string(type) do
        "compensation_" <> _ -> "compensation"
        "child_" <> _ -> "child"
        "run_continued_as_new" -> "continued"
        "patched" -> "patched"
        "activity_" <> _ -> "activity"
        "signal_" <> _ -> "signal"
        "timer_" <> _ -> "timer"
        _ -> "default"
      end
    end

    defp format_time(nil), do: "-"
    defp format_time(%DateTime{} = value), do: DateTime.to_iso8601(value)
    defp format_time(%NaiveDateTime{} = value), do: NaiveDateTime.to_iso8601(value)
    defp format_time(value), do: to_string(value)
  end
else
  defmodule Continuum.Observer.Components do
    @moduledoc false

    def state_badge(assigns), do: assigns
    def timestamp(assigns), do: assigns
    def payload(assigns), do: assigns
    def event_class(_type), do: ""
    def event_kind(_type), do: "default"
  end
end