mirror of
https://github.com/danbee/chess
synced 2025-03-04 08:39:06 +00:00
Use grids for the game layout
This commit is contained in:
parent
6243259d27
commit
659f748ada
@ -1,7 +1,24 @@
|
|||||||
.game-grid {
|
.game-grid {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-gap: $base-spacing;
|
grid-gap: $base-spacing;
|
||||||
grid-template-areas: "board moves";
|
}
|
||||||
grid-template-columns: min-content 1fr;
|
|
||||||
grid-template-rows: var(--board-size);
|
@media (min-aspect-ratio: 10/11) {
|
||||||
|
.game-grid {
|
||||||
|
grid-template-areas:
|
||||||
|
"board game-info"
|
||||||
|
"board move-list";
|
||||||
|
grid-template-columns: min-content 1fr;
|
||||||
|
grid-template-rows: min-content 1fr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-aspect-ratio: 10/11) {
|
||||||
|
.game-grid {
|
||||||
|
grid-template-areas:
|
||||||
|
"game-info"
|
||||||
|
"board"
|
||||||
|
"move-list";
|
||||||
|
grid-template-rows: min-content min-content min-content;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
3
assets/css/_game_info.scss
Normal file
3
assets/css/_game_info.scss
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
.game-info {
|
||||||
|
grid-area: game-info;
|
||||||
|
}
|
||||||
@ -20,6 +20,10 @@ h1 {
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
main {
|
||||||
|
margin-top: 5vmin;
|
||||||
|
}
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
width: 90%;
|
width: 90%;
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
.move-list {
|
.move-list {
|
||||||
grid-area: moves;
|
grid-area: move-list;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -15,4 +15,5 @@
|
|||||||
@import "game_list";
|
@import "game_list";
|
||||||
@import "board";
|
@import "board";
|
||||||
@import "move_list";
|
@import "move_list";
|
||||||
|
@import "game_info";
|
||||||
@import "game_grid";
|
@import "game_grid";
|
||||||
|
|||||||
@ -14,6 +14,7 @@ import { setGameId } from "./store/actions";
|
|||||||
|
|
||||||
import ChessBoard from "./components/chess-board";
|
import ChessBoard from "./components/chess-board";
|
||||||
import MoveList from "./components/move-list";
|
import MoveList from "./components/move-list";
|
||||||
|
import GameInfo from "./components/game-info";
|
||||||
|
|
||||||
const store = createStore(chessBoardReducer);
|
const store = createStore(chessBoardReducer);
|
||||||
|
|
||||||
@ -31,6 +32,11 @@ class App extends React.Component {
|
|||||||
return store.getState().moves;
|
return store.getState().moves;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get opponent() {
|
||||||
|
const { store } = this.props;
|
||||||
|
return store.getState().opponent;
|
||||||
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { store, gameId } = this.props;
|
const { store, gameId } = this.props;
|
||||||
|
|
||||||
@ -42,6 +48,8 @@ class App extends React.Component {
|
|||||||
channel={this.channel}
|
channel={this.channel}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<GameInfo store={store} />
|
||||||
|
|
||||||
<MoveList store={store} />
|
<MoveList store={store} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
18
assets/js/components/game-info.js
Normal file
18
assets/js/components/game-info.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { connect } from "react-redux";
|
||||||
|
|
||||||
|
const GameInfo = (props) => {
|
||||||
|
return (
|
||||||
|
<div className="game-info">
|
||||||
|
<p>Playing {props.opponent}</p>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const mapStateToProps = (state) => {
|
||||||
|
return {
|
||||||
|
opponent: state.opponent,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export default connect(mapStateToProps)(GameInfo);
|
||||||
@ -9,6 +9,11 @@ const chessBoardReducer = (state = defaultState, action) => {
|
|||||||
.set("player", action.player)
|
.set("player", action.player)
|
||||||
.toJS();
|
.toJS();
|
||||||
|
|
||||||
|
case "SET_OPPONENT":
|
||||||
|
return Immutable.fromJS(state)
|
||||||
|
.set("opponent", action.opponent)
|
||||||
|
.toJS();
|
||||||
|
|
||||||
case "SET_GAME":
|
case "SET_GAME":
|
||||||
return Immutable.fromJS(state)
|
return Immutable.fromJS(state)
|
||||||
.set("board", action.board)
|
.set("board", action.board)
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import socket from "../socket";
|
import socket from "../socket";
|
||||||
import { setPlayer, setGame, setAvailableMoves } from "../store/actions";
|
import { setPlayer, setOpponent, setGame, setAvailableMoves } from "../store/actions";
|
||||||
|
|
||||||
class Channel {
|
class Channel {
|
||||||
constructor(store, gameId) {
|
constructor(store, gameId) {
|
||||||
@ -21,6 +21,7 @@ class Channel {
|
|||||||
this.channel.on("game:update", data => {
|
this.channel.on("game:update", data => {
|
||||||
if (data.player != undefined) {
|
if (data.player != undefined) {
|
||||||
this.store.dispatch(setPlayer(data.player));
|
this.store.dispatch(setPlayer(data.player));
|
||||||
|
this.store.dispatch(setOpponent(data.opponent));
|
||||||
}
|
}
|
||||||
this.store.dispatch(setGame(data));
|
this.store.dispatch(setGame(data));
|
||||||
});
|
});
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
const SET_PLAYER = "SET_PLAYER";
|
const SET_PLAYER = "SET_PLAYER";
|
||||||
|
const SET_OPPONENT = "SET_OPPONENT";
|
||||||
const SET_GAME = "SET_GAME";
|
const SET_GAME = "SET_GAME";
|
||||||
const SET_AVAILABLE_MOVES = "SET_AVAILABLE_MOVES";
|
const SET_AVAILABLE_MOVES = "SET_AVAILABLE_MOVES";
|
||||||
const SET_GAME_ID = "SET_GAME_ID";
|
const SET_GAME_ID = "SET_GAME_ID";
|
||||||
@ -11,6 +12,13 @@ export const setPlayer = (player) => {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const setOpponent = (opponent) => {
|
||||||
|
return {
|
||||||
|
type: SET_OPPONENT,
|
||||||
|
opponent,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
export const setGame = (data) => {
|
export const setGame = (data) => {
|
||||||
return {
|
return {
|
||||||
type: SET_GAME,
|
type: SET_GAME,
|
||||||
|
|||||||
@ -2,6 +2,7 @@ const defaultState = {
|
|||||||
selectedSquare: null,
|
selectedSquare: null,
|
||||||
|
|
||||||
player: null,
|
player: null,
|
||||||
|
opponent: null,
|
||||||
turn: null,
|
turn: null,
|
||||||
state: null,
|
state: null,
|
||||||
|
|
||||||
|
|||||||
@ -21,10 +21,13 @@ defmodule ChessWeb.GameChannel do
|
|||||||
socket.assigns.current_user_id
|
socket.assigns.current_user_id
|
||||||
|> Game.for_user_id()
|
|> Game.for_user_id()
|
||||||
|> preload(:moves)
|
|> preload(:moves)
|
||||||
|
|> preload(:user)
|
||||||
|
|> preload(:opponent)
|
||||||
|> Repo.get!(game_id)
|
|> Repo.get!(game_id)
|
||||||
|
|
||||||
payload = %{
|
payload = %{
|
||||||
player: player(socket, game),
|
player: player(socket, game),
|
||||||
|
opponent: opponent(socket, game),
|
||||||
board: Board.transform(game.board),
|
board: Board.transform(game.board),
|
||||||
turn: game.turn,
|
turn: game.turn,
|
||||||
state: game.state,
|
state: game.state,
|
||||||
@ -116,4 +119,12 @@ defmodule ChessWeb.GameChannel do
|
|||||||
"black"
|
"black"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp opponent(socket, game) do
|
||||||
|
if game.user_id == socket.assigns.current_user_id do
|
||||||
|
game.opponent.name
|
||||||
|
else
|
||||||
|
game.user.name
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@ -1,4 +1,2 @@
|
|||||||
<h2><%= gettext "Game with %{name}", name: opponent(@conn, @game).name %></h2>
|
|
||||||
|
|
||||||
<div id="app" data-game-id="<%= @game.id %>">
|
<div id="app" data-game-id="<%= @game.id %>">
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user