This commit is contained in:
@@ -24,9 +24,11 @@ defmodule CobblemonUiWeb.DashboardLive do
|
||||
battle: nil,
|
||||
selected_pokemon: nil,
|
||||
tier_list: CobblemonUi.TierListScraper.get_tier_list(),
|
||||
species_info: %{},
|
||||
view_mode: :party,
|
||||
loading: false,
|
||||
error: nil
|
||||
error: nil,
|
||||
selected_type: nil
|
||||
)}
|
||||
end
|
||||
|
||||
@@ -36,14 +38,19 @@ defmodule CobblemonUiWeb.DashboardLive do
|
||||
{:ok, data} ->
|
||||
battle = find_player_battle(uuid)
|
||||
|
||||
{:noreply,
|
||||
assign(socket,
|
||||
selected_player: uuid,
|
||||
player_data: data,
|
||||
battle: battle,
|
||||
selected_pokemon: nil,
|
||||
error: nil
|
||||
)}
|
||||
socket =
|
||||
assign(socket,
|
||||
selected_player: uuid,
|
||||
player_data: data,
|
||||
battle: battle,
|
||||
selected_pokemon: nil,
|
||||
species_info: %{},
|
||||
error: nil
|
||||
)
|
||||
|
||||
if connected?(socket), do: send(self(), {:load_species_info, data})
|
||||
|
||||
{:noreply, socket}
|
||||
|
||||
{:error, :not_found} ->
|
||||
{:noreply,
|
||||
@@ -94,11 +101,24 @@ defmodule CobblemonUiWeb.DashboardLive do
|
||||
{:noreply, assign(socket, view_mode: String.to_existing_atom(mode), selected_pokemon: nil)}
|
||||
end
|
||||
|
||||
def handle_event("select_type", %{"type" => ""}, socket) do
|
||||
{:noreply, assign(socket, selected_type: nil)}
|
||||
end
|
||||
|
||||
def handle_event("select_type", %{"type" => type}, socket) do
|
||||
{:noreply, assign(socket, selected_type: type)}
|
||||
end
|
||||
|
||||
@impl true
|
||||
def handle_info(:tick, socket) do
|
||||
{:noreply, do_refresh(socket)}
|
||||
end
|
||||
|
||||
def handle_info({:load_species_info, player_data}, socket) do
|
||||
species_info = compute_species_info(player_data, socket.assigns.tier_list)
|
||||
{:noreply, assign(socket, species_info: species_info)}
|
||||
end
|
||||
|
||||
defp do_refresh(socket) do
|
||||
players =
|
||||
case CobblemonUi.CobblemonFS.list_players() do
|
||||
@@ -276,13 +296,16 @@ defmodule CobblemonUiWeb.DashboardLive do
|
||||
<h3 class="text-sm font-semibold text-base-content/50 uppercase tracking-wider mb-3">
|
||||
Box {box.box + 1}
|
||||
</h3>
|
||||
<div class="grid grid-cols-3 sm:grid-cols-5 lg:grid-cols-6 gap-2">
|
||||
<div class="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-2">
|
||||
<%= for {pokemon, idx} <- Enum.with_index(box.pokemon), not is_nil(pokemon) do %>
|
||||
<.pokemon_card
|
||||
<% skey = String.downcase(pokemon.species || "") %>
|
||||
<% info = Map.get(@species_info, skey, %{}) %>
|
||||
<.pc_pokemon_card
|
||||
pokemon={pokemon}
|
||||
index={pc_global_index(@player_data.pc, box.box, idx)}
|
||||
tier={Map.get(@tier_list, String.downcase(pokemon.species || ""), nil)}
|
||||
compact
|
||||
tier={Map.get(@tier_list, skey, nil)}
|
||||
types={Map.get(info, :types, [])}
|
||||
evo_tiers={Map.get(info, :evo_tiers, [])}
|
||||
/>
|
||||
<% end %>
|
||||
</div>
|
||||
@@ -301,6 +324,9 @@ defmodule CobblemonUiWeb.DashboardLive do
|
||||
pokemon={@selected_pokemon}
|
||||
tier={Map.get(@tier_list, String.downcase(@selected_pokemon.species || ""), nil)}
|
||||
/>
|
||||
|
||||
<%!-- Type Chart --%>
|
||||
<.type_chart selected_type={@selected_type} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -333,6 +359,38 @@ defmodule CobblemonUiWeb.DashboardLive do
|
||||
end
|
||||
end
|
||||
|
||||
defp compute_species_info(player_data, tier_list) do
|
||||
all_pokemon =
|
||||
(player_data.party ++ Enum.flat_map(player_data.pc, & &1.pokemon))
|
||||
|> Enum.reject(&is_nil/1)
|
||||
|
||||
unique_species =
|
||||
all_pokemon
|
||||
|> Enum.map(&String.downcase(&1.species || ""))
|
||||
|> Enum.reject(&(&1 == ""))
|
||||
|> Enum.uniq()
|
||||
|
||||
unique_species
|
||||
|> Task.async_stream(
|
||||
fn species ->
|
||||
types = CobblemonUi.PokeApi.get_types(species)
|
||||
evolutions = CobblemonUi.EvolutionApi.get_evolutions(species)
|
||||
|
||||
evo_tiers =
|
||||
Enum.map(evolutions, fn evo ->
|
||||
%{species: evo, tier: Map.get(tier_list, evo)}
|
||||
end)
|
||||
|
||||
{species, %{types: types, evo_tiers: evo_tiers}}
|
||||
end,
|
||||
max_concurrency: 10,
|
||||
timeout: :infinity
|
||||
)
|
||||
|> Enum.reduce(%{}, fn {:ok, {species, info}}, acc ->
|
||||
Map.put(acc, species, info)
|
||||
end)
|
||||
end
|
||||
|
||||
defp opponent_evolutions(nil, _player_id), do: %{}
|
||||
|
||||
defp opponent_evolutions(battle, player_id) do
|
||||
|
||||
Reference in New Issue
Block a user