| defmodule HexalixirWeb.GameLive do | |
| use HexalixirWeb, :live_view | |
| alias Hexalixir.{Game, Grid} | |
| @impl true | |
| def mount(_params, _session, socket) do | |
| {:ok, assign(socket, | |
| grid: Grid.new(), | |
| saved_colors: %{1 => {nil, 6}, 2 => {nil, 6}}, | |
| game_won: false | |
| )} | |
| end | |
| @impl true | |
| def handle_event("click_tile", %{"x" => x, "y" => y}, socket) do | |
| coords = {String.to_integer(x), String.to_integer(y)} | |
| case Game.click_tile(coords) do | |
| {:ok, new_grid, won} -> | |
| {:noreply, assign(socket, grid: new_grid, game_won: won)} | |
| {:error, _reason} -> | |
| {:noreply, socket} | |
| end | |
| end | |
| @impl true | |
| def handle_event("save_color", %{"color" => color, "slot" => slot}, socket) do | |
| slot = String.to_integer(slot) | |
| Game.save_color(color, slot) | |
| {:noreply, socket} | |
| end | |
| @impl true | |
| def handle_event("use_saved_color", %{"x" => x, "y" => y, "slot" => slot}, socket) do | |
| coords = {String.to_integer(x), String.to_integer(y)} | |
| slot = String.to_integer(slot) | |
| case Game.use_saved_color(coords, slot) do | |
| {:ok, new_grid, won} -> | |
| {:noreply, assign(socket, grid: new_grid, game_won: won)} | |
| {:error, _reason} -> | |
| {:noreply, socket} | |
| end | |
| end | |
| end | |