instance btn file

This commit is contained in:
ntr 2019-09-13 13:05:47 +10:00
parent ba48123fbc
commit abdd612886
5 changed files with 93 additions and 10 deletions

View File

@ -14,7 +14,7 @@ aside {
padding-left: 1em; padding-left: 1em;
.game-controls { .instance-ctrl {
grid-template-rows: 1fr 1fr 1fr min-content; grid-template-rows: 1fr 1fr 1fr min-content;
} }
@ -100,15 +100,16 @@ aside {
padding: 0 0.75em 0 0.75em; padding: 0 0.75em 0 0.75em;
} }
.abandon { .abandon:not([disabled]) {
&:hover { &:hover {
color: @red; color: @red;
border-color: @red; border-color: @red;
border: 2px solid @red;
}; };
&:active, &.confirming { &:active, &.confirming {
background: @red; background: @red;
color: black; color: black;
border: 1px solid black; border: 2px solid black;
} }
} }

View File

@ -4,6 +4,7 @@ const { connect } = require('preact-redux');
const actions = require('../actions'); const actions = require('../actions');
const PlayerBox = require('./player.box'); const PlayerBox = require('./player.box');
const InstanceCtrlBtns = require('./instance.ctrl.btns');
const addState = connect( const addState = connect(
function receiveState(state) { function receiveState(state) {
@ -122,14 +123,11 @@ function Controls(args) {
return ( return (
<aside onClick={cancelAbandon}> <aside onClick={cancelAbandon}>
{timer} {timer}
<div class="controls game-controls"> <div class="controls instance-ctrl">
<PlayerBox player={opponent}/> <PlayerBox player={opponent}/>
{game.phase === 'Finish' ? quitBtn : readyBtn} {game.phase === 'Finish' ? quitBtn : readyBtn}
<PlayerBox player={player} isPlayer={true} /> <PlayerBox player={player} isPlayer={true} />
<div class="game-btns"> <InstanceCtrlBtns />
<button disabled={animating} onClick={sendGameSkillClear}>Clear</button>
<button class={abandonClasses} disabled={animating} onClick={abandonAction}>Abandon</button>
</div>
</div> </div>
</aside> </aside>
); );

View File

@ -0,0 +1,75 @@
const preact = require('preact');
const { connect } = require('preact-redux');
const actions = require('../actions');
const addState = connect(
function receiveState(state) {
const {
ws,
game,
instance,
animating,
} = state;
function sendReady() {
document.activeElement.blur();
return ws.sendGameReady(game.id);
}
function sendGameSkillClear() {
return ws.sendGameSkillClear(game.id);
}
function sendAbandon() {
return ws.sendInstanceAbandon(instance.id);
}
return {
game,
instance,
animating,
sendAbandon,
sendGameSkillClear,
};
},
);
function InstanceCtrlBtns(args) {
const {
sendAbandon,
animating,
sendGameSkillClear,
game,
instance,
} = args;
const finished = instance.phase === 'Finished';
const { abandonState } = this.state;
const cancelAbandon = e => {
e.stopPropagation();
return this.setState({ abandonState: false });
};
const abandonStateTrue = e => {
e.stopPropagation();
this.setState({ abandonState: true });
setTimeout(() => this.setState({ abandonState: false }), 2000);
};
const abandonClasses = `abandon ${abandonState ? 'confirming' : ''}`;
const abandonAction = abandonState ? sendAbandon : abandonStateTrue;
return (
<div>
{game ? <button disabled={animating} onClick={sendGameSkillClear}>Clear</button> : null}
<button class={abandonClasses} disabled={animating || finished} onClick={abandonAction}>Abandon</button>
</div>
);
}
module.exports = addState(InstanceCtrlBtns);

View File

@ -2,8 +2,8 @@ const preact = require('preact');
const { connect } = require('preact-redux'); const { connect } = require('preact-redux');
const actions = require('../actions'); const actions = require('../actions');
const PlayerBox = require('./player.box'); const PlayerBox = require('./player.box');
const InstanceCtrlBtns = require('./instance.ctrl.btns');
const addState = connect( const addState = connect(
function receiveState(state) { function receiveState(state) {
@ -87,13 +87,15 @@ function Controls(args) {
: <button class="ready" onClick={leave}>Leave</button> : <button class="ready" onClick={leave}>Leave</button>
const abandon = instance.phase !== 'Finished' ? sendAbandon : false; const abandon = instance.phase !== 'Finished' ? sendAbandon : false;
return ( return (
<aside> <aside>
{timer} {timer}
<div class="controls"> <div class="controls instance-ctrl">
<PlayerBox player={opponent} /> <PlayerBox player={opponent} />
{ready} {ready}
<PlayerBox player={player} isPlayer={true} abandon={abandon}/> <PlayerBox player={player} isPlayer={true} abandon={abandon}/>
<InstanceCtrlBtns />
</div> </div>
</aside> </aside>
); );

View File

@ -748,6 +748,13 @@ pub fn pvp(tx: &mut Transaction, a: &Account, b: &Account) -> Result<Instance, E
pub fn instance_abandon(tx: &mut Transaction, account: &Account, instance_id: Uuid) -> Result<RpcMessage, Error> { pub fn instance_abandon(tx: &mut Transaction, account: &Account, instance_id: Uuid) -> Result<RpcMessage, Error> {
let mut instance = instance_get(tx, instance_id)?; let mut instance = instance_get(tx, instance_id)?;
if let Some(game_id) = instance.current_game_id() {
let mut game = game_get(tx, game_id)?;
game.player_by_id(account.id)?.forfeit();
game_update(tx, &game)?;
}
instance.account_player(account.id)?.set_lose(); instance.account_player(account.id)?.set_lose();
instance.account_opponent(account.id)?.set_win(); instance.account_opponent(account.id)?.set_win();
instance.next_round(); instance.next_round();