123 lines
3.2 KiB
JavaScript
123 lines
3.2 KiB
JavaScript
const preact = require('preact');
|
|
const range = require('lodash/range');
|
|
const { connect } = require('preact-redux');
|
|
|
|
const actions = require('../actions');
|
|
const { STATS, SPECS, crypAvatar } = require('../utils');
|
|
const shapes = require('./shapes');
|
|
|
|
const addState = connect(
|
|
function receiveState(state) {
|
|
const { activeCryp, player } = state;
|
|
return { activeCryp, player };
|
|
},
|
|
|
|
function receiveDispatch(dispatch) {
|
|
function setInfo(item, value) {
|
|
dispatch(actions.setInfo([item, value]));
|
|
}
|
|
|
|
function setActiveCryp(value) {
|
|
dispatch(actions.setActiveCryp(value));
|
|
}
|
|
|
|
function setVboxHidden(value) {
|
|
dispatch(actions.setVboxHidden(value));
|
|
}
|
|
|
|
return { setInfo, setActiveCryp, setVboxHidden };
|
|
}
|
|
|
|
);
|
|
|
|
function InfoCryp(args) {
|
|
const {
|
|
activeCryp,
|
|
player,
|
|
|
|
setVboxHidden,
|
|
setInfo,
|
|
setActiveCryp,
|
|
} = args;
|
|
|
|
if (!activeCryp) return false;
|
|
const cryp = player.cryps.find(c => c.id === activeCryp.id);
|
|
|
|
if (!cryp) return false;
|
|
|
|
// onClick={() => setInfo('skill', { skill: s, cryp })}
|
|
const skills = range(0, 3).map(i => {
|
|
const skill = cryp.skills[i];
|
|
|
|
function skillClick(e) {
|
|
if (!skill) {
|
|
setVboxHidden(false);
|
|
setInfo('highlight', 'skill');
|
|
} else setInfo('skill', { skill: skill.skill, cryp });
|
|
e.stopPropagation();
|
|
return setActiveCryp(cryp);
|
|
}
|
|
|
|
const s = cryp.skills[i]
|
|
? cryp.skills[i].skill
|
|
: (<span> </span>);
|
|
return <button key={i} alt={s} onClick={skillClick} >{s}</button>;
|
|
});
|
|
|
|
const stats = Object.values(STATS).map((s, j) => (
|
|
<figure key={j} alt={s.stat} className={s.stat}>
|
|
{s.svg(`stat-icon ${s.colour}`)}
|
|
<figcaption>{cryp[s.stat].value}</figcaption>
|
|
</figure>
|
|
));
|
|
|
|
const specs = range(0, 6).map(i => {
|
|
const s = cryp.specs[i];
|
|
|
|
function blankSpecClick(e) {
|
|
e.stopPropagation();
|
|
setActiveCryp(cryp);
|
|
setInfo('highlight', 'spec');
|
|
setVboxHidden(true);
|
|
}
|
|
|
|
if (!s) {
|
|
return (
|
|
<figure key={i} className="gray" onClick={blankSpecClick}>
|
|
{shapes.diamond('stat-icon gray')}
|
|
<figcaption> </figcaption>
|
|
</figure>
|
|
);
|
|
}
|
|
|
|
function specClick(e) {
|
|
e.stopPropagation();
|
|
setActiveCryp(cryp);
|
|
setInfo('spec', { spec: s, cryp });
|
|
}
|
|
|
|
return (
|
|
<figure key={i} onClick={specClick}>
|
|
{SPECS[s].svg(`stat-icon ${SPECS[s].colour}`)}
|
|
<figcaption>{SPECS[s].caption}</figcaption>
|
|
</figure>
|
|
);
|
|
});
|
|
|
|
return (
|
|
<div className="info-cryp">
|
|
<div className="stats">
|
|
{stats}
|
|
</div>
|
|
<div className="specs">
|
|
{specs}
|
|
</div>
|
|
<div className="skills">
|
|
{skills}
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
module.exports = addState(InfoCryp);
|