poi-plugin-senka-calc
Version:
Ranking point calculator for poi
212 lines (184 loc) • 9.19 kB
JavaScript
;
exports.__esModule = true;
exports.Calculator = void 0;
var _react = _interopRequireWildcard(require("react"));
var _core = require("@blueprintjs/core");
var _select = require("@blueprintjs/select");
var _reactI18next = require("react-i18next");
var _common = require("./common");
var _progress = require("./progress");
var _reactRedux = require("react-redux");
var _selectors = require("../selectors");
var _util = require("../lib/util");
var _const = require("../lib/const");
var _windowEnv = require("views/components/etc/window-env");
var _styledComponents = _interopRequireDefault(require("styled-components"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
const TagWithMargin = (0, _styledComponents.default)(_core.Tag).withConfig({
displayName: "calculator__TagWithMargin",
componentId: "sc-1rqsj0r-0"
})(["margin-right:5px;margin-bottom:5px;"]);
const Calculator = () => {
const {
mountPoint
} = (0, _react.useContext)(_windowEnv.WindowEnv);
const {
t
} = (0, _reactI18next.useTranslation)('poi-plugin-senka-calc');
const {
rankUser = {},
experienceHistory = {},
exHistory = {},
questHistory = {},
excludedQuests = [],
targetSenka
} = (0, _reactRedux.useSelector)(_selectors.pluginDataSelector);
const dispatch = (0, _reactRedux.useDispatch)();
const currentSenka = (0, _util.getElementFromNumberRecords)(rankUser, -1);
const deltaSenka = (0, _react.useMemo)(() => {
const lastUpdateDateNo = parseInt((0, _util.getElementByIndex)(Object.keys(rankUser), -1));
const experienceDelta = (0, _util.getElementFromNumberRecords)(experienceHistory, -1) - experienceHistory[lastUpdateDateNo];
const experienceSenka = experienceDelta * _const.EXPERIENCE_TO_SENKA_RATE;
const uncountedExSenka = Object.keys(exHistory).map(dateNo => parseInt(dateNo)).filter(dateNo => dateNo >= lastUpdateDateNo).map(dateNo => exHistory[dateNo]).reduce((a, b) => [...a, ...b], []).map(id => _const.EX_MAPS[id] || 0).reduce((a, b) => a + b, 0);
const uncountedQuestSenka = Object.keys(questHistory).map(dateNo => parseInt(dateNo)) // Senka of dateNo 1000 will be moved to next month
.filter(dateNo => dateNo >= lastUpdateDateNo && dateNo < 1000).map(dateNo => questHistory[dateNo]).reduce((a, b) => [...a, ...b], []).map(questId => {
var _SENKA_QUESTS$find;
return ((_SENKA_QUESTS$find = _const.SENKA_QUESTS.find(({
id
}) => id === questId)) === null || _SENKA_QUESTS$find === void 0 ? void 0 : _SENKA_QUESTS$find.senka) || 0;
}).reduce((a, b) => a + b, 0);
return Math.trunc(experienceSenka + uncountedExSenka + uncountedQuestSenka);
}, [rankUser, experienceHistory, exHistory, questHistory]);
const completedExOps = (0, _react.useMemo)(() => Object.values(exHistory).reduce((a, b) => [...a, ...b], []), [exHistory]);
const incompletedExOps = (0, _react.useMemo)(() => Object.keys(_const.EX_MAPS).map(id => parseInt(id)).filter(id => completedExOps.indexOf(id) === -1), [completedExOps]);
const plannedExSenka = (0, _react.useMemo)(() => incompletedExOps.map(id => _const.EX_MAPS[id] || 0).reduce((a, b) => a + b, 0), [incompletedExOps]);
const completedQuests = (0, _react.useMemo)(() => Object.values(questHistory).reduce((a, b) => [...a, ...b], []), [questHistory]);
const incompletedAndExcludedQuestsObjects = (0, _react.useMemo)(() => _const.SENKA_QUESTS.filter(({
id
}) => completedQuests.indexOf(id) === -1), [completedQuests]);
const incompletedQuestsObjects = (0, _react.useMemo)(() => incompletedAndExcludedQuestsObjects.filter(({
id
}) => excludedQuests.indexOf(id) === -1), [incompletedAndExcludedQuestsObjects, excludedQuests]);
const plannedQuestSenka = (0, _react.useMemo)(() => {
return incompletedQuestsObjects.map(({
senka
}) => senka || 0).reduce((a, b) => a + b, 0);
}, [incompletedQuestsObjects]);
const expectedSenka = currentSenka + deltaSenka + plannedExSenka + plannedQuestSenka;
const unfinishedSenka = targetSenka - expectedSenka;
const onTargetSenkaChange = value => {
dispatch({
type: '@@poi-plugin-senka-calc/update-target-senka',
value
});
};
const renderTags = (0, _react.useCallback)(questId => {
const quest = _const.SENKA_QUESTS.find(({
id
}) => id === questId);
if (!quest) {
return null;
}
return `${quest.code} - ${quest.shortname}`;
}, []);
const renderQuestItems = (0, _react.useCallback)(questId => {
const quest = _const.SENKA_QUESTS.find(({
id
}) => id === questId);
if (!quest) {
return null;
}
return /*#__PURE__*/_react.default.createElement(_core.MenuItem, {
active: excludedQuests.indexOf(questId) !== -1,
text: `${quest.code} - ${quest.name}`,
label: quest.senka.toString(),
onClick: () => onQuestSelect(questId)
});
}, [excludedQuests]);
const onQuestSelect = (0, _react.useCallback)(questId => {
dispatch({
type: '@@poi-plugin-senka-calc/update-excluded-quests',
value: questId
});
}, []);
return /*#__PURE__*/_react.default.createElement(_common.Container, null, /*#__PURE__*/_react.default.createElement(_common.Title, null, /*#__PURE__*/_react.default.createElement(_core.Icon, {
icon: "calculator",
style: {
paddingRight: 8
}
}), t('Calculator')), /*#__PURE__*/_react.default.createElement(_core.FormGroup, {
label: t('Target ranking points')
}, /*#__PURE__*/_react.default.createElement(_core.NumericInput, {
asyncControl: true,
fill: true,
value: targetSenka,
onValueChange: onTargetSenkaChange,
max: 20000,
majorStepSize: 100,
minorStepSize: 100,
stepSize: 100,
min: 0
})), /*#__PURE__*/_react.default.createElement(_core.FormGroup, {
label: t('Excluded quests'),
helperText: unfinishedSenka > 0 ? t('Remaining {{ points }} points', {
points: unfinishedSenka
}) : t('{{ points }} points over the target', {
points: -unfinishedSenka
})
}, /*#__PURE__*/_react.default.createElement(_select.MultiSelect2, {
itemRenderer: renderQuestItems,
items: _const.SENKA_QUESTS.map(({
id
}) => id),
onRemove: onQuestSelect,
onItemSelect: onQuestSelect,
selectedItems: excludedQuests,
tagRenderer: renderTags,
placeholder: t('Click to select quests'),
popoverProps: {
portalContainer: mountPoint,
hasBackdrop: true
}
})), /*#__PURE__*/_react.default.createElement(_progress.Progress, {
currentSenka: currentSenka,
deltaSenka: deltaSenka,
plannedExSenka: plannedExSenka,
plannedQuestSenka: plannedQuestSenka,
expectedSenka: expectedSenka,
unfinishedSenka: unfinishedSenka,
targetSenka: targetSenka
}), /*#__PURE__*/_react.default.createElement(_core.FormGroup, {
label: t('Completed extra operations')
}, completedExOps.map(id => {
return /*#__PURE__*/_react.default.createElement(TagWithMargin, {
key: id
}, Math.trunc(id / 10), "-", id % 10);
})), /*#__PURE__*/_react.default.createElement(_core.FormGroup, {
label: t('Remaining extra operations')
}, incompletedExOps.map(id => {
return /*#__PURE__*/_react.default.createElement(TagWithMargin, {
key: id
}, Math.trunc(id / 10), "-", id % 10);
})), /*#__PURE__*/_react.default.createElement(_core.FormGroup, {
label: t('Completed quests')
}, completedQuests.map(questId => {
const quest = _const.SENKA_QUESTS.find(({
id
}) => questId === id);
if (!quest) {
return null;
}
return /*#__PURE__*/_react.default.createElement(TagWithMargin, {
key: quest.code
}, quest.code, " - ", quest.shortname);
})), /*#__PURE__*/_react.default.createElement(_core.FormGroup, {
label: t('Remaining quests')
}, incompletedQuestsObjects.map(quest => {
return /*#__PURE__*/_react.default.createElement(TagWithMargin, {
key: quest.code
}, quest.code, " - ", quest.shortname);
})));
};
exports.Calculator = Calculator;