defmodule CobblemonUiWeb.BattlesLive do use CobblemonUiWeb, :live_view @impl true def mount(_params, _session, socket) do {battles, error} = case CobblemonUi.BattlesApi.list_battles() do {:ok, battles} -> {battles, nil} {:error, reason} -> {[], reason} end {:ok, assign(socket, page_title: "Active Battles", battles: battles, error: error )} end @impl true def handle_event("refresh", _params, socket) do {battles, error} = case CobblemonUi.BattlesApi.list_battles() do {:ok, battles} -> {battles, nil} {:error, reason} -> {[], reason} end {:noreply, assign(socket, battles: battles, error: error)} end @impl true def render(assigns) do ~H"""
<%!-- Header --%>
<.icon name="hero-bolt" class="size-6 text-error" />

Active Battles

Live battle monitor

<.link navigate={~p"/"} class="btn btn-ghost btn-sm gap-2 hover:bg-base-300/50 transition-colors" > <.icon name="hero-arrow-left" class="size-4" /> Players
<%!-- Error --%>
<.icon name="hero-exclamation-triangle" class="size-5" /> {@error}
<%!-- Empty state --%>
<.icon name="hero-shield-check" class="size-10 mx-auto mb-4 text-base-content/20" />

No active battles

All is peaceful on the server

<%!-- Battle cards --%>
<%= for battle <- @battles do %>
<%!-- Battle header --%>
Live {battle.battle_id}
{length(battle.actors)} combatants
<%!-- Actors --%>
<%!-- VS divider on md+ --%> <%= for actor <- battle.actors do %>
<%!-- Actor header --%>
<%= if actor.type == "player" do %> <.icon name="hero-user" class="size-4 text-primary" /> <% else %> <.icon name="hero-cpu-chip" class="size-4 text-warning" /> <% end %>

{actor.name}

{actor.type}

<%!-- Active Pokémon --%>
<%= for poke <- actor.active_pokemon do %>
{poke.species} Lv.{poke.level}
{poke.hp}/{poke.max_hp}
<%!-- HP bar --%>
"bg-base-content/20" poke.hp / poke.max_hp > 0.5 -> "bg-success" poke.hp / poke.max_hp > 0.2 -> "bg-warning" true -> "bg-error" end ]} style={"width: #{if poke.max_hp > 0, do: Float.round(poke.hp / poke.max_hp * 100, 1), else: 0}%"} >
<% end %>
<%!-- Party moves (player only) --%> <%= if actor.party != [] do %>
<.icon name="hero-chevron-right" class="size-3 group-open:rotate-90 transition-transform" /> Party details
<%= for party_poke <- actor.party do %>
{party_poke.species} <%= if party_poke.shiny do %> ✦ Shiny <% end %>
Lv.{party_poke.level}
{party_poke.ability} {party_poke.nature |> String.replace("cobblemon:", "")}
<%= for move <- party_poke.moves do %> {move.name} {move.pp}/{move.max_pp} <% end %>
<% end %>
<% end %>
<% end %>
<% end %>
""" end end