diff --git a/assets/js/app.js b/assets/js/app.js index 6d1de0a..1f4f342 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -11,6 +11,10 @@ let liveSocket = new LiveSocket( {params: {_csrf_token: csrfToken}} ); +liveSocket.connect() + +window.liveSocket = liveSocket + import "@babel/polyfill"; import "phoenix_html"; diff --git a/lib/chess_web.ex b/lib/chess_web.ex index 8118a35..aa29f97 100644 --- a/lib/chess_web.ex +++ b/lib/chess_web.ex @@ -40,7 +40,6 @@ defmodule ChessWeb do import Phoenix.Controller, only: [get_csrf_token: 0, get_flash: 2, view_module: 1] import Phoenix.LiveView.Helpers - import ChessWeb.LiveHelpers # Use all HTML functionality (forms, tags, etc) use Phoenix.HTML @@ -78,7 +77,6 @@ defmodule ChessWeb do # Import LiveView helpers (live_render, live_component, live_patch, etc) import Phoenix.LiveView.Helpers - import ChessWeb.LiveHelpers # Import basic rendering functionality (render, render_layout, etc) import Phoenix.View diff --git a/lib/chess_web/templates/game/_square.html.eex b/lib/chess_web/templates/game/_square.html.eex deleted file mode 100644 index 937c827..0000000 --- a/lib/chess_web/templates/game/_square.html.eex +++ /dev/null @@ -1,5 +0,0 @@ -<%= if @piece == nil do %> -
-<% else %> -Playing <%= opponent(@game, current_user(@conn).id).name %> diff --git a/lib/chess_web/templates/square/square.html.leex b/lib/chess_web/templates/square/square.html.leex new file mode 100644 index 0000000..abcbaf8 --- /dev/null +++ b/lib/chess_web/templates/square/square.html.leex @@ -0,0 +1,7 @@ +
diff --git a/lib/chess_web/views/game_view.ex b/lib/chess_web/views/game_view.ex index 04c21a8..1d99066 100644 --- a/lib/chess_web/views/game_view.ex +++ b/lib/chess_web/views/game_view.ex @@ -46,7 +46,7 @@ defmodule ChessWeb.GameView do def files(conn, game) do ranks(conn, game) - |> Enum.reverse + |> Enum.reverse() end def ranks(conn, game) do diff --git a/lib/chess_web/views/live/board_live.ex b/lib/chess_web/views/live/board_live.ex new file mode 100644 index 0000000..5636895 --- /dev/null +++ b/lib/chess_web/views/live/board_live.ex @@ -0,0 +1,51 @@ +defmodule ChessWeb.BoardLive do + use Phoenix.LiveView + + alias Chess.Store.User + alias Chess.Store.Game + alias Chess.Repo + alias Chess.Board + + def render(assigns) do + Phoenix.View.render(ChessWeb.GameView, "board.html", assigns) + end + + def mount(_params, %{"user_id" => user_id, "game_id" => game_id}, socket) do + user = Repo.get!(User, user_id) + game = + Game.for_user(user) + |> Repo.get!(game_id) + + {:ok, assign(socket, game: game, user: user, selected: nil, available: [])} + end + + def handle_event("click", %{"rank" => rank, "file" => file}, socket) do + {:noreply, socket |> handle_click(file, rank)} + end + + defp handle_click(socket, file, rank) do + board = socket.assigns[:game].board + + assigns = + case socket.assigns do + %{:selected => nil} -> + case Board.piece(board, {file, rank}) do + %{"colour" => "white"} -> + [{:selected, selected(file, rank)}] + _ -> + [] + end + _ -> + [] + end + + assign(socket, assigns) + end + + defp selected(file, rank) do + { + String.to_integer(file), + String.to_integer(rank), + } + end +end diff --git a/lib/chess_web/views/square_view.ex b/lib/chess_web/views/square_view.ex new file mode 100644 index 0000000..574376b --- /dev/null +++ b/lib/chess_web/views/square_view.ex @@ -0,0 +1,39 @@ +defmodule ChessWeb.SquareView do + use ChessWeb, :view + + def classes(file, rank, piece, selected, available) do + square_class() + |> add_piece_classes(piece) + |> add_selected_class(selected) + |> add_available_class(available) + |> Enum.join(" ") + end + + defp square_class do + ["square"] + end + + defp add_piece_classes(classes, piece) do + if piece != nil do + classes ++ ["square--#{piece["type"]}", "square--#{piece["colour"]}"] + else + classes + end + end + + defp add_selected_class(classes, selected) do + if selected do + classes ++ ["square--selected"] + else + classes + end + end + + defp add_available_class(classes, available) do + if available do + classes ++ ["square--available"] + else + classes + end + end +end