defmodule MtgWheelWeb.WheelLive do
use MtgWheelWeb, :live_view
alias MtgWheel.DeckGenerator
@spin_duration_ms 3700
@item_height_px 112
@impl true
def mount(_params, _session, socket) do
{:ok,
assign(socket,
page_title: "MTG Deck Wheel",
spinning: false,
result: nil,
budgets: DeckGenerator.budgets(),
archetypes: DeckGenerator.archetypes(),
subthemes: DeckGenerator.subthemes(),
color_combos: DeckGenerator.color_combos()
)}
end
@impl true
def handle_event("spin", _params, socket) do
result = DeckGenerator.generate()
Process.send_after(self(), :stop_spin, @spin_duration_ms)
{:noreply, assign(socket, spinning: true, result: result)}
end
@impl true
def handle_info(:stop_spin, socket) do
{:noreply, assign(socket, spinning: false)}
end
@impl true
def render(assigns) do
~H"""
MTG Deck Wheel
<.wheel label="Budget" items={Enum.map(@budgets, &"$#{&1}")} result={@result && @result.budget} spinning={@spinning} duration={2500} />
<.wheel label="Archetype" items={@archetypes} result={@result && @result.archetype} spinning={@spinning} duration={2900} />
<.wheel label="Subtheme" items={@subthemes} result={@result && @result.subtheme} spinning={@spinning} duration={3300} />
<.wheel label="Colors" items={@color_combos} result={@result && @result.colors} spinning={@spinning} color?={true} duration={3600} />
Your Deck
<.stat label="Budget" value={(@result && @result.budget) || ""} />
<.stat label="Archetype" value={(@result && @result.archetype) || ""} />
<.stat label="Subtheme" value={(@result && @result.subtheme) || ""} />
<.stat label="Colors">
<.color_icons colors={(@result && @result.colors) || ""} size="lg" />
"""
end
defp wheel(assigns) do
assigns =
assigns
|> assign_new(:color?, fn -> false end)
|> assign_new(:duration, fn -> 3000 end)
~H"""