poi-plugin-milk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.idea/jsLibraryMappings.xml +6 -0
- package/.idea/misc.xml +81 -0
- package/.idea/modules.xml +8 -0
- package/.idea/poi-plugin-anchorage-repair.iml +12 -0
- package/.idea/workspace.xml +397 -0
- package/C/357/200/272UsersAdministratorAppDataRoamingpoipluginsnode_modulespoi-plugin-anchorage-repair +226 -0
- package/C/357/200/272UsersAdministratorAppDataRoamingpoipluginsnode_modulespoi-plugin-anchorage-repairindex2.js +226 -0
- package/LICENSE +21 -0
- package/README-CN.MD +53 -0
- package/README.MD +66 -0
- package/assets/style.css +55 -0
- package/i18n/en-US.json +1 -0
- package/i18n/ja-JP.json +24 -0
- package/i18n/ko-KR.json +12 -0
- package/i18n/zh-CN.json +24 -0
- package/i18n/zh-TW.json +24 -0
- package/index.js +234 -0
- package/index.js.map +1 -0
- package/package.json +43 -0
- package/parts/candidates.js +169 -0
- package/parts/candidates.js.map +1 -0
- package/parts/countup-timer.js +122 -0
- package/parts/countup-timer.js.map +1 -0
- package/parts/factor.js +32 -0
- package/parts/factor.js.map +1 -0
- package/parts/fleet-list.js +324 -0
- package/parts/fleet-list.js.map +1 -0
- package/parts/functions.js +90 -0
- package/parts/functions.js.map +1 -0
- package/parts/ship-row.js +141 -0
- package/parts/ship-row.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["countup-timer.es"],"names":["CountupTimer","constructor","props","state","startTime","componentDidMount","startTick","componentWillReceiveProps","nextProps","countdownId","stopTick","setState","timeElapsed","getTimeElapsed","shouldComponentUpdate","nextState","componentDidUpdate","componentWillUnmount","window","ticker","reg","tick","unreg","currentTime","textLabel","textContent","tickCallback","startCallback","error","console","stack","render","ref","propTypes","string","isRequired","number","func","Date","now","Math","round","defaultProps"],"mappings":"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","file":"countup-timer.es","sourcesContent":["// similar to CountdownTimer in 'views/components/main/parts/countdown-timer.es', but it counts up\n\nimport React, { Component } from 'react'\nimport PropTypes from 'prop-types'\n\nimport { resolveTime } from 'views/utils/tools'\n\n\nexport default class CountupTimer extends Component {\n static propTypes = {\n countdownId: PropTypes.string.isRequired, // UNIQUE ID to register to window.ticker\n startTime: PropTypes.number, // startTime in ms\n tickCallback: PropTypes.func, // callback function for each second\n startCallback: PropTypes.func, // callback function when starting to count up\n }\n static getTimeElapsed = (startTime, currentTime = Date.now()) => {\n if (startTime <= 0) {\n return -1\n } else if (startTime > currentTime) {\n return 0\n }\n return Math.round((currentTime - startTime) / 1000)\n }\n static defaultProps = {\n startTime: -1,\n tickCallback: null,\n startCallback: null,\n }\n constructor(props) {\n super(props)\n this.timeElapsed = this.constructor.getTimeElapsed(this.props.startTime)\n }\n state = {\n startTime: this.props.startTime,\n }\n componentDidMount = () => {\n this.startTick()\n }\n componentWillReceiveProps = (nextProps) => {\n if (nextProps.countdownId !== this.props.countdownId) {\n this.stopTick()\n }\n if (nextProps.startTime !== this.state.startTime) {\n this.setState({ startTime: nextProps.startTime })\n this.timeElapsed = this.constructor.getTimeElapsed(nextProps.startTime)\n }\n }\n shouldComponentUpdate = (nextProps, nextState) =>\n nextProps.countdownId !== this.props.countdownId || nextState.startTime !== this.state.startTime\n componentDidUpdate = () => {\n this.startTick() // Doesn't matter if it didn't stop\n }\n componentWillUnmount = () => {\n this.stopTick()\n }\n startTick = () => {\n window.ticker.reg(this.props.countdownId, this.tick)\n }\n stopTick = () => {\n window.ticker.unreg(this.props.countdownId)\n }\n tick = (currentTime) => {\n // const actualElapsed = this.constructor.getTimeElapsed(this.state.startTime, currentTime)\n // if (Math.abs(this.timeElapsed - actualElapsed) > 2) {\n // this.timeElapsed = actualElapsed\n // }\n this.timeElapsed = this.constructor.getTimeElapsed(this.state.startTime, currentTime)\n if (this.timeElapsed < 0) {\n this.stopTick()\n }\n if (this.state.startTime >= 0) {\n try {\n if (this.textLabel) {\n this.textLabel.textContent = resolveTime(this.timeElapsed) || resolveTime(0)\n }\n if (this.props.tickCallback) {\n this.props.tickCallback(this.timeElapsed)\n }\n if (this.timeElapsed < 1 && this.props.startCallback) {\n this.props.startCallback()\n }\n } catch (error) {\n console.error(error.stack)\n }\n }\n this.timeElapsed += 1\n }\n render() {\n return <span ref={(ref) => { this.textLabel = ref }}>{resolveTime(this.timeElapsed)}</span>\n }\n}\n"]}
|
package/parts/factor.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
const FACTOR = {
|
|
7
|
+
1: { api_id: 1, api_name: '海防艦', factor: 0.5 },
|
|
8
|
+
2: { api_id: 2, api_name: '駆逐艦', factor: 1 },
|
|
9
|
+
3: { api_id: 3, api_name: '軽巡洋艦', factor: 1 },
|
|
10
|
+
4: { api_id: 4, api_name: '重雷装巡洋艦', factor: 1 },
|
|
11
|
+
5: { api_id: 5, api_name: '重巡洋艦', factor: 1.5 },
|
|
12
|
+
6: { api_id: 6, api_name: '航空巡洋艦', factor: 1.5 },
|
|
13
|
+
7: { api_id: 7, api_name: '軽空母', factor: 1.5 },
|
|
14
|
+
8: { api_id: 8, api_name: '戦艦', factor: 1.5 },
|
|
15
|
+
9: { api_id: 9, api_name: '戦艦', factor: 2 },
|
|
16
|
+
10: { api_id: 10, api_name: '航空戦艦', factor: 2 },
|
|
17
|
+
11: { api_id: 11, api_name: '正規空母', factor: 2 },
|
|
18
|
+
12: { api_id: 12, api_name: '超弩級戦艦', factor: 0 },
|
|
19
|
+
13: { api_id: 13, api_name: '潜水艦', factor: 0.5 },
|
|
20
|
+
14: { api_id: 14, api_name: '潜水空母', factor: 1 },
|
|
21
|
+
15: { api_id: 15, api_name: '補給艦', factor: 1 },
|
|
22
|
+
16: { api_id: 16, api_name: '水上機母艦', factor: 1 },
|
|
23
|
+
17: { api_id: 17, api_name: '揚陸艦', factor: 1 },
|
|
24
|
+
18: { api_id: 18, api_name: '装甲空母', factor: 2 },
|
|
25
|
+
19: { api_id: 19, api_name: '工作艦', factor: 2 },
|
|
26
|
+
20: { api_id: 20, api_name: '潜水母艦', factor: 1.5 },
|
|
27
|
+
21: { api_id: 21, api_name: '練習巡洋艦', factor: 1 },
|
|
28
|
+
22: { api_id: 22, api_name: '補給艦', factor: 1 }
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
exports.default = FACTOR;
|
|
32
|
+
module.exports = exports['default'];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["factor.es"],"names":["FACTOR","api_id","api_name","factor"],"mappings":";;;;;AAAA,MAAMA,SAAS;AACb,KAAG,EAAEC,QAAQ,CAAV,EAAaC,UAAU,KAAvB,EAA8BC,QAAQ,GAAtC,EADU;AAEb,KAAG,EAAEF,QAAQ,CAAV,EAAaC,UAAU,KAAvB,EAA8BC,QAAQ,CAAtC,EAFU;AAGb,KAAG,EAAEF,QAAQ,CAAV,EAAaC,UAAU,MAAvB,EAA+BC,QAAQ,CAAvC,EAHU;AAIb,KAAG,EAAEF,QAAQ,CAAV,EAAaC,UAAU,QAAvB,EAAiCC,QAAQ,CAAzC,EAJU;AAKb,KAAG,EAAEF,QAAQ,CAAV,EAAaC,UAAU,MAAvB,EAA+BC,QAAQ,GAAvC,EALU;AAMb,KAAG,EAAEF,QAAQ,CAAV,EAAaC,UAAU,OAAvB,EAAgCC,QAAQ,GAAxC,EANU;AAOb,KAAG,EAAEF,QAAQ,CAAV,EAAaC,UAAU,KAAvB,EAA8BC,QAAQ,GAAtC,EAPU;AAQb,KAAG,EAAEF,QAAQ,CAAV,EAAaC,UAAU,IAAvB,EAA6BC,QAAQ,GAArC,EARU;AASb,KAAG,EAAEF,QAAQ,CAAV,EAAaC,UAAU,IAAvB,EAA6BC,QAAQ,CAArC,EATU;AAUb,MAAI,EAAEF,QAAQ,EAAV,EAAcC,UAAU,MAAxB,EAAgCC,QAAQ,CAAxC,EAVS;AAWb,MAAI,EAAEF,QAAQ,EAAV,EAAcC,UAAU,MAAxB,EAAgCC,QAAQ,CAAxC,EAXS;AAYb,MAAI,EAAEF,QAAQ,EAAV,EAAcC,UAAU,OAAxB,EAAiCC,QAAQ,CAAzC,EAZS;AAab,MAAI,EAAEF,QAAQ,EAAV,EAAcC,UAAU,KAAxB,EAA+BC,QAAQ,GAAvC,EAbS;AAcb,MAAI,EAAEF,QAAQ,EAAV,EAAcC,UAAU,MAAxB,EAAgCC,QAAQ,CAAxC,EAdS;AAeb,MAAI,EAAEF,QAAQ,EAAV,EAAcC,UAAU,KAAxB,EAA+BC,QAAQ,CAAvC,EAfS;AAgBb,MAAI,EAAEF,QAAQ,EAAV,EAAcC,UAAU,OAAxB,EAAiCC,QAAQ,CAAzC,EAhBS;AAiBb,MAAI,EAAEF,QAAQ,EAAV,EAAcC,UAAU,KAAxB,EAA+BC,QAAQ,CAAvC,EAjBS;AAkBb,MAAI,EAAEF,QAAQ,EAAV,EAAcC,UAAU,MAAxB,EAAgCC,QAAQ,CAAxC,EAlBS;AAmBb,MAAI,EAAEF,QAAQ,EAAV,EAAcC,UAAU,KAAxB,EAA+BC,QAAQ,CAAvC,EAnBS;AAoBb,MAAI,EAAEF,QAAQ,EAAV,EAAcC,UAAU,MAAxB,EAAgCC,QAAQ,GAAxC,EApBS;AAqBb,MAAI,EAAEF,QAAQ,EAAV,EAAcC,UAAU,OAAxB,EAAiCC,QAAQ,CAAzC,EArBS;AAsBb,MAAI,EAAEF,QAAQ,EAAV,EAAcC,UAAU,KAAxB,EAA+BC,QAAQ,CAAvC;AAtBS,CAAf;;kBAyBeH,M","file":"factor.es","sourcesContent":["const FACTOR = {\n 1: { api_id: 1, api_name: '海防艦', factor: 0.5 },\n 2: { api_id: 2, api_name: '駆逐艦', factor: 1 },\n 3: { api_id: 3, api_name: '軽巡洋艦', factor: 1 },\n 4: { api_id: 4, api_name: '重雷装巡洋艦', factor: 1 },\n 5: { api_id: 5, api_name: '重巡洋艦', factor: 1.5 },\n 6: { api_id: 6, api_name: '航空巡洋艦', factor: 1.5 },\n 7: { api_id: 7, api_name: '軽空母', factor: 1.5 },\n 8: { api_id: 8, api_name: '戦艦', factor: 1.5 },\n 9: { api_id: 9, api_name: '戦艦', factor: 2 },\n 10: { api_id: 10, api_name: '航空戦艦', factor: 2 },\n 11: { api_id: 11, api_name: '正規空母', factor: 2 },\n 12: { api_id: 12, api_name: '超弩級戦艦', factor: 0 },\n 13: { api_id: 13, api_name: '潜水艦', factor: 0.5 },\n 14: { api_id: 14, api_name: '潜水空母', factor: 1 },\n 15: { api_id: 15, api_name: '補給艦', factor: 1 },\n 16: { api_id: 16, api_name: '水上機母艦', factor: 1 },\n 17: { api_id: 17, api_name: '揚陸艦', factor: 1 },\n 18: { api_id: 18, api_name: '装甲空母', factor: 2 },\n 19: { api_id: 19, api_name: '工作艦', factor: 2 },\n 20: { api_id: 20, api_name: '潜水母艦', factor: 1.5 },\n 21: { api_id: 21, api_name: '練習巡洋艦', factor: 1 },\n 22: { api_id: 22, api_name: '補給艦', factor: 1 },\n}\n\nexport default FACTOR\n"]}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
var _react = require('react');
|
|
8
|
+
|
|
9
|
+
var _react2 = _interopRequireDefault(_react);
|
|
10
|
+
|
|
11
|
+
var _propTypes = require('prop-types');
|
|
12
|
+
|
|
13
|
+
var _propTypes2 = _interopRequireDefault(_propTypes);
|
|
14
|
+
|
|
15
|
+
var _lodash = require('lodash');
|
|
16
|
+
|
|
17
|
+
var _lodash2 = _interopRequireDefault(_lodash);
|
|
18
|
+
|
|
19
|
+
var _reactBootstrap = require('react-bootstrap');
|
|
20
|
+
|
|
21
|
+
var _countupTimer = require('./countup-timer');
|
|
22
|
+
|
|
23
|
+
var _countupTimer2 = _interopRequireDefault(_countupTimer);
|
|
24
|
+
|
|
25
|
+
var _functions = require('./functions');
|
|
26
|
+
|
|
27
|
+
var _shipRow = require('./ship-row');
|
|
28
|
+
|
|
29
|
+
var _shipRow2 = _interopRequireDefault(_shipRow);
|
|
30
|
+
|
|
31
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
32
|
+
|
|
33
|
+
const { i18n } = window;
|
|
34
|
+
const __ = i18n['poi-plugin-anchorage-repair'].__.bind(i18n['poi-plugin-anchorage-repair']);
|
|
35
|
+
|
|
36
|
+
class FleetList extends _react.Component {
|
|
37
|
+
|
|
38
|
+
constructor(props) {
|
|
39
|
+
super(props);
|
|
40
|
+
|
|
41
|
+
this.componentDidMount = () => {
|
|
42
|
+
window.addEventListener('game.response', this.handleResponse);
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
this.componentWillUnmount = () => {
|
|
46
|
+
window.removeEventListener('game.response', this.handleResponse);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
this.handleResponse = e => {
|
|
50
|
+
const { path, postBody } = e.detail;
|
|
51
|
+
const { timeElapsed, lastRefresh } = this.state;
|
|
52
|
+
switch (path) {
|
|
53
|
+
case '/kcsapi/api_port/port':
|
|
54
|
+
if (timeElapsed >= _functions.AKASHI_INTERVAL / 1000 || lastRefresh === 0) {
|
|
55
|
+
this.setState({
|
|
56
|
+
lastRefresh: Date.now(),
|
|
57
|
+
timeElapsed: 0
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
break;
|
|
61
|
+
|
|
62
|
+
case '/kcsapi/api_req_hensei/change':
|
|
63
|
+
{
|
|
64
|
+
const fleetId = parseInt(postBody.api_id, 10);
|
|
65
|
+
const shipId = parseInt(postBody.api_ship_id, 10
|
|
66
|
+
// const shipIndex = parseInt(postBody.api_ship_idx)
|
|
67
|
+
);if (!Number.isNaN(fleetId) && fleetId === this.props.fleet.api_id && shipId >= 0) {
|
|
68
|
+
if (timeElapsed < _functions.AKASHI_INTERVAL / 1000) {
|
|
69
|
+
this.setState({
|
|
70
|
+
lastRefresh: Date.now(),
|
|
71
|
+
timeElapsed: 0
|
|
72
|
+
});
|
|
73
|
+
} else if (shipId < 0) {
|
|
74
|
+
// do nothing
|
|
75
|
+
} else {
|
|
76
|
+
this.setState({ // since it has passed more than 20 minutes, need to refresh the hp
|
|
77
|
+
lastRefresh: 0
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
case '/kcsapi/api_req_nyukyo/start':
|
|
84
|
+
{
|
|
85
|
+
const shipId = parseInt(postBody.api_ship_id, 10);
|
|
86
|
+
const infleet = _lodash2.default.filter(this.props.fleet.shipId, id => shipId === id);
|
|
87
|
+
if (postBody.api_highspeed === 1 && infleet != null) {
|
|
88
|
+
this.setState({ lastRefresh: Date.now() });
|
|
89
|
+
}
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
default:
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
this.tick = timeElapsed => {
|
|
97
|
+
if (timeElapsed % 5 === 0) {
|
|
98
|
+
// limit component refresh rate
|
|
99
|
+
this.setState({ timeElapsed });
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
this.resetTimeElapsed = () => {
|
|
104
|
+
this.setState({ timeElapsed: 0 });
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
this.state = {
|
|
108
|
+
lastRefresh: 0,
|
|
109
|
+
timeElapsed: 0
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
render() {
|
|
114
|
+
const { timeElapsed, lastRefresh } = this.state;
|
|
115
|
+
const { fleet } = this.props;
|
|
116
|
+
|
|
117
|
+
var s1 = ''
|
|
118
|
+
//console.log('can repair:'+fleet.canRepair);
|
|
119
|
+
if(fleet.canRepair==0){
|
|
120
|
+
s1 = __('Not ready');
|
|
121
|
+
}else if(fleet.canRepair==1){
|
|
122
|
+
s1 = __('Repairing')
|
|
123
|
+
}else if(fleet.canRepair==2){
|
|
124
|
+
s1 = '正在喂奶';
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
return _react2.default.createElement(
|
|
128
|
+
_reactBootstrap.Grid,
|
|
129
|
+
null,
|
|
130
|
+
_react2.default.createElement(
|
|
131
|
+
_reactBootstrap.Row,
|
|
132
|
+
{ className: 'info-row' },
|
|
133
|
+
_react2.default.createElement(
|
|
134
|
+
_reactBootstrap.Col,
|
|
135
|
+
{ xs: 4, className: 'info-col' },
|
|
136
|
+
_react2.default.createElement(
|
|
137
|
+
_reactBootstrap.OverlayTrigger,
|
|
138
|
+
{
|
|
139
|
+
placement: 'bottom',
|
|
140
|
+
trigger: fleet.canRepair ? 'click' : ['hover', 'focus'],
|
|
141
|
+
overlay: _react2.default.createElement(
|
|
142
|
+
_reactBootstrap.Tooltip,
|
|
143
|
+
{ id: `anchorage-refresh-notify-${fleet.api_id}` },
|
|
144
|
+
_react2.default.createElement(
|
|
145
|
+
'p',
|
|
146
|
+
null,
|
|
147
|
+
fleet.canRepair ? __('Akashi loves you!') : ''
|
|
148
|
+
),
|
|
149
|
+
_react2.default.createElement(
|
|
150
|
+
'p',
|
|
151
|
+
null,
|
|
152
|
+
fleet.akashiFlagship ? '' : __('Akashi not flagship')
|
|
153
|
+
),
|
|
154
|
+
_react2.default.createElement(
|
|
155
|
+
'p',
|
|
156
|
+
null,
|
|
157
|
+
fleet.inExpedition ? __('fleet in expedition') : ''
|
|
158
|
+
),
|
|
159
|
+
_react2.default.createElement(
|
|
160
|
+
'p',
|
|
161
|
+
null,
|
|
162
|
+
fleet.flagShipInRepair ? __('flagship in dock') : ''
|
|
163
|
+
)
|
|
164
|
+
)
|
|
165
|
+
},
|
|
166
|
+
_react2.default.createElement(
|
|
167
|
+
_reactBootstrap.Label,
|
|
168
|
+
{ bsStyle: fleet.canRepair ? 'success' : 'warning' },
|
|
169
|
+
s1
|
|
170
|
+
)
|
|
171
|
+
)
|
|
172
|
+
),
|
|
173
|
+
_react2.default.createElement(
|
|
174
|
+
_reactBootstrap.Col,
|
|
175
|
+
{ xs: 4, className: 'info-col' },
|
|
176
|
+
_react2.default.createElement(
|
|
177
|
+
_reactBootstrap.Label,
|
|
178
|
+
{ bsStyle: fleet.canRepair ? 'success' : 'warning' },
|
|
179
|
+
_react2.default.createElement(
|
|
180
|
+
'span',
|
|
181
|
+
null,
|
|
182
|
+
__('Elapsed:'),
|
|
183
|
+
' '
|
|
184
|
+
),
|
|
185
|
+
_react2.default.createElement(_countupTimer2.default, {
|
|
186
|
+
countdownId: `akashi-${fleet.api_id}`,
|
|
187
|
+
startTime: this.state.lastRefresh,
|
|
188
|
+
tickCallback: this.tick,
|
|
189
|
+
startCallback: this.resetTimeElapsed
|
|
190
|
+
})
|
|
191
|
+
)
|
|
192
|
+
),
|
|
193
|
+
_react2.default.createElement(
|
|
194
|
+
_reactBootstrap.Col,
|
|
195
|
+
{ xs: 4, className: 'info-col' },
|
|
196
|
+
_react2.default.createElement(
|
|
197
|
+
_reactBootstrap.Label,
|
|
198
|
+
{ bsStyle: fleet.repairCount ? 'success' : 'warning' },
|
|
199
|
+
__('Capacity: %s', fleet.repairCount)
|
|
200
|
+
)
|
|
201
|
+
)
|
|
202
|
+
),
|
|
203
|
+
_react2.default.createElement(
|
|
204
|
+
_reactBootstrap.Row,
|
|
205
|
+
null,
|
|
206
|
+
_react2.default.createElement(
|
|
207
|
+
_reactBootstrap.Col,
|
|
208
|
+
{ xs: 12 },
|
|
209
|
+
_react2.default.createElement(
|
|
210
|
+
_reactBootstrap.Panel,
|
|
211
|
+
{ bsStyle: 'warning', className: lastRefresh === 0 ? '' : 'hidden' },
|
|
212
|
+
__('Please return to HQ screen to make timer refreshed.')
|
|
213
|
+
)
|
|
214
|
+
)
|
|
215
|
+
),
|
|
216
|
+
_react2.default.createElement(
|
|
217
|
+
_reactBootstrap.Row,
|
|
218
|
+
null,
|
|
219
|
+
_react2.default.createElement(
|
|
220
|
+
_reactBootstrap.Col,
|
|
221
|
+
{ xs: 12 },
|
|
222
|
+
_react2.default.createElement(
|
|
223
|
+
_reactBootstrap.Table,
|
|
224
|
+
{ bordered: true, condensed: true },
|
|
225
|
+
_react2.default.createElement(
|
|
226
|
+
'thead',
|
|
227
|
+
null,
|
|
228
|
+
_react2.default.createElement(
|
|
229
|
+
'tr',
|
|
230
|
+
null,
|
|
231
|
+
_react2.default.createElement(
|
|
232
|
+
'th',
|
|
233
|
+
null,
|
|
234
|
+
__('Ship')
|
|
235
|
+
),
|
|
236
|
+
_react2.default.createElement(
|
|
237
|
+
'th',
|
|
238
|
+
null,
|
|
239
|
+
__('HP')
|
|
240
|
+
),
|
|
241
|
+
_react2.default.createElement(
|
|
242
|
+
'th',
|
|
243
|
+
null,
|
|
244
|
+
_react2.default.createElement(
|
|
245
|
+
_reactBootstrap.OverlayTrigger,
|
|
246
|
+
{
|
|
247
|
+
placement: 'top',
|
|
248
|
+
overlay: _react2.default.createElement(
|
|
249
|
+
_reactBootstrap.Tooltip,
|
|
250
|
+
{ id: 'akashi-time-desc' },
|
|
251
|
+
__('Total time required')
|
|
252
|
+
)
|
|
253
|
+
},
|
|
254
|
+
_react2.default.createElement(
|
|
255
|
+
'span',
|
|
256
|
+
null,
|
|
257
|
+
__('Akashi Time')
|
|
258
|
+
)
|
|
259
|
+
)
|
|
260
|
+
),
|
|
261
|
+
_react2.default.createElement(
|
|
262
|
+
'th',
|
|
263
|
+
null,
|
|
264
|
+
_react2.default.createElement(
|
|
265
|
+
_reactBootstrap.OverlayTrigger,
|
|
266
|
+
{
|
|
267
|
+
placement: 'top',
|
|
268
|
+
overlay: _react2.default.createElement(
|
|
269
|
+
_reactBootstrap.Tooltip,
|
|
270
|
+
{ id: 'akashi-time-desc' },
|
|
271
|
+
__('Time required for 1 HP recovery')
|
|
272
|
+
)
|
|
273
|
+
},
|
|
274
|
+
_react2.default.createElement(
|
|
275
|
+
'span',
|
|
276
|
+
null,
|
|
277
|
+
__('Per HP')
|
|
278
|
+
)
|
|
279
|
+
)
|
|
280
|
+
),
|
|
281
|
+
_react2.default.createElement(
|
|
282
|
+
'th',
|
|
283
|
+
null,
|
|
284
|
+
_react2.default.createElement(
|
|
285
|
+
_reactBootstrap.OverlayTrigger,
|
|
286
|
+
{
|
|
287
|
+
placement: 'top',
|
|
288
|
+
overlay: _react2.default.createElement(
|
|
289
|
+
_reactBootstrap.Tooltip,
|
|
290
|
+
{ id: 'akashi-time-desc' },
|
|
291
|
+
__('Estimated HP recovery since last refresh')
|
|
292
|
+
)
|
|
293
|
+
},
|
|
294
|
+
_react2.default.createElement(
|
|
295
|
+
'span',
|
|
296
|
+
null,
|
|
297
|
+
__('Estimated repaired')
|
|
298
|
+
)
|
|
299
|
+
)
|
|
300
|
+
)
|
|
301
|
+
)
|
|
302
|
+
),
|
|
303
|
+
_react2.default.createElement(
|
|
304
|
+
'tbody',
|
|
305
|
+
null,
|
|
306
|
+
_lodash2.default.map(fleet.repairDetail, ship => _react2.default.createElement(_shipRow2.default, {
|
|
307
|
+
key: `anchorage-ship-${ship.api_id}`,
|
|
308
|
+
ship: ship,
|
|
309
|
+
lastRefresh: lastRefresh,
|
|
310
|
+
timeElapsed: timeElapsed,
|
|
311
|
+
canRepair: fleet.canRepair
|
|
312
|
+
}))
|
|
313
|
+
)
|
|
314
|
+
)
|
|
315
|
+
)
|
|
316
|
+
)
|
|
317
|
+
);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
exports.default = FleetList;
|
|
321
|
+
FleetList.propTypes = {
|
|
322
|
+
fleet: _propTypes2.default.object.isRequired
|
|
323
|
+
};
|
|
324
|
+
module.exports = exports['default'];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["fleet-list.es"],"names":["i18n","window","__","bind","FleetList","constructor","props","componentDidMount","addEventListener","handleResponse","componentWillUnmount","removeEventListener","e","path","postBody","detail","timeElapsed","lastRefresh","state","setState","Date","now","fleetId","parseInt","api_id","shipId","api_ship_id","Number","isNaN","fleet","infleet","filter","id","api_highspeed","tick","resetTimeElapsed","render","canRepair","akashiFlagship","inExpedition","flagShipInRepair","repairCount","map","repairDetail","ship","propTypes","object","isRequired"],"mappings":"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","file":"fleet-list.es","sourcesContent":["import React, { Component } from 'react'\nimport PropTypes from 'prop-types'\nimport _ from 'lodash'\nimport { Table, Grid, Row, Col, OverlayTrigger, Tooltip, Label, Panel } from 'react-bootstrap'\n\nimport CountupTimer from './countup-timer'\nimport { AKASHI_INTERVAL } from './functions'\n\nimport ShipRow from './ship-row'\n\nconst { i18n } = window\nconst __ = i18n['poi-plugin-anchorage-repair'].__.bind(i18n['poi-plugin-anchorage-repair'])\n\n\nexport default class FleetList extends Component {\n static propTypes = {\n fleet: PropTypes.object.isRequired,\n }\n\n constructor(props) {\n super(props)\n\n this.state = {\n lastRefresh: 0,\n timeElapsed: 0,\n }\n }\n\n\n componentDidMount= () => {\n window.addEventListener('game.response', this.handleResponse)\n }\n\n componentWillUnmount = () => {\n window.removeEventListener('game.response', this.handleResponse)\n }\n\n\n handleResponse = (e) => {\n const { path, postBody } = e.detail\n const { timeElapsed, lastRefresh } = this.state\n switch (path) {\n case '/kcsapi/api_port/port':\n if (timeElapsed >= (AKASHI_INTERVAL / 1000) || lastRefresh === 0) {\n this.setState({\n lastRefresh: Date.now(),\n timeElapsed: 0,\n })\n }\n break\n\n case '/kcsapi/api_req_hensei/change': {\n const fleetId = parseInt(postBody.api_id, 10)\n const shipId = parseInt(postBody.api_ship_id, 10)\n // const shipIndex = parseInt(postBody.api_ship_idx)\n if (!Number.isNaN(fleetId)\n && fleetId === this.props.fleet.api_id\n && shipId >= 0) {\n if (timeElapsed < (AKASHI_INTERVAL / 1000)) {\n this.setState({\n lastRefresh: Date.now(),\n timeElapsed: 0,\n })\n } else if (shipId < 0) {\n // do nothing\n } else {\n this.setState({ // since it has passed more than 20 minutes, need to refresh the hp\n lastRefresh: 0,\n })\n }\n }\n break\n }\n case '/kcsapi/api_req_nyukyo/start': {\n const shipId = parseInt(postBody.api_ship_id, 10)\n const infleet = _.filter(this.props.fleet.shipId, id => shipId === id)\n if (postBody.api_highspeed === 1 && infleet != null) {\n this.setState({ lastRefresh: Date.now() })\n }\n break\n }\n default:\n }\n }\n\n tick = (timeElapsed) => {\n if (timeElapsed % 5 === 0) { // limit component refresh rate\n this.setState({ timeElapsed })\n }\n }\n\n resetTimeElapsed = () => {\n this.setState({ timeElapsed: 0 })\n }\n\n render() {\n const { timeElapsed, lastRefresh } = this.state\n const { fleet } = this.props\n\n return (\n <Grid>\n <Row className=\"info-row\">\n <Col xs={4} className=\"info-col\">\n <OverlayTrigger\n placement=\"bottom\"\n trigger={fleet.canRepair ? 'click' : ['hover', 'focus']}\n overlay={\n <Tooltip id={`anchorage-refresh-notify-${fleet.api_id}`}>\n <p>{fleet.canRepair ? __('Akashi loves you!') : '' }</p>\n <p>{fleet.akashiFlagship ? '' : __('Akashi not flagship')}</p>\n <p>{fleet.inExpedition ? __('fleet in expedition') : ''}</p>\n <p>{fleet.flagShipInRepair ? __('flagship in dock') : ''}</p>\n </Tooltip>\n }\n >\n <Label bsStyle={fleet.canRepair ? 'success' : 'warning'}>\n {fleet.canRepair ? __('Repairing') : __('Not ready')}\n </Label>\n </OverlayTrigger>\n </Col>\n <Col xs={4} className=\"info-col\">\n {\n <Label bsStyle={fleet.canRepair ? 'success' : 'warning'}>\n <span>{__('Elapsed:')} </span>\n <CountupTimer\n countdownId={`akashi-${fleet.api_id}`}\n startTime={this.state.lastRefresh}\n tickCallback={this.tick}\n startCallback={this.resetTimeElapsed}\n />\n </Label>\n\n }\n </Col>\n <Col xs={4} className=\"info-col\">\n <Label bsStyle={fleet.repairCount ? 'success' : 'warning'}>{__('Capacity: %s', fleet.repairCount)}</Label>\n </Col>\n </Row>\n <Row>\n <Col xs={12}>\n <Panel bsStyle=\"warning\" className={lastRefresh === 0 ? '' : 'hidden'}>\n {__('Please return to HQ screen to make timer refreshed.')}\n </Panel>\n </Col>\n </Row>\n <Row>\n <Col xs={12}>\n <Table bordered condensed>\n <thead>\n <tr>\n <th>{__('Ship')}</th>\n <th>{__('HP')}</th>\n <th>\n <OverlayTrigger\n placement=\"top\"\n overlay={\n <Tooltip id={'akashi-time-desc'}>\n {__('Total time required')}\n </Tooltip>\n }\n >\n <span>{__('Akashi Time')}</span>\n </OverlayTrigger >\n </th>\n <th>\n <OverlayTrigger\n placement=\"top\"\n overlay={\n <Tooltip id={'akashi-time-desc'}>\n {__('Time required for 1 HP recovery')}\n </Tooltip>\n }\n >\n <span>{__('Per HP')}</span>\n </OverlayTrigger >\n </th>\n <th>\n <OverlayTrigger\n placement=\"top\"\n overlay={\n <Tooltip id={'akashi-time-desc'}>\n {__('Estimated HP recovery since last refresh')}\n </Tooltip>\n }\n >\n <span>{__('Estimated repaired')}</span>\n </OverlayTrigger >\n </th>\n </tr>\n </thead>\n <tbody>\n {\n _.map(fleet.repairDetail, ship => (\n <ShipRow\n key={`anchorage-ship-${ship.api_id}`}\n ship={ship}\n lastRefresh={lastRefresh}\n timeElapsed={timeElapsed}\n canRepair={fleet.canRepair}\n />))\n }\n </tbody>\n </Table>\n </Col>\n </Row>\n </Grid>\n )\n }\n}\n"]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getCountdownLabelStyle = exports.getHPLabelStyle = exports.repairEstimate = exports.getTimePerHP = exports.timePerHPCalc = exports.akashiEstimate = exports.AKASHI_INTERVAL = undefined;
|
|
7
|
+
|
|
8
|
+
var _factor = require('./factor');
|
|
9
|
+
|
|
10
|
+
var _factor2 = _interopRequireDefault(_factor);
|
|
11
|
+
|
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
+
|
|
14
|
+
const AKASHI_INTERVAL = exports.AKASHI_INTERVAL = 20 * 60 * 1000; // minimum time required, in ms
|
|
15
|
+
const DOCKING_OFFSET = 30 * 1000; // offset in docking time formula
|
|
16
|
+
const MINOR_PERCENT = 0.5; // minor damage determination
|
|
17
|
+
|
|
18
|
+
const minuteCeil = time => {
|
|
19
|
+
const minute = 60 * 1000;
|
|
20
|
+
|
|
21
|
+
return Math.ceil(time / minute) * minute;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// estimate the time needed in anchorage repair
|
|
25
|
+
const akashiEstimate = exports.akashiEstimate = ({ api_nowhp, api_maxhp, api_ndock_time }) => {
|
|
26
|
+
if (api_ndock_time === 0 || api_nowhp >= api_maxhp) return 0;
|
|
27
|
+
|
|
28
|
+
if (api_nowhp <= api_maxhp * MINOR_PERCENT) return 0; // damage check
|
|
29
|
+
|
|
30
|
+
if (api_maxhp - api_nowhp === 1) return AKASHI_INTERVAL; // if only 1 hp to repair
|
|
31
|
+
|
|
32
|
+
return Math.max(minuteCeil(api_ndock_time - DOCKING_OFFSET), AKASHI_INTERVAL);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const timePerHPCalc = exports.timePerHPCalc = ({ api_nowhp, api_maxhp, api_ndock_time }) => api_nowhp < api_maxhp && api_nowhp >= api_maxhp * MINOR_PERCENT ? (api_ndock_time - DOCKING_OFFSET) / (api_maxhp - api_nowhp) : 0;
|
|
36
|
+
|
|
37
|
+
// alternative way for timePerHP
|
|
38
|
+
const getTimePerHP = exports.getTimePerHP = (api_lv = 1, api_stype = 1) => {
|
|
39
|
+
let factor;
|
|
40
|
+
if (_factor2.default[api_stype] != null) factor = _factor2.default[api_stype].factor || 0;
|
|
41
|
+
|
|
42
|
+
if (factor === 0) return 0;
|
|
43
|
+
|
|
44
|
+
if (api_lv < 12) {
|
|
45
|
+
return api_lv * 10 * factor * 1000;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return (api_lv * 5 + (Math.floor(Math.sqrt(api_lv - 11)) * 10 + 50)) * factor * 1000;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const repairEstimate = exports.repairEstimate = ({ api_nowhp, api_maxhp, timePerHP }, timeElapsed = 0, availableSRF = false) => {
|
|
52
|
+
// timeElapsed is in seconds
|
|
53
|
+
if (api_nowhp >= api_maxhp || timePerHP === 0 || !availableSRF) return 0;
|
|
54
|
+
|
|
55
|
+
if (timeElapsed * 1000 < AKASHI_INTERVAL) {
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return Math.min(Math.max(Math.floor(timeElapsed * 1000 / timePerHP), 1), api_maxhp - api_nowhp);
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const getHPLabelStyle = exports.getHPLabelStyle = (nowhp, maxhp, availableSRF = true, inRepair = false) => {
|
|
63
|
+
const percentage = nowhp / maxhp;
|
|
64
|
+
if (!availableSRF) {
|
|
65
|
+
return 'warning';
|
|
66
|
+
}
|
|
67
|
+
switch (true) {
|
|
68
|
+
case percentage >= 1 || inRepair:
|
|
69
|
+
return 'success';
|
|
70
|
+
case percentage >= MINOR_PERCENT:
|
|
71
|
+
return 'primary';
|
|
72
|
+
case percentage < MINOR_PERCENT:
|
|
73
|
+
return 'warning';
|
|
74
|
+
default:
|
|
75
|
+
return 'warning';
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const getCountdownLabelStyle = exports.getCountdownLabelStyle = (props, timeRemaining) => {
|
|
80
|
+
switch (true) {
|
|
81
|
+
case timeRemaining > 600:
|
|
82
|
+
return 'primary';
|
|
83
|
+
case timeRemaining > 60:
|
|
84
|
+
return 'warning';
|
|
85
|
+
case timeRemaining >= 0:
|
|
86
|
+
return 'success';
|
|
87
|
+
default:
|
|
88
|
+
return 'default';
|
|
89
|
+
}
|
|
90
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["functions.es"],"names":["AKASHI_INTERVAL","DOCKING_OFFSET","MINOR_PERCENT","minuteCeil","time","minute","Math","ceil","akashiEstimate","api_nowhp","api_maxhp","api_ndock_time","max","timePerHPCalc","getTimePerHP","api_lv","api_stype","factor","floor","sqrt","repairEstimate","timePerHP","timeElapsed","availableSRF","min","getHPLabelStyle","nowhp","maxhp","inRepair","percentage","getCountdownLabelStyle","props","timeRemaining"],"mappings":";;;;;;;AAAA;;;;;;AAEO,MAAMA,4CAAkB,KAAK,EAAL,GAAU,IAAlC,C,CAAuC;AAC9C,MAAMC,iBAAiB,KAAK,IAA5B,C,CAAiC;AACjC,MAAMC,gBAAgB,GAAtB,C,CAA0B;;AAE1B,MAAMC,aAAcC,IAAD,IAAU;AAC3B,QAAMC,SAAS,KAAK,IAApB;;AAEA,SAAOC,KAAKC,IAAL,CAAUH,OAAOC,MAAjB,IAA2BA,MAAlC;AACD,CAJD;;AAMA;AACO,MAAMG,0CAAiB,CAAC,EAAEC,SAAF,EAAaC,SAAb,EAAwBC,cAAxB,EAAD,KAA8C;AAC1E,MAAIA,mBAAmB,CAAnB,IAAwBF,aAAaC,SAAzC,EAAoD,OAAO,CAAP;;AAEpD,MAAID,aAAaC,YAAYR,aAA7B,EAA4C,OAAO,CAAP,CAH8B,CAGrB;;AAErD,MAAIQ,YAAYD,SAAZ,KAA0B,CAA9B,EAAiC,OAAOT,eAAP,CALyC,CAKlB;;AAExD,SAAOM,KAAKM,GAAL,CAAST,WAAWQ,iBAAiBV,cAA5B,CAAT,EAAsDD,eAAtD,CAAP;AACD,CARM;;AAUA,MAAMa,wCAAgB,CAAC,EAAEJ,SAAF,EAAaC,SAAb,EAAwBC,cAAxB,EAAD,KAC1BF,YAAYC,SAAZ,IAAyBD,aAAaC,YAAYR,aAAnD,GACG,CAACS,iBAAiBV,cAAlB,KAAqCS,YAAYD,SAAjD,CADH,GAEE,CAHG;;AAKP;AACO,MAAMK,sCAAe,CAACC,SAAS,CAAV,EAAaC,YAAY,CAAzB,KAA+B;AACzD,MAAIC,MAAJ;AACA,MAAI,iBAAOD,SAAP,KAAqB,IAAzB,EAA+BC,SAAS,iBAAOD,SAAP,EAAkBC,MAAlB,IAA4B,CAArC;;AAE/B,MAAIA,WAAW,CAAf,EAAkB,OAAO,CAAP;;AAElB,MAAIF,SAAS,EAAb,EAAiB;AACf,WAAOA,SAAS,EAAT,GAAcE,MAAd,GAAuB,IAA9B;AACD;;AAED,SAAO,CAAEF,SAAS,CAAV,IAAiBT,KAAKY,KAAL,CAAWZ,KAAKa,IAAL,CAAUJ,SAAS,EAAnB,CAAX,IAAqC,EAAtC,GAA4C,EAA5D,CAAD,IAAoEE,MAApE,GAA6E,IAApF;AACD,CAXM;;AAaA,MAAMG,0CACb,CAAC,EAAEX,SAAF,EAAaC,SAAb,EAAwBW,SAAxB,EAAD,EAAsCC,cAAc,CAApD,EAAuDC,eAAe,KAAtE,KAAgF;AAC9E;AACA,MAAId,aAAaC,SAAb,IAA0BW,cAAc,CAAxC,IAA6C,CAACE,YAAlD,EAAgE,OAAO,CAAP;;AAEhE,MAAID,cAAc,IAAd,GAAqBtB,eAAzB,EAA0C;AACxC,WAAO,CAAP;AACD;;AAED,SAAOM,KAAKkB,GAAL,CAASlB,KAAKM,GAAL,CAASN,KAAKY,KAAL,CAAYI,cAAc,IAAf,GAAuBD,SAAlC,CAAT,EAAuD,CAAvD,CAAT,EAAoEX,YAAYD,SAAhF,CAAP;AACD,CAVM;;AAYA,MAAMgB,4CAAkB,CAACC,KAAD,EAAQC,KAAR,EAAeJ,eAAe,IAA9B,EAAoCK,WAAW,KAA/C,KAAyD;AACtF,QAAMC,aAAaH,QAAQC,KAA3B;AACA,MAAI,CAACJ,YAAL,EAAmB;AACjB,WAAO,SAAP;AACD;AACD,UAAQ,IAAR;AACE,SAAMM,cAAc,CAAd,IAAmBD,QAAzB;AACE,aAAO,SAAP;AACF,SAAMC,cAAc3B,aAApB;AACE,aAAO,SAAP;AACF,SAAM2B,aAAa3B,aAAnB;AACE,aAAO,SAAP;AACF;AACE,aAAO,SAAP;AARJ;AAUD,CAfM;;AAiBA,MAAM4B,0DAAyB,CAACC,KAAD,EAAQC,aAAR,KAA0B;AAC9D,UAAQ,IAAR;AACE,SAAMA,gBAAgB,GAAtB;AACE,aAAO,SAAP;AACF,SAAMA,gBAAgB,EAAtB;AACE,aAAO,SAAP;AACF,SAAMA,iBAAiB,CAAvB;AACE,aAAO,SAAP;AACF;AACE,aAAO,SAAP;AARJ;AAUD,CAXM","file":"functions.es","sourcesContent":["import FACTOR from './factor'\n\nexport const AKASHI_INTERVAL = 20 * 60 * 1000 // minimum time required, in ms\nconst DOCKING_OFFSET = 30 * 1000 // offset in docking time formula\nconst MINOR_PERCENT = 0.5 // minor damage determination\n\nconst minuteCeil = (time) => {\n const minute = 60 * 1000\n\n return Math.ceil(time / minute) * minute\n}\n\n// estimate the time needed in anchorage repair\nexport const akashiEstimate = ({ api_nowhp, api_maxhp, api_ndock_time }) => {\n if (api_ndock_time === 0 || api_nowhp >= api_maxhp) return 0\n\n if (api_nowhp <= api_maxhp * MINOR_PERCENT) return 0 // damage check\n\n if (api_maxhp - api_nowhp === 1) return AKASHI_INTERVAL // if only 1 hp to repair\n\n return Math.max(minuteCeil(api_ndock_time - DOCKING_OFFSET), AKASHI_INTERVAL)\n}\n\nexport const timePerHPCalc = ({ api_nowhp, api_maxhp, api_ndock_time }) =>\n (api_nowhp < api_maxhp && api_nowhp >= api_maxhp * MINOR_PERCENT)\n ? ((api_ndock_time - DOCKING_OFFSET) / (api_maxhp - api_nowhp))\n : 0\n\n// alternative way for timePerHP\nexport const getTimePerHP = (api_lv = 1, api_stype = 1) => {\n let factor\n if (FACTOR[api_stype] != null) factor = FACTOR[api_stype].factor || 0\n\n if (factor === 0) return 0\n\n if (api_lv < 12) {\n return api_lv * 10 * factor * 1000\n }\n\n return ((api_lv * 5) + ((Math.floor(Math.sqrt(api_lv - 11)) * 10) + 50)) * factor * 1000\n}\n\nexport const repairEstimate =\n({ api_nowhp, api_maxhp, timePerHP }, timeElapsed = 0, availableSRF = false) => {\n // timeElapsed is in seconds\n if (api_nowhp >= api_maxhp || timePerHP === 0 || !availableSRF) return 0\n\n if (timeElapsed * 1000 < AKASHI_INTERVAL) {\n return 0\n }\n\n return Math.min(Math.max(Math.floor((timeElapsed * 1000) / timePerHP), 1), api_maxhp - api_nowhp)\n}\n\nexport const getHPLabelStyle = (nowhp, maxhp, availableSRF = true, inRepair = false) => {\n const percentage = nowhp / maxhp\n if (!availableSRF) {\n return 'warning'\n }\n switch (true) {\n case (percentage >= 1 || inRepair):\n return 'success'\n case (percentage >= MINOR_PERCENT):\n return 'primary'\n case (percentage < MINOR_PERCENT):\n return 'warning'\n default:\n return 'warning'\n }\n}\n\nexport const getCountdownLabelStyle = (props, timeRemaining) => {\n switch (true) {\n case (timeRemaining > 600):\n return 'primary'\n case (timeRemaining > 60):\n return 'warning'\n case (timeRemaining >= 0):\n return 'success'\n default:\n return 'default'\n }\n}\n"]}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
|
|
7
|
+
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
|
8
|
+
|
|
9
|
+
var _class, _temp;
|
|
10
|
+
// import { createSelector } from 'reselect'
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
var _react = require('react');
|
|
14
|
+
|
|
15
|
+
var _react2 = _interopRequireDefault(_react);
|
|
16
|
+
|
|
17
|
+
var _propTypes = require('prop-types');
|
|
18
|
+
|
|
19
|
+
var _propTypes2 = _interopRequireDefault(_propTypes);
|
|
20
|
+
|
|
21
|
+
var _reactRedux = require('react-redux');
|
|
22
|
+
|
|
23
|
+
var _lodash = require('lodash');
|
|
24
|
+
|
|
25
|
+
var _lodash2 = _interopRequireDefault(_lodash);
|
|
26
|
+
|
|
27
|
+
var _path = require('path');
|
|
28
|
+
|
|
29
|
+
var _reactBootstrap = require('react-bootstrap');
|
|
30
|
+
|
|
31
|
+
var _reactFontawesome = require('react-fontawesome');
|
|
32
|
+
|
|
33
|
+
var _reactFontawesome2 = _interopRequireDefault(_reactFontawesome);
|
|
34
|
+
|
|
35
|
+
var _tools = require('views/utils/tools');
|
|
36
|
+
|
|
37
|
+
var _countdownTimer = require('views/components/main/parts/countdown-timer');
|
|
38
|
+
|
|
39
|
+
var _functions = require('./functions');
|
|
40
|
+
|
|
41
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
42
|
+
|
|
43
|
+
// const constShipsSelector = createSelector(
|
|
44
|
+
// constSelector,
|
|
45
|
+
// (_const) => _.keyBy(_const.$ships, 'api_id')
|
|
46
|
+
// )
|
|
47
|
+
|
|
48
|
+
const { ROOT, i18n } = window;
|
|
49
|
+
const __ = i18n['poi-plugin-anchorage-repair'].__.bind(i18n['poi-plugin-anchorage-repair']);
|
|
50
|
+
|
|
51
|
+
const ShipRow = (0, _reactRedux.connect)(state => {
|
|
52
|
+
const canNotify = state.misc.canNotify;
|
|
53
|
+
return {
|
|
54
|
+
canNotify
|
|
55
|
+
};
|
|
56
|
+
})((_temp = _class = class ShipRowClass extends _react.Component {
|
|
57
|
+
|
|
58
|
+
render() {
|
|
59
|
+
const { timeElapsed, lastRefresh, canRepair, ship, canNotify } = this.props;
|
|
60
|
+
const { api_nowhp, api_maxhp, availableSRF, estimate, timePerHP,
|
|
61
|
+
api_id, api_lv, inRepair, api_name ,api_cond} = ship;
|
|
62
|
+
//console.log(ship)
|
|
63
|
+
const completeTime = lastRefresh + estimate;
|
|
64
|
+
|
|
65
|
+
return _react2.default.createElement(
|
|
66
|
+
'tr',
|
|
67
|
+
null,
|
|
68
|
+
_react2.default.createElement(
|
|
69
|
+
'td',
|
|
70
|
+
null,
|
|
71
|
+
i18n.resources.__(api_name),
|
|
72
|
+
_react2.default.createElement(
|
|
73
|
+
'span',
|
|
74
|
+
{ className: 'lv-label' },
|
|
75
|
+
'Lv.',
|
|
76
|
+
api_lv
|
|
77
|
+
)
|
|
78
|
+
),
|
|
79
|
+
_react2.default.createElement(
|
|
80
|
+
'td',
|
|
81
|
+
null,
|
|
82
|
+
_react2.default.createElement(
|
|
83
|
+
_reactBootstrap.Label,
|
|
84
|
+
{ bsStyle: (0, _functions.getHPLabelStyle)(api_nowhp, api_maxhp, availableSRF, inRepair) },
|
|
85
|
+
`${api_nowhp} / ${api_maxhp}`
|
|
86
|
+
),
|
|
87
|
+
_react2.default.createElement(
|
|
88
|
+
'span',
|
|
89
|
+
null,
|
|
90
|
+
'🙂',
|
|
91
|
+
49
|
|
92
|
+
)
|
|
93
|
+
),
|
|
94
|
+
_react2.default.createElement(
|
|
95
|
+
'td',
|
|
96
|
+
null,
|
|
97
|
+
estimate > 0 && canRepair && availableSRF && (!inRepair ? _react2.default.createElement(_countdownTimer.CountdownNotifierLabel, {
|
|
98
|
+
timerKey: `anchorage-ship-${api_id}`,
|
|
99
|
+
completeTime: completeTime,
|
|
100
|
+
getLabelStyle: _functions.getCountdownLabelStyle,
|
|
101
|
+
getNotifyOptions: () => canNotify && lastRefresh > 0 && _extends({}, this.constructor.basicNotifyConfig, {
|
|
102
|
+
completeTime,
|
|
103
|
+
args: i18n.resources.__(api_name)
|
|
104
|
+
})
|
|
105
|
+
}) : inRepair ? _react2.default.createElement(
|
|
106
|
+
_reactBootstrap.Label,
|
|
107
|
+
{ bsStyle: 'success' },
|
|
108
|
+
_react2.default.createElement(_reactFontawesome2.default, { name: 'wrench' }),
|
|
109
|
+
' ',
|
|
110
|
+
__('Docking')
|
|
111
|
+
) : '')
|
|
112
|
+
),
|
|
113
|
+
_react2.default.createElement(
|
|
114
|
+
'td',
|
|
115
|
+
null,
|
|
116
|
+
timePerHP ? (0, _tools.resolveTime)(timePerHP / 1000) : ''
|
|
117
|
+
),
|
|
118
|
+
_react2.default.createElement(
|
|
119
|
+
'td',
|
|
120
|
+
null,
|
|
121
|
+
canRepair && api_nowhp !== api_maxhp && !inRepair && (0, _functions.repairEstimate)(ship, timeElapsed, availableSRF)
|
|
122
|
+
)
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
}, _class.basicNotifyConfig = {
|
|
126
|
+
type: 'repair',
|
|
127
|
+
title: __('Anchorage repair'),
|
|
128
|
+
message: names => `${_lodash2.default.join(names, ', ')} ${__('anchorage repair completed')}`,
|
|
129
|
+
icon: (0, _path.join)(ROOT, 'assets', 'img', 'operation', 'repair.png'),
|
|
130
|
+
preemptTime: 0,
|
|
131
|
+
groupKey: 'plugin-anchorage-repair'
|
|
132
|
+
}, _class.propTypes = {
|
|
133
|
+
canNotify: _propTypes2.default.bool.isRequired,
|
|
134
|
+
timeElapsed: _propTypes2.default.number.isRequired,
|
|
135
|
+
lastRefresh: _propTypes2.default.number.isRequired,
|
|
136
|
+
ship: _propTypes2.default.object.isRequired,
|
|
137
|
+
canRepair: _propTypes2.default.bool.isRequired
|
|
138
|
+
}, _temp));
|
|
139
|
+
|
|
140
|
+
exports.default = ShipRow;
|
|
141
|
+
module.exports = exports['default'];
|