Files
optolith-client/js/stores/ProfessionStore.js
T
Lukas Obermann 7c229853e7 Updated babel, fixing data flow in ListStore
Transferring all Actions to ListStore to regain unidirectional data flow for all stores. Other Stores only will store section-specific data e.g. filters.
2016-11-02 02:23:02 +01:00

235 lines
4.8 KiB
JavaScript

import AppDispatcher from '../dispatcher/AppDispatcher';
import CultureStore from './CultureStore';
import ELStore from './ELStore';
import RaceStore from './RaceStore';
import { EventEmitter } from 'events';
import ActionTypes from '../constants/ActionTypes';
var _currentID = null;
var _professions = {};
var _filter = '';
var _sortOrder = 'name';
var _showAll = false;
function _updateCurrentID(id) {
_currentID = id;
}
function _updateFilterText(text) {
_filter = text;
}
function _updateSortOrder(option) {
_sortOrder = option;
}
function _changeView(view) {
_showAll = view;
}
var ProfessionStore = Object.assign({}, EventEmitter.prototype, {
init: function(rawProfessions) {
for (let id in rawProfessions) {
let obj = rawProfessions[id];
obj.sa = obj.sa.map(e => {
e[0] = `SA_${e[0]}`;
return e;
});
obj.combattech = obj.combattech.map(e => {
e[0] = `CT_${e[0]}`;
return e;
});
obj.talents = obj.talents.map(e => {
e[0] = `TAL_${e[0]}`;
return e;
});
obj.spells = obj.spells.map(e => {
e[0] = `SPELL_${e[0]}`;
return e;
});
obj.chants = obj.chants.map(e => {
e[0] = `LITURGY_${e[0]}`;
return e;
});
obj.sel = obj.sel.map(e => do {
if (e[0] === 'ct') {
e[3] = e[3].split(',').map(e => `CT_${e}`);
e;
} else if (e[0] === 'cantrips') {
e[2] = e[2].split(',').map(e => parseInt(e));
e;
} else e;
});
obj.typ_adv = obj.typ_adv.map(e => `ADV_${e}`);
obj.typ_dadv = obj.typ_dadv.map(e => `DISADV_${e}`);
obj.untyp_adv = obj.untyp_adv.map(e => `ADV_${e}`);
obj.untyp_dadv = obj.untyp_dadv.map(e => `DISADV_${e}`);
obj.vars = obj.vars.map(e => `PV_${e}`);
rawProfessions[id] = obj;
}
_professions = rawProfessions;
},
emitChange: function() {
this.emit('change');
},
addChangeListener: function(callback) {
this.on('change', callback);
},
removeChangeListener: function(callback) {
this.removeListener('change', callback);
},
get: function(id) {
return _professions[id];
},
getAll: function() {
return _professions;
},
getAllForView: function() {
var array = [{
id: 'P_0',
name: 'Eigene Profession',
subname: '',
ap: 0,
vars: []
}];
for (let id in _professions) {
let valid = _professions[id].req.every(req => {
if (!req[0].match('ATTR')) {
return true;
} else {
let max_attr = ELStore.getStart().max_attr;
let race = RaceStore.getCurrent();
return !(req[1] > max_attr || (race.attr_sel[1].indexOf(req[0]) > -1 && req[1] > (max_attr + race.attr_sel[0]) ));
}
});
if (valid) {
array.push(_professions[id]);
}
}
if (_filter !== '') {
let filter = _filter.toLowerCase();
array = array.filter(obj => obj.name.toLowerCase().match(filter) || obj.name.toLowerCase().match(filter));
}
let cultureID = CultureStore.getCurrentID();
if (cultureID !== null && !_showAll) {
let currentCulture = CultureStore.getCurrent();
array = array.filter(obj => currentCulture.typ_prof.indexOf(obj.id) > -1 || obj.id === 'P_0');
}
if (_sortOrder == 'name') {
array.sort((a, b) => {
if (a.name < b.name) {
return -1;
} else if (a.name > b.name) {
return 1;
} else {
return 0;
}
});
}
else if (_sortOrder == 'ap') {
array.sort((a, b) => {
if (a.ap < b.ap) {
return -1;
} else if (a.ap > b.ap) {
return 1;
} else {
if (a.name < b.name) {
return -1;
} else if (a.name > b.name) {
return 1;
} else {
return 0;
}
}
});
}
return array;
},
getCurrentID: function() {
return _currentID;
},
getCurrent: function() {
return this.get(this.getCurrentID());
},
getCurrentName: function() {
return this.getCurrent() !== undefined ? this.getCurrent().name : null;
},
getNameByID: function(id) {
return this.get(id) !== undefined ? this.get(id).name : null;
},
getFilter: function() {
return _filter;
},
getSortOrder: function() {
return _sortOrder;
},
areAllVisible: function() {
return _showAll;
}
});
ProfessionStore.dispatchToken = AppDispatcher.register( function( payload ) {
switch( payload.actionType ) {
case ActionTypes.RECEIVE_HERO:
_updateCurrentID(payload.p);
break;
case ActionTypes.SELECT_RACE:
case ActionTypes.SELECT_CULTURE:
_updateCurrentID(null);
break;
case ActionTypes.SELECT_PROFESSION:
_updateCurrentID(payload.professionID);
break;
case ActionTypes.FILTER_PROFESSIONS:
_updateFilterText(payload.text);
break;
case ActionTypes.SORT_PROFESSIONS:
_updateSortOrder(payload.option);
break;
case ActionTypes.CHANGE_PROFESSION_VIEW:
_changeView(payload.view);
break;
case ActionTypes.RECEIVE_RAW_LISTS:
ProfessionStore.init(payload.professions);
break;
default:
return true;
}
ProfessionStore.emitChange();
return true;
});
export default ProfessionStore;