Putting It All Together
Let's wrap up all the game elements we've built so far.
We'll cover the following...
The <Board> component will render the <Canvas> representing the puzzle board shape, along with the <Palette> we just built. The <Board> will also manage the state of the game based on user interactions. It will be a stateful component that knows how to receive events and update the game’s state in response to a user selecting, moving, and placing pentominoes.
Rendering the Board component
Before we dive into the code for our component, let’s take a look at how GameLive will render it. We start by updating the aliases and mount/3 function in GameLive like this:
defmodule PentoWeb.Pento.GameLive douse Surface.LiveViewalias PentoWeb.Pento.{Board, Title}def mount(%{"puzzle" => puzzle}, _session, socket) do{:ok, assign(socket, puzzle: puzzle)}end
We match the puzzle name in params and store it in the socket. We’ll need it to render the <Board> component with the correct puzzle board shape and palette of pentomino shapes. Then, we update the render/1 function to call on the <Board> component. It should call on the component with a puzzle prop set equal to the @puzzle assignment and an id prop set equal to board:
def render(assigns) do~H"""<section class="container"><Title message="Welcome to Pento!" /><Board puzzle="{{ @puzzle }}" id="game" /></section>"""end
Our new code is simple and elegant. The GameLive LiveView takes some info from the params and renders two components. Next, we used the <Board> on line 5 to display elements ...