swiping pog

This commit is contained in:
ntr 2019-09-24 13:49:34 +10:00
parent b681c9218a
commit 0d3c4374ba
9 changed files with 108 additions and 90 deletions

View File

@ -1,3 +1,5 @@
@import 'colours.less';
@media (max-width: 800px) { @media (max-width: 800px) {
.instance { .instance {
font-size: 8pt; font-size: 8pt;
@ -7,14 +9,14 @@
grid-template-areas: grid-template-areas:
"vbox" "vbox"
"constructs"; "constructs";
.info {
display: none;
}
} }
.instance .nav-btn { display: initial; } .instance .nav-btn { display: initial; }
/* Default view */
.instance .equip { display: none; }
.instance .info { display: none; }
.instance .construct-list { display: none; }
.vbox { .vbox {
grid-area: vbox; grid-area: vbox;
margin-bottom: 0; margin-bottom: 0;
@ -27,6 +29,9 @@
"inventory" "inventory"
"combiner"; "combiner";
&:not(.visible) {
display: none;
}
} }
.vbox-arrow { .vbox-arrow {
@ -45,24 +50,13 @@
margin: 0; margin: 0;
} }
/* constructs toggled on */ .construct-list {
.instance.constructs-visible .vbox {
display: none;
}
.instance.constructs-visible .equip {
display: initial;
grid-area: vbox;
margin: 0;
}
.instance.constructs-visible .highlight {
display: initial;
}
.instance.constructs-visible .construct-list {
display: grid; display: grid;
grid-auto-rows: 1fr; grid-auto-rows: 1fr;
.instance-construct:not(.visible) {
display: none;
};
} }
.vbox-inventory { .vbox-inventory {

View File

@ -9,7 +9,7 @@ require('./assets/styles/vbox.less');
require('./assets/styles/game.less'); require('./assets/styles/game.less');
require('./assets/styles/player.less'); require('./assets/styles/player.less');
require('./assets/styles/styles.mobile.css'); require('./assets/styles/styles.mobile.css');
require('./assets/styles/instance.mobile.css'); require('./assets/styles/instance.mobile.less');
// kick it off // kick it off
require('./src/app'); require('./src/app');

View File

@ -19,6 +19,7 @@
"async": "^2.6.2", "async": "^2.6.2",
"borc": "^2.0.3", "borc": "^2.0.3",
"docco": "^0.7.0", "docco": "^0.7.0",
"hammerjs": "^2.0.8",
"izitoast": "^1.4.0", "izitoast": "^1.4.0",
"keymaster": "^1.6.2", "keymaster": "^1.6.2",
"linkstate": "^1.1.1", "linkstate": "^1.1.1",

View File

@ -27,6 +27,7 @@ export const setItemInfo = value => ({ type: 'SET_ITEM_INFO', value });
export const setItemUnequip = value => ({ type: 'SET_ITEM_UNEQUIP', value }); export const setItemUnequip = value => ({ type: 'SET_ITEM_UNEQUIP', value });
export const setMtxActive = value => ({ type: 'SET_MTX_ACTIVE', value }); export const setMtxActive = value => ({ type: 'SET_MTX_ACTIVE', value });
export const setNav = value => ({ type: 'SET_NAV', value }); export const setNav = value => ({ type: 'SET_NAV', value });
export const setNavInstance = value => ({ type: 'SET_NAV_INSTANCE', value });
export const setPing = value => ({ type: 'SET_PING', value }); export const setPing = value => ({ type: 'SET_PING', value });
export const setPlayer = value => ({ type: 'SET_PLAYER', value }); export const setPlayer = value => ({ type: 'SET_PLAYER', value });
export const setReclaiming = value => ({ type: 'SET_RECLAIMING', value }); export const setReclaiming = value => ({ type: 'SET_RECLAIMING', value });

View File

@ -1,6 +1,9 @@
const { Component } = require('preact');
const preact = require('preact'); const preact = require('preact');
const { connect } = require('preact-redux'); const { connect } = require('preact-redux');
const Hammer = require('hammerjs');
const Vbox = require('./vbox.component'); const Vbox = require('./vbox.component');
const InfoContainer = require('./info.container'); const InfoContainer = require('./info.container');
const InstanceConstructsContainer = require('./instance.constructs'); const InstanceConstructsContainer = require('./instance.constructs');
@ -11,8 +14,14 @@ const actions = require('../actions');
const addState = connect( const addState = connect(
function receiveState(state) { function receiveState(state) {
const { instance, nav } = state; const { instance,
return { instance, nav }; nav,
navInstance,
} = state;
return { instance,
nav,
navInstance,
};
}, },
function receiveDispatch(dispatch) { function receiveDispatch(dispatch) {
@ -20,6 +29,11 @@ const addState = connect(
return dispatch(actions.setInfo(c)); return dispatch(actions.setInfo(c));
} }
function setNavInstance(c) {
return dispatch(actions.setNavInstance(c));
}
function clearItems() { function clearItems() {
dispatch(actions.setCombiner([])); dispatch(actions.setCombiner([]));
dispatch(actions.setReclaiming(false)); dispatch(actions.setReclaiming(false));
@ -33,17 +47,17 @@ const addState = connect(
return { return {
setInfo, setInfo,
clearItems, clearItems,
setNavInstance,
}; };
} }
); );
function Instance(args) { class Instance extends Component {
render(args) {
const { const {
instance, instance,
setInfo, setInfo,
clearItems, clearItems,
nav,
} = args; } = args;
if (!instance) return false; if (!instance) return false;
@ -57,14 +71,44 @@ function Instance(args) {
clearItems(); clearItems();
} }
const instanceClasses = `instance ${nav === 'constructs' ? 'constructs-visible' : ''}`;
return ( return (
<main class={instanceClasses} onClick={instanceClick} onMouseOver={() => setInfo(null)} > <main id="instance" class='instance' onClick={instanceClick} onMouseOver={() => setInfo(null)} >
<Vbox /> <Vbox />
<InfoContainer /> <InfoContainer />
<InstanceConstructsContainer /> <InstanceConstructsContainer />
</main> </main>
); );
}
componentDidMount() {
this.bindSwipes();
}
bindSwipes() {
const instance = document.getElementById('instance');
if (!instance) return setTimeout(this.bindSwipes, 50);
if (this.h) this.h.destroy();
this.h = new Hammer(instance);
const display = ['vbox', 'c0', 'c1', 'c2'];
this.h.on('swiperight', () => {
const {
navInstance,
setNavInstance,
} = this.props;
setNavInstance(navInstance === 0 ? 3 : navInstance - 1);
});
this.h.on('swipeleft', () => {
const {
navInstance,
setNavInstance,
} = this.props;
setNavInstance((navInstance + 1) % 4);
});
return true;
}
} }
module.exports = addState(Instance); module.exports = addState(Instance);

View File

@ -9,7 +9,16 @@ const actions = require('../actions');
const addState = connect( const addState = connect(
function receiveState(state) { function receiveState(state) {
const { ws, instance, player, account, itemInfo, itemEquip, activeConstruct } = state; const {
ws,
instance,
player,
account,
itemInfo,
itemEquip,
activeConstruct,
navInstance,
} = state;
function sendVboxApply(constructId, i) { function sendVboxApply(constructId, i) {
return ws.sendVboxApply(instance.id, constructId, i); return ws.sendVboxApply(instance.id, constructId, i);
@ -26,6 +35,7 @@ const addState = connect(
sendVboxApply, sendVboxApply,
itemInfo, itemInfo,
itemEquip, itemEquip,
navInstance,
activeConstruct, activeConstruct,
sendUnequip, sendUnequip,
}; };
@ -63,7 +73,6 @@ const addState = connect(
function Construct(props) { function Construct(props) {
const { const {
activeConstruct,
itemEquip, itemEquip,
construct, construct,
player, player,
@ -74,6 +83,7 @@ function Construct(props) {
itemInfo, itemInfo,
setInfo, setInfo,
sendUnequip, sendUnequip,
mobileVisible,
} = props; } = props;
function onClick(e) { function onClick(e) {
@ -191,8 +201,10 @@ function Construct(props) {
</div>; </div>;
}); });
const classes = `instance-construct ${mobileVisible ? 'visible' : ''}`;
return ( return (
<div key={construct.id} class="instance-construct" onClick={onClick} > <div key={construct.id} class={classes} onClick={onClick} >
<ConstructAvatar construct={construct} /> <ConstructAvatar construct={construct} />
<h2 class="name" >{construct.name}</h2> <h2 class="name" >{construct.name}</h2>
<div class="skills" onMouseOver={e => hoverInfo(e, 'constructSkills')} > <div class="skills" onMouseOver={e => hoverInfo(e, 'constructSkills')} >
@ -224,6 +236,7 @@ function InstanceConstructs(props) {
setItemUnequip, setItemUnequip,
setItemEquip, setItemEquip,
sendUnequip, sendUnequip,
navInstance,
} = props; } = props;
if (!player) return false; if (!player) return false;
@ -242,6 +255,7 @@ function InstanceConstructs(props) {
itemInfo, itemInfo,
setVboxHighlight, setVboxHighlight,
sendUnequip, sendUnequip,
mobileVisible: navInstance === i + 1,
})); }));
const classes = `construct-list`; const classes = `construct-list`;

View File

@ -15,16 +15,11 @@ const addState = connect(
}, },
function receiveDispatch(dispatch) { function receiveDispatch(dispatch) {
function setInfo(c) {
return dispatch(actions.setInfo(c));
}
function setNav(v) { function setNav(v) {
return dispatch(actions.setNav(v)); return dispatch(actions.setNav(v));
} }
return { return {
setInfo,
setNav, setNav,
}; };
} }
@ -34,29 +29,11 @@ function Instance(args) {
const { const {
instance, instance,
player, player,
nav,
showNav,
setInfo,
setNav,
sendInstanceReady, sendInstanceReady,
} = args; } = args;
if (!instance || !player) { const rdyClasses = `ready-btn ready`;
return (
<footer id="footer">
<button id="nav-btn" onClick={() => setShowNav(!showNav)} ></button>
</footer>
);
}
function hoverInfo(e, info) {
e.stopPropagation();
return setInfo(info);
}
const rdyClasses = `${player.ready ? 'ready ready-btn' : 'ready-btn'}`;
const readyInfo = instance.phase === 'Lobby' const readyInfo = instance.phase === 'Lobby'
? 'lobbyReady' ? 'lobbyReady'
: 'ready'; : 'ready';
@ -64,27 +41,11 @@ function Instance(args) {
const readyBtn = ( const readyBtn = (
<button <button
class={rdyClasses} class={rdyClasses}
onMouseOver={e => hoverInfo(e, readyInfo)}
onClick={() => sendInstanceReady()}> onClick={() => sendInstanceReady()}>
Ready Ready
</button> </button>
); );
function navClick() {
if (nav === 'vbox') return setNav('constructs');
return setNav('vbox');
}
const navBtn = instance.phase === 'InProgress'
? (
<button
id="instance-nav"
onClick={navClick}>
{nav === 'vbox' ? 'Constructs' : 'Vbox'}
</button>
)
: null;
const zero = Date.parse(instance.phase_start); const zero = Date.parse(instance.phase_start);
const now = Date.now(); const now = Date.now();
const end = Date.parse(instance.phase_end); const end = Date.parse(instance.phase_end);
@ -112,7 +73,6 @@ function Instance(args) {
return ( return (
<footer id="footer"> <footer id="footer">
{timer} {timer}
{navBtn}
{readyBtn} {readyBtn}
</footer> </footer>
); );

View File

@ -17,6 +17,7 @@ const addState = connect(
vboxSelected, vboxSelected,
itemInfo, itemInfo,
itemUnequip, itemUnequip,
navInstance,
} = state; } = state;
function sendVboxDiscard() { function sendVboxDiscard() {
@ -51,7 +52,8 @@ const addState = connect(
vboxSelected, vboxSelected,
itemInfo, itemInfo,
itemUnequip, itemUnequip,
sendItemUnequip sendItemUnequip,
navInstance,
}; };
}, },
@ -90,6 +92,7 @@ const addState = connect(
function Vbox(args) { function Vbox(args) {
const { const {
combiner, combiner,
navInstance,
// instance, // instance,
itemInfo, itemInfo,
player, player,
@ -348,7 +351,7 @@ function Vbox(args) {
return setInfo(info); return setInfo(info);
} }
const classes = 'vbox'; const classes = `vbox ${navInstance === 0 ? 'visible' : ''}`;
return ( return (
<div class={classes}> <div class={classes}>
{vboxElement()} {vboxElement()}

View File

@ -40,6 +40,7 @@ module.exports = {
itemUnequip: createReducer([], 'SET_ITEM_UNEQUIP'), itemUnequip: createReducer([], 'SET_ITEM_UNEQUIP'),
mtxActive: createReducer(null, 'SET_MTX_ACTIVE'), mtxActive: createReducer(null, 'SET_MTX_ACTIVE'),
nav: createReducer(null, 'SET_NAV'), nav: createReducer(null, 'SET_NAV'),
navInstance: createReducer(0, 'SET_NAV_INSTANCE'),
showNav: createReducer(null, 'SET_SHOW_NAV'), showNav: createReducer(null, 'SET_SHOW_NAV'),
ping: createReducer(null, 'SET_PING'), ping: createReducer(null, 'SET_PING'),
player: createReducer(null, 'SET_PLAYER'), player: createReducer(null, 'SET_PLAYER'),