UNPKG

poi-plugin-senka-calc

Version:
212 lines (184 loc) 9.19 kB
"use strict"; 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;