defmodule ChesstrainerWeb.EndgameLive.Play do use ChesstrainerWeb, :live_view alias Chesstrainer.Endgames @impl true def render(assigns) do ~H""" <.header> Play endgame {@endgame.key} <:subtitle> {@endgame.color} to move · Result: {@endgame.result} · Rating: {@endgame.rating} <:actions> <.button navigate={~p"/endgames"}> <.icon name="hero-arrow-left" /> Back to endgames

Last Played Move:

{@last_from_to}

{@last_san}

{if @move_list == [] do "No Moves" else Enum.reverse(@move_list) |> Enum.join(", ") end}

<.button phx-click="reset" variant="primary"> <.icon name="hero-arrow-path" /> Reset
<.list> <:item title="Fen">{@endgame.fen} <:item title="Key">{@endgame.key} <:item title="Color">{@endgame.color} <:item title="Result">{@endgame.result} <:item title="Rating">{@endgame.rating}
""" end @impl true def mount(%{"id" => id}, _session, socket) do endgame = Endgames.get_endgame!(id) socket = socket |> assign(:page_title, "Play endgame") |> assign(:endgame, endgame) |> assign(:move_list, []) |> assign(:last_san, "None yet") |> assign(:last_from_to, "None yet") |> push_event("init_board", %{ fen: endgame.fen, orientation: Atom.to_string(endgame.color), player_color: Atom.to_string(endgame.color) }) {:ok, socket} end @impl true def handle_event( "endgame_move_played", %{"from" => from, "to" => to, "san" => san}, socket ) do # TODO: server-side legality check + tablebase evaluation when wired {:noreply, socket |> assign(:last_from_to, "#{from} ➔ #{to}") |> assign(:last_san, san) |> assign(:move_list, [san | socket.assigns.move_list])} end def handle_event("chess_fen_invalid", %{"fen" => fen, "message" => message}, socket) do {:noreply, put_flash( socket, :error, "Endgame FEN is invalid and the board cannot be loaded: #{message} (#{fen})" )} end def handle_event("reset", _params, socket) do {:noreply, socket |> assign(:move_list, []) |> assign(:last_san, "None yet") |> assign(:last_from_to, "None yet") |> push_event("init_board", %{ fen: socket.assigns.endgame.fen, orientation: Atom.to_string(socket.assigns.endgame.color), player_color: Atom.to_string(socket.assigns.endgame.color) })} end end