const preact = require('preact'); const { connect } = require('preact-redux'); const range = require('lodash/range'); const countBy = require('lodash/countBy'); const without = require('lodash/without'); const { removeTier } = require('../utils'); const shapes = require('./shapes'); const actions = require('../actions'); const buttons = require('./buttons'); const addState = connect( function receiveState(state) { const { ws, instance, player, combiner, reclaiming, vboxSelected, itemInfo, itemUnequip, navInstance, tutorial, } = state; function sendVboxDiscard() { return ws.sendVboxDiscard(instance.id); } function sendVboxAccept(group, index) { document.activeElement.blur(); return ws.sendVboxAccept(instance.id, group, index); } function sendVboxCombine() { return ws.sendVboxCombine(instance.id, combiner); } function sendVboxReclaim(i) { return ws.sendVboxReclaim(instance.id, i); } function sendItemUnequip([constructId, item]) { return ws.sendVboxUnequip(instance.id, constructId, item); } return { combiner, instance, player, reclaiming, sendVboxAccept, sendVboxCombine, sendVboxDiscard, sendVboxReclaim, vboxSelected, itemInfo, itemUnequip, sendItemUnequip, navInstance, tutorial, }; }, function receiveDispatch(dispatch) { function setCombiner(c) { return dispatch(actions.setCombiner(c)); } function setReclaiming(v) { return dispatch(actions.setReclaiming(v)); } function setInfo(item) { return dispatch(actions.setInfo(item)); } function setVboxSelected(v) { return dispatch(actions.setVboxSelected(v)); } function setItemEquip(v) { return dispatch(actions.setItemEquip(v)); } return { setCombiner, setReclaiming, setInfo, setVboxSelected, setItemEquip, }; } ); class Vbox extends preact.Component { shouldComponentUpdate(newProps) { // Single variable props if (newProps.combiner !== this.props.combiner) return true; if (newProps.itemUnequip !== this.props.itemUnequip) return true; if (newProps.reclaiming !== this.props.reclaiming) return true; if (newProps.navInstance !== this.props.navInstance) return true; if (newProps.tutorial !== this.props.tutorial) return true; if (newProps.vboxSelected !== this.props.vboxSelected) return true; if (newProps.player !== this.props.player) return true; if (newProps.instance !== this.props.instance) return true; return false; } render(args) { const { // Changing state variables combiner, itemUnequip, player, reclaiming, tutorial, navInstance, vboxSelected, instance, // Static itemInfo, // Function Calls sendItemUnequip, sendVboxAccept, sendVboxCombine, sendVboxDiscard, sendVboxReclaim, setVboxSelected, setItemEquip, setInfo, setCombiner, setReclaiming, } = args; if (!player) return false; const { vbox } = player; const vboxSelecting = vboxSelected.length; function combinerChange(newCombiner) { setCombiner(newCombiner); if (newCombiner.length === 1) { setItemEquip(newCombiner[0]); } else { setItemEquip(null); } return true; } // // VBOX // function vboxHover(e, v) { if (v) { e.stopPropagation(); if (vboxSelected[0]) return true; // There is a base skill or spec selected in the vbox if (combiner.length !== 0) { const base = combiner.find(c => !['Red', 'Blue', 'Green'].includes(vbox.bound[c])); if (base || base === 0) return true; } setInfo(v); } return true; } function clearVboxSelected() { setVboxSelected([]); } function vboxBuySelected() { if (!vboxSelecting) return false; document.activeElement.blur(); clearVboxSelected(); sendVboxAccept(vboxSelected[0], vboxSelected[1]); return true; } function availableBtn(v, group, index) { if (!v) return ; const selected = vboxSelected[0] === group && vboxSelected[1] === index; // state not yet set in double click handler function onDblClick(e) { clearVboxSelected(); sendVboxAccept(group, index); e.stopPropagation(); } function onClick(e) { e.stopPropagation(); setItemEquip(null); setCombiner([]); setInfo(vbox.free[group][index]); return setVboxSelected([group, index]); } const combinerItems = combiner.map(j => vbox.bound[j]); const combinerCount = countBy(combinerItems, co => co); const comboHighlight = combinerItems.length > 0 && itemInfo.combos.some(combo => { if (combo.components.includes(v)) { return combinerItems.every(c => { if (!combo.components.includes(c)) return false; const comboCount = countBy(combo.components, co => co); if (combinerCount[c] > comboCount[c]) return false; if (c === v && combinerCount[c] + 1 > comboCount[c]) return false; return true; }); } return false; }) ? 'combo-border' : ''; const classes = `${v.toLowerCase()} ${selected ? 'highlight' : ''} ${comboHighlight}`; const vboxObject = shapes[v] ? shapes[v]() : v; return ( ); } function vboxElement() { return (