solidify controls

This commit is contained in:
ntr 2019-09-21 17:22:38 +10:00
parent 0ec6bdaad5
commit bec7685f7b
4 changed files with 128 additions and 132 deletions

View File

@ -0,0 +1,96 @@
const preact = require('preact');
const { connect } = require('preact-redux');
const actions = require('../actions');
const addState = connect(
function receiveState(state) {
const {
ws,
game,
animating,
} = state;
function sendReady() {
document.activeElement.blur();
return ws.sendGameReady(game.id);
}
function getInstanceState() {
return ws.sendInstanceState(game.instance);
}
function sendGameSkillClear() {
return ws.sendGameSkillClear(game.id);
}
function sendAbandon() {
return ws.sendInstanceAbandon(game.instance);
}
return {
game,
sendAbandon,
sendGameSkillClear,
sendReady,
getInstanceState,
animating,
};
},
function receiveDispatch(dispatch) {
function quit() {
dispatch(actions.setNav('transition'));
dispatch(actions.setGame(null));
dispatch(actions.setInstance(null));
}
return { quit };
}
);
function InstanceCtrlBtns(args) {
const {
game,
animating,
getInstanceState,
sendAbandon,
sendGameSkillClear,
sendReady,
quit,
} = args;
if (!game) return false;
const finished = game.phase === 'Finish';
const { abandonState } = this.state;
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;
function quitClick() {
getInstanceState();
quit();
}
const readyBtn = <button disabled={animating} class="ready" onClick={() => sendReady()}>Ready</button>;
const quitBtn = <button disabled={animating} onClick={quitClick}>Back</button>;
return (
<div class="instance-ctrl-btns">
{finished ? quitBtn : readyBtn}
<button>Chat</button>
<button disabled={animating} onClick={sendGameSkillClear}>Clear</button>
<button class={abandonClasses} disabled={animating || finished} onClick={abandonAction}>Abandon</button>
</div>
);
}
module.exports = addState(InstanceCtrlBtns);

View File

@ -4,80 +4,33 @@ 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 GameCtrlButtons = require('./game.ctrl.btns');
const addState = connect( const addState = connect(
function receiveState(state) { function receiveState(state) {
const { const {
ws,
game, game,
account, account,
animating,
} = state; } = state;
function sendReady() {
document.activeElement.blur();
return ws.sendGameReady(game.id);
}
function getInstanceState() {
return ws.sendInstanceState(game.instance);
}
function sendGameSkillClear() {
return ws.sendGameSkillClear(game.id);
}
function sendAbandon() {
return ws.sendInstanceAbandon(game.instance);
}
return { return {
game, game,
sendAbandon,
sendGameSkillClear,
sendReady,
account, account,
getInstanceState,
animating,
}; };
}, },
function receiveDispatch(dispatch) {
function quit() {
dispatch(actions.setNav('transition'));
dispatch(actions.setGame(null));
dispatch(actions.setInstance(null));
}
return { quit };
}
); );
function Controls(args) { function Controls(args) {
const { const {
account, account,
sendAbandon,
game, game,
animating,
sendGameSkillClear,
sendReady,
getInstanceState,
quit,
} = args; } = args;
if (!game) return false; if (!game) return false;
const { abandonState } = this.state;
const opponent = game.players.find(t => t.id !== account.id); const opponent = game.players.find(t => t.id !== account.id);
const player = game.players.find(t => t.id === account.id); const player = game.players.find(t => t.id === account.id);
function quitClick() {
getInstanceState();
quit();
}
const zero = Date.parse(game.phase_start); const zero = Date.parse(game.phase_start);
const now = Date.now(); const now = Date.now();
const end = Date.parse(game.phase_end); const end = Date.parse(game.phase_end);
@ -104,30 +57,13 @@ function Controls(args) {
</div> </div>
); );
const readyBtn = <button disabled={animating} class="ready" onClick={() => sendReady()}>Ready</button>;
const quitBtn = <button disabled={animating} onClick={quitClick}>Back</button>;
const cancelAbandon = e => {
e.stopPropagation();
return this.setState({ abandonState: false });
};
const abandonStateTrue = e => {
e.stopPropagation();
this.setState({ abandonState: true });
};
const abandonClasses = `abandon ${abandonState ? 'confirming' : ''}`;
const abandonAction = abandonState ? sendAbandon : abandonStateTrue;
return ( return (
<aside onClick={cancelAbandon}> <aside>
{timer} {timer}
<div class="controls instance-ctrl"> <div class="controls instance-ctrl">
<PlayerBox player={opponent}/> <PlayerBox player={opponent}/>
{game.phase === 'Finish' ? quitBtn : readyBtn}
<PlayerBox player={player} isPlayer={true} /> <PlayerBox player={player} isPlayer={true} />
<InstanceCtrlBtns /> <GameCtrlButtons />
</div> </div>
</aside> </aside>
); );

View File

@ -7,55 +7,49 @@ const addState = connect(
function receiveState(state) { function receiveState(state) {
const { const {
ws, ws,
game,
instance, instance,
animating,
} = state; } = state;
function sendReady() { function sendReady() {
document.activeElement.blur(); document.activeElement.blur();
return ws.sendGameReady(game.id); return ws.sendInstanceReady(instance.id);
}
function sendGameSkillClear() {
return ws.sendGameSkillClear(game.id);
} }
function sendAbandon() { function sendAbandon() {
const id = instance ? instance.id : game.instance; return ws.sendInstanceAbandon(instance.id);
return ws.sendInstanceAbandon(id);
} }
return { return {
game,
instance, instance,
animating,
sendAbandon, sendAbandon,
sendGameSkillClear, sendReady,
}; };
}, },
function receiveDispatch(dispatch) {
function leave() {
dispatch(actions.setNav('play'));
dispatch(actions.setGame(null));
dispatch(actions.setInstance(null));
}
return { leave };
}
); );
function InstanceCtrlBtns(args) { function InstanceCtrlBtns(args) {
const { const {
sendAbandon,
animating,
sendGameSkillClear,
game,
instance, instance,
sendAbandon,
sendReady,
leave,
} = args; } = args;
const finished = instance && instance.phase === 'Finished'; const finished = instance && instance.phase === 'Finished';
const { abandonState } = this.state; const { abandonState } = this.state;
const cancelAbandon = e => {
e.stopPropagation();
return this.setState({ abandonState: false });
};
const abandonStateTrue = e => { const abandonStateTrue = e => {
e.stopPropagation(); e.stopPropagation();
this.setState({ abandonState: true }); this.setState({ abandonState: true });
@ -65,11 +59,15 @@ function InstanceCtrlBtns(args) {
const abandonClasses = `abandon ${abandonState ? 'confirming' : ''}`; const abandonClasses = `abandon ${abandonState ? 'confirming' : ''}`;
const abandonAction = abandonState ? sendAbandon : abandonStateTrue; const abandonAction = abandonState ? sendAbandon : abandonStateTrue;
const ready = !finished
? <button class="ready" onClick={() => sendReady()}>Ready</button>
: <button class="ready" onClick={leave}>Leave</button>;
return ( return (
<div class="instance-ctrl-btns"> <div class="instance-ctrl-btns">
{ready}
<button>Chat</button> <button>Chat</button>
{game ? <button disabled={animating} onClick={sendGameSkillClear}>Clear</button> : null} <button class={abandonClasses} disabled={finished} onClick={abandonAction}>Abandon</button>
<button class={abandonClasses} disabled={animating || finished} onClick={abandonAction}>Abandon</button>
</div> </div>
); );
} }

View File

@ -11,44 +11,19 @@ const addState = connect(
ws, ws,
instance, instance,
account, account,
animating,
} = state; } = state;
function sendReady() {
document.activeElement.blur();
return ws.sendInstanceReady(instance.id);
}
function sendAbandon() {
return ws.sendInstanceAbandon(instance.id);
}
return { return {
sendAbandon,
instance, instance,
sendReady,
account, account,
animating,
}; };
}, },
function receiveDispatch(dispatch) {
function leave() {
dispatch(actions.setNav('play'));
dispatch(actions.setGame(null));
dispatch(actions.setInstance(null));
}
return { leave };
}
); );
function Controls(args) { function Controls(args) {
const { const {
account, account,
sendAbandon,
instance, instance,
sendReady,
leave,
} = args; } = args;
if (!instance) return false; if (!instance) return false;
@ -76,27 +51,18 @@ function Controls(args) {
background: displayColour, background: displayColour,
}; };
const timer = instance.phase !== 'InProgress' const timer = (
? null
: (
<div class="timer-container"> <div class="timer-container">
<div class="timer" style={timerStyles} >&nbsp;</div> <div class="timer" style={timerStyles} >&nbsp;</div>
</div> </div>
); );
const ready = instance.phase !== 'Finished'
? <button class="ready" onClick={() => sendReady()}>Ready</button>
: <button class="ready" onClick={leave}>Leave</button>
const abandon = instance.phase !== 'Finished' ? sendAbandon : false;
return ( return (
<aside> <aside>
{timer} {timer}
<div class="controls instance-ctrl"> <div class="controls instance-ctrl">
<PlayerBox player={opponent} /> <PlayerBox player={opponent} />
<PlayerBox player={player} isPlayer={true} abandon={abandon}/> <PlayerBox player={player} isPlayer={true} />
{ready}
<InstanceCtrlBtns /> <InstanceCtrlBtns />
</div> </div>
</aside> </aside>