playball 2.2.2 → 3.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.
Files changed (74) hide show
  1. package/.eslintrc.json +2 -2
  2. package/README.md +18 -4
  3. package/demo.cast +95 -0
  4. package/demo.gif +0 -0
  5. package/dist/components/AllPlays.js +94 -93
  6. package/dist/components/App.js +45 -117
  7. package/dist/components/AtBat.js +44 -43
  8. package/dist/components/Bases.js +17 -26
  9. package/dist/components/Count.js +15 -26
  10. package/dist/components/FinishedGame.js +51 -66
  11. package/dist/components/Game.js +51 -114
  12. package/dist/components/GameList.js +161 -135
  13. package/dist/components/Grid.js +115 -0
  14. package/dist/components/HelpBar.js +13 -6
  15. package/dist/components/InningDisplay.js +26 -0
  16. package/dist/components/LineScore.js +32 -90
  17. package/dist/components/LiveGame.js +24 -19
  18. package/dist/components/LoadingSpinner.js +34 -125
  19. package/dist/components/Matchup.js +38 -59
  20. package/dist/components/PreviewGame.js +34 -55
  21. package/dist/components/Standings.js +91 -0
  22. package/dist/features/games.js +135 -0
  23. package/dist/features/keys.js +63 -0
  24. package/dist/features/schedule.js +58 -0
  25. package/dist/features/standings.js +57 -0
  26. package/dist/hooks/useKey.js +23 -0
  27. package/dist/logger.js +8 -10
  28. package/dist/main.js +13 -23
  29. package/dist/screen.js +22 -0
  30. package/dist/store/index.js +21 -7
  31. package/dist/style/index.js +3 -3
  32. package/package.json +44 -26
  33. package/src/components/AllPlays.jsx +95 -63
  34. package/src/components/App.jsx +38 -66
  35. package/src/components/AtBat.jsx +34 -36
  36. package/src/components/Bases.jsx +8 -13
  37. package/src/components/Count.jsx +10 -15
  38. package/src/components/FinishedGame.jsx +29 -40
  39. package/src/components/Game.jsx +48 -65
  40. package/src/components/GameList.jsx +125 -81
  41. package/src/components/Grid.jsx +91 -0
  42. package/src/components/HelpBar.jsx +14 -9
  43. package/src/components/InningDisplay.jsx +19 -0
  44. package/src/components/LineScore.jsx +27 -33
  45. package/src/components/LiveGame.jsx +7 -3
  46. package/src/components/LoadingSpinner.jsx +26 -60
  47. package/src/components/Matchup.jsx +26 -39
  48. package/src/components/PreviewGame.jsx +22 -37
  49. package/src/components/Standings.jsx +78 -0
  50. package/src/features/games.js +165 -0
  51. package/src/features/keys.js +38 -0
  52. package/src/features/schedule.js +59 -0
  53. package/src/features/standings.js +60 -0
  54. package/src/hooks/useKey.js +13 -0
  55. package/src/main.js +7 -14
  56. package/src/screen.js +14 -0
  57. package/src/store/index.js +16 -7
  58. package/src/style/index.js +1 -1
  59. package/dist/actions/game.js +0 -36
  60. package/dist/actions/schedule.js +0 -33
  61. package/dist/actions/types.js +0 -16
  62. package/dist/reducers/game.js +0 -70
  63. package/dist/reducers/index.js +0 -21
  64. package/dist/reducers/schedule.js +0 -35
  65. package/dist/selectors/game.js +0 -82
  66. package/dist/selectors/schedule.js +0 -25
  67. package/src/actions/game.js +0 -25
  68. package/src/actions/schedule.js +0 -21
  69. package/src/actions/types.js +0 -5
  70. package/src/reducers/game.js +0 -56
  71. package/src/reducers/index.js +0 -9
  72. package/src/reducers/schedule.js +0 -28
  73. package/src/selectors/game.js +0 -93
  74. package/src/selectors/schedule.js +0 -18
@@ -3,95 +3,74 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports["default"] = void 0;
6
+ exports.default = void 0;
7
7
 
8
8
  var _react = _interopRequireDefault(require("react"));
9
9
 
10
- var _propTypes = _interopRequireDefault(require("prop-types"));
10
+ var _alternateRenderers = require("react-redux/lib/alternate-renderers");
11
11
 
12
- var _reactRedux = require("react-redux");
12
+ var _dateFns = require("date-fns");
13
13
 
14
- var _moment = _interopRequireDefault(require("moment"));
14
+ var _games = require("../features/games");
15
15
 
16
- var _game = require("../selectors/game");
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
17
 
18
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
19
-
20
- var formatPitcherName = function formatPitcherName(pitcher) {
21
- var display = pitcher.getIn(['person', 'fullName']);
22
- var number = pitcher.get('jerseyNumber');
18
+ const formatPitcherName = pitcher => {
19
+ let display = pitcher.person.fullName;
20
+ const number = pitcher.jerseyNumber;
23
21
 
24
22
  if (number) {
25
- display += ", #".concat(number);
23
+ display += `, #${number}`;
26
24
  }
27
25
 
28
26
  return display;
29
27
  };
30
28
 
31
- var formatTeam = function formatTeam(teams, probables, boxscore, homeAway) {
32
- var pitcherId = probables.getIn([homeAway, 'id']);
33
- var pitcher = boxscore.getIn([homeAway, 'players', 'ID' + pitcherId]);
34
- var lines = [teams.getIn([homeAway, 'teamName']), "(".concat(teams.getIn([homeAway, 'record', 'wins']), "-").concat(teams.getIn([homeAway, 'record', 'losses']), ")")];
29
+ const formatTeam = (teams, probables, boxscore, homeAway) => {
30
+ const pitcherId = probables[homeAway].id;
31
+ const pitcher = boxscore[homeAway].players['ID' + pitcherId];
32
+ let lines = [teams[homeAway].teamName, `(${teams[homeAway].record.wins}-${teams[homeAway].record.losses})`];
35
33
 
36
34
  if (pitcher) {
37
- lines = lines.concat(['', formatPitcherName(pitcher), "".concat(pitcher.getIn(['seasonStats', 'pitching', 'wins']), "-").concat(pitcher.getIn(['seasonStats', 'pitching', 'losses'])), "".concat(pitcher.getIn(['seasonStats', 'pitching', 'era']), " ERA ").concat(pitcher.getIn(['seasonStats', 'pitching', 'strikeOuts']), " K")]);
35
+ var _pitcher$seasonStats, _pitcher$seasonStats$, _pitcher$seasonStats2, _pitcher$seasonStats3, _pitcher$seasonStats4, _pitcher$seasonStats5, _pitcher$seasonStats6, _pitcher$seasonStats7;
36
+
37
+ lines = lines.concat(['', formatPitcherName(pitcher), `${(_pitcher$seasonStats = pitcher.seasonStats) === null || _pitcher$seasonStats === void 0 ? void 0 : (_pitcher$seasonStats$ = _pitcher$seasonStats.pitching) === null || _pitcher$seasonStats$ === void 0 ? void 0 : _pitcher$seasonStats$.wins}-${(_pitcher$seasonStats2 = pitcher.seasonStats) === null || _pitcher$seasonStats2 === void 0 ? void 0 : (_pitcher$seasonStats3 = _pitcher$seasonStats2.pitching) === null || _pitcher$seasonStats3 === void 0 ? void 0 : _pitcher$seasonStats3.losses}`, `${(_pitcher$seasonStats4 = pitcher.seasonStats) === null || _pitcher$seasonStats4 === void 0 ? void 0 : (_pitcher$seasonStats5 = _pitcher$seasonStats4.pitching) === null || _pitcher$seasonStats5 === void 0 ? void 0 : _pitcher$seasonStats5.era} ERA ${(_pitcher$seasonStats6 = pitcher.seasonStats) === null || _pitcher$seasonStats6 === void 0 ? void 0 : (_pitcher$seasonStats7 = _pitcher$seasonStats6.pitching) === null || _pitcher$seasonStats7 === void 0 ? void 0 : _pitcher$seasonStats7.strikeOuts} K`]);
38
38
  }
39
39
 
40
40
  return lines;
41
41
  };
42
42
 
43
- var PreviewGame = function PreviewGame(_ref) {
44
- var boxscore = _ref.boxscore,
45
- probables = _ref.probables,
46
- startTime = _ref.startTime,
47
- status = _ref.status,
48
- teams = _ref.teams,
49
- venue = _ref.venue;
50
- var away = formatTeam(teams, probables, boxscore, 'away');
51
- var home = formatTeam(teams, probables, boxscore, 'home');
52
- var formattedStart = status.get('startTimeTBD') ? 'Start time TBD' : (0, _moment["default"])(startTime).format('LLL');
53
- return /*#__PURE__*/_react["default"].createElement("element", null, /*#__PURE__*/_react["default"].createElement("element", {
43
+ function PreviewGame() {
44
+ const boxscore = (0, _alternateRenderers.useSelector)(_games.selectBoxscore);
45
+ const probables = (0, _alternateRenderers.useSelector)(_games.selectProbablePitchers);
46
+ const startTime = (0, _alternateRenderers.useSelector)(_games.selectStartTime);
47
+ const status = (0, _alternateRenderers.useSelector)(_games.selectGameStatus);
48
+ const teams = (0, _alternateRenderers.useSelector)(_games.selectTeams);
49
+ const venue = (0, _alternateRenderers.useSelector)(_games.selectVenue);
50
+ const away = formatTeam(teams, probables, boxscore, 'away');
51
+ const home = formatTeam(teams, probables, boxscore, 'home');
52
+ const formattedStart = status.startTimeTBD ? 'Start time TBD' : (0, _dateFns.format)(new Date(startTime), 'MMMM d, yyy p');
53
+ return /*#__PURE__*/_react.default.createElement("element", null, /*#__PURE__*/_react.default.createElement("element", {
54
54
  height: "60%"
55
- }, /*#__PURE__*/_react["default"].createElement("box", {
55
+ }, /*#__PURE__*/_react.default.createElement("box", {
56
56
  content: away.join('\n'),
57
57
  width: "33%-1",
58
58
  top: "50%",
59
59
  align: "center"
60
- }), /*#__PURE__*/_react["default"].createElement("box", {
61
- content: "\nvs.\n\n".concat(formattedStart, "\n").concat(venue.get('name'), "\n").concat(venue.getIn(['location', 'city']), ", ").concat(venue.getIn(['location', 'stateAbbrev'])),
60
+ }), /*#__PURE__*/_react.default.createElement("box", {
61
+ content: `\nvs.\n\n${formattedStart}\n${venue.name}\n${venue.location.city}, ${venue.location.stateAbbrev}`,
62
62
  width: "33%-1",
63
63
  left: "33%",
64
64
  top: "50%",
65
65
  align: "center"
66
- }), /*#__PURE__*/_react["default"].createElement("box", {
66
+ }), /*#__PURE__*/_react.default.createElement("box", {
67
67
  content: home.join('\n'),
68
68
  width: "34%",
69
69
  top: "50%",
70
70
  left: "66%",
71
71
  align: "center"
72
72
  })));
73
- };
74
-
75
- PreviewGame.propTypes = {
76
- boxscore: _propTypes["default"].object,
77
- probables: _propTypes["default"].object,
78
- startTime: _propTypes["default"].string,
79
- status: _propTypes["default"].object,
80
- teams: _propTypes["default"].object,
81
- venue: _propTypes["default"].object
82
- };
83
-
84
- var mapStateToProps = function mapStateToProps(state) {
85
- return {
86
- boxscore: (0, _game.selectBoxscore)(state),
87
- probables: (0, _game.selectProbablePitchers)(state),
88
- startTime: (0, _game.selectStartTime)(state),
89
- status: (0, _game.selectGameStatus)(state),
90
- teams: (0, _game.selectTeams)(state),
91
- venue: (0, _game.selectVenue)(state)
92
- };
93
- };
94
-
95
- var _default = (0, _reactRedux.connect)(mapStateToProps)(PreviewGame);
73
+ }
96
74
 
97
- exports["default"] = _default;
75
+ var _default = PreviewGame;
76
+ exports.default = _default;
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = _interopRequireWildcard(require("react"));
9
+
10
+ var _propTypes = _interopRequireDefault(require("prop-types"));
11
+
12
+ var _alternateRenderers = require("react-redux/lib/alternate-renderers");
13
+
14
+ var _standings = require("../features/standings");
15
+
16
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
17
+
18
+ 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); }
19
+
20
+ 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; }
21
+
22
+ function formatHeaderRow(record) {
23
+ return record.division.nameShort.padEnd(15) + ' W' + ' L' + ' PCT' + ' GB' + ' WCGB' + ' L10' + ' STRK';
24
+ }
25
+
26
+ function formatTeamRow(record) {
27
+ const lastTen = record.records.splitRecords.find(o => o.type === 'lastTen');
28
+ return record.team.teamName.padEnd(15) + record.wins.toString().padStart(5) + record.losses.toString().padStart(5) + record.winningPercentage.padStart(7) + record.gamesBack.padStart(6) + record.wildCardGamesBack.padStart(6) + `${lastTen.wins}-${lastTen.losses}`.padStart(6) + record.streak.streakCode.padStart(5);
29
+ }
30
+
31
+ function Division({
32
+ record,
33
+ top,
34
+ left,
35
+ width
36
+ }) {
37
+ return /*#__PURE__*/_react.default.createElement("box", {
38
+ top: top,
39
+ left: left,
40
+ height: 6,
41
+ width: width
42
+ }, /*#__PURE__*/_react.default.createElement("box", {
43
+ top: 0,
44
+ left: 0,
45
+ height: 1,
46
+ fg: "black",
47
+ bg: "white",
48
+ content: formatHeaderRow(record),
49
+ wrap: false
50
+ }), /*#__PURE__*/_react.default.createElement("box", {
51
+ top: 1,
52
+ left: 0,
53
+ height: 5,
54
+ content: record.teamRecords.map(formatTeamRow).join('\n'),
55
+ wrap: false
56
+ }));
57
+ }
58
+
59
+ Division.propTypes = {
60
+ record: _propTypes.default.object,
61
+ top: _propTypes.default.number,
62
+ left: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
63
+ width: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string])
64
+ };
65
+
66
+ function Standings() {
67
+ const dispatch = (0, _alternateRenderers.useDispatch)();
68
+ const standings = (0, _alternateRenderers.useSelector)(_standings.selectData);
69
+ (0, _react.useEffect)(() => dispatch((0, _standings.fetchStandings)()), []);
70
+
71
+ if (!standings) {
72
+ return /*#__PURE__*/_react.default.createElement("element", null);
73
+ }
74
+
75
+ return /*#__PURE__*/_react.default.createElement("element", null, standings.records.filter(record => record.league.id === 103).map((record, idx) => /*#__PURE__*/_react.default.createElement(Division, {
76
+ top: idx * 7,
77
+ left: 0,
78
+ width: "50%-1",
79
+ key: record.division.id,
80
+ record: record
81
+ })), standings.records.filter(record => record.league.id === 104).map((record, idx) => /*#__PURE__*/_react.default.createElement(Division, {
82
+ top: idx * 7,
83
+ left: "50%+1",
84
+ width: "50%-1",
85
+ key: record.division.id,
86
+ record: record
87
+ })));
88
+ }
89
+
90
+ var _default = Standings;
91
+ exports.default = _default;
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.setSelectedId = exports.selectVenue = exports.selectTeams = exports.selectStartTime = exports.selectSelectedId = exports.selectProbablePitchers = exports.selectLoading = exports.selectLineScore = exports.selectGameStatus = exports.selectGame = exports.selectFullUpdateRequired = exports.selectError = exports.selectDecisions = exports.selectCurrentPlay = exports.selectBoxscore = exports.selectAllPlays = exports.gamesSlice = exports.fetchGame = exports.default = void 0;
7
+
8
+ var _axios = _interopRequireDefault(require("axios"));
9
+
10
+ var _toolkit = require("@reduxjs/toolkit");
11
+
12
+ var _jsonPatch = _interopRequireDefault(require("json-patch"));
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ const initialState = {
17
+ loading: false,
18
+ fullUpdateRequired: false,
19
+ error: null,
20
+ selectedId: null,
21
+ games: {}
22
+ };
23
+ const fetchGame = (0, _toolkit.createAsyncThunk)('games/fetch', async ({
24
+ id,
25
+ start
26
+ }) => {
27
+ const diffParams = start ? `/diffPatch?startTimecode=${start}` : '';
28
+ const url = `https://statsapi.mlb.com/api/v1.1/game/${id}/feed/live${diffParams}`;
29
+ const response = await _axios.default.get(url);
30
+ return response.data;
31
+ });
32
+ exports.fetchGame = fetchGame;
33
+ const gamesSlice = (0, _toolkit.createSlice)({
34
+ name: 'games',
35
+ initialState,
36
+ reducers: {
37
+ setSelectedId(state, action) {
38
+ state.selectedId = action.payload;
39
+ }
40
+
41
+ },
42
+ extraReducers: builder => {
43
+ builder.addCase(fetchGame.pending, state => {
44
+ state.loading = true;
45
+ });
46
+ builder.addCase(fetchGame.fulfilled, (state, action) => {
47
+ const id = state.selectedId;
48
+ let game = state.games[id];
49
+ let patchError = false;
50
+
51
+ if (Array.isArray(action.payload)) {
52
+ action.payload.forEach(obj => {
53
+ if (patchError) {
54
+ return;
55
+ }
56
+
57
+ try {
58
+ _jsonPatch.default.apply(game || {}, obj.diff);
59
+ } catch (e) {
60
+ patchError = true;
61
+ return;
62
+ }
63
+ });
64
+ } else {
65
+ game = action.payload;
66
+ }
67
+
68
+ if (patchError) {
69
+ state.fullUpdateRequired = true;
70
+ } else {
71
+ state.fullUpdateRequired = false;
72
+ state.error = null;
73
+ state.games[id] = game;
74
+ }
75
+
76
+ state.loading = false;
77
+ });
78
+ builder.addCase(fetchGame.rejected, (state, action) => {
79
+ state.fullUpdateRequired = true;
80
+ state.loading = false;
81
+ state.error = action.error;
82
+ });
83
+ }
84
+ });
85
+ exports.gamesSlice = gamesSlice;
86
+ const {
87
+ setSelectedId
88
+ } = gamesSlice.actions;
89
+ exports.setSelectedId = setSelectedId;
90
+
91
+ const gamesRoot = state => state.games;
92
+
93
+ const selectLoading = (0, _toolkit.createSelector)(gamesRoot, root => root.loading);
94
+ exports.selectLoading = selectLoading;
95
+ const selectError = (0, _toolkit.createSelector)(gamesRoot, root => root.error);
96
+ exports.selectError = selectError;
97
+ const selectFullUpdateRequired = (0, _toolkit.createSelector)(gamesRoot, root => root.fullUpdateRequired);
98
+ exports.selectFullUpdateRequired = selectFullUpdateRequired;
99
+ const selectSelectedId = (0, _toolkit.createSelector)(gamesRoot, root => root.selectedId);
100
+ exports.selectSelectedId = selectSelectedId;
101
+ const selectGame = (0, _toolkit.createSelector)([gamesRoot, selectSelectedId], (root, id) => root.games[id]);
102
+ exports.selectGame = selectGame;
103
+ const selectLiveData = (0, _toolkit.createSelector)(selectGame, game => game.liveData);
104
+ const selectPlays = (0, _toolkit.createSelector)(selectLiveData, data => data.plays);
105
+ const selectCurrentPlay = (0, _toolkit.createSelector)(selectPlays, plays => plays.currentPlay);
106
+ exports.selectCurrentPlay = selectCurrentPlay;
107
+ const selectAllPlays = (0, _toolkit.createSelector)(selectPlays, plays => plays.allPlays);
108
+ exports.selectAllPlays = selectAllPlays;
109
+ const selectBoxscore = (0, _toolkit.createSelector)(selectLiveData, data => {
110
+ var _data$boxscore;
111
+
112
+ return (_data$boxscore = data.boxscore) === null || _data$boxscore === void 0 ? void 0 : _data$boxscore.teams;
113
+ });
114
+ exports.selectBoxscore = selectBoxscore;
115
+ const selectLineScore = (0, _toolkit.createSelector)(selectLiveData, data => data.linescore);
116
+ exports.selectLineScore = selectLineScore;
117
+ const selectDecisions = (0, _toolkit.createSelector)(selectLiveData, data => data.decisions);
118
+ exports.selectDecisions = selectDecisions;
119
+ const selectGameData = (0, _toolkit.createSelector)(selectGame, game => game.gameData);
120
+ const selectGameStatus = (0, _toolkit.createSelector)(selectGameData, game => game.status);
121
+ exports.selectGameStatus = selectGameStatus;
122
+ const selectTeams = (0, _toolkit.createSelector)(selectGameData, gameData => gameData.teams);
123
+ exports.selectTeams = selectTeams;
124
+ const selectVenue = (0, _toolkit.createSelector)(selectGameData, gameData => gameData.venue);
125
+ exports.selectVenue = selectVenue;
126
+ const selectStartTime = (0, _toolkit.createSelector)(selectGameData, gameData => {
127
+ var _gameData$datetime;
128
+
129
+ return (_gameData$datetime = gameData.datetime) === null || _gameData$datetime === void 0 ? void 0 : _gameData$datetime.dateTime;
130
+ });
131
+ exports.selectStartTime = selectStartTime;
132
+ const selectProbablePitchers = (0, _toolkit.createSelector)(selectGameData, gameData => gameData.probablePitchers);
133
+ exports.selectProbablePitchers = selectProbablePitchers;
134
+ var _default = gamesSlice.reducer;
135
+ exports.default = _default;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.removeKeyListener = exports.keysSlice = exports.default = exports.addKeyListener = void 0;
7
+
8
+ var _toolkit = require("@reduxjs/toolkit");
9
+
10
+ var _screen = _interopRequireDefault(require("../screen"));
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+
14
+ const keysSlice = (0, _toolkit.createSlice)({
15
+ name: 'keys',
16
+ initialState: [{
17
+ key: 'Q',
18
+ label: 'Quit'
19
+ }],
20
+ reducers: {
21
+ addKeyListener: {
22
+ reducer: (state, action) => {
23
+ if (action.payload) {
24
+ state.push(action.payload);
25
+ }
26
+ },
27
+ prepare: (key, listener, help) => {
28
+ _screen.default.key(key, listener);
29
+
30
+ return {
31
+ payload: help
32
+ };
33
+ }
34
+ },
35
+ removeKeyListener: {
36
+ reducer: (state, action) => {
37
+ if (action.payload) {
38
+ const idx = state.findIndex(item => item.key === action.payload.key);
39
+
40
+ if (idx >= 0) {
41
+ state.splice(idx, 1);
42
+ }
43
+ }
44
+ },
45
+ prepare: (key, listener, help) => {
46
+ _screen.default.unkey(key, listener);
47
+
48
+ return {
49
+ payload: help
50
+ };
51
+ }
52
+ }
53
+ }
54
+ });
55
+ exports.keysSlice = keysSlice;
56
+ const {
57
+ addKeyListener,
58
+ removeKeyListener
59
+ } = keysSlice.actions;
60
+ exports.removeKeyListener = removeKeyListener;
61
+ exports.addKeyListener = addKeyListener;
62
+ var _default = keysSlice.reducer;
63
+ exports.default = _default;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.selectLoading = exports.selectError = exports.selectData = exports.scheduleSlice = exports.fetchSchedule = exports.default = void 0;
7
+
8
+ var _axios = _interopRequireDefault(require("axios"));
9
+
10
+ var _toolkit = require("@reduxjs/toolkit");
11
+
12
+ var _dateFns = require("date-fns");
13
+
14
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
+
16
+ const initialState = {
17
+ loading: false,
18
+ error: null,
19
+ data: null
20
+ };
21
+ const fetchSchedule = (0, _toolkit.createAsyncThunk)('schedule/fetch', async date => {
22
+ const dateStr = (0, _dateFns.format)(date, 'MM/dd/yyyy');
23
+ const response = await _axios.default.get(`http://statsapi.mlb.com/api/v1/schedule?sportId=1&hydrate=team,linescore&date=${dateStr}`);
24
+ return response.data;
25
+ });
26
+ exports.fetchSchedule = fetchSchedule;
27
+ const scheduleSlice = (0, _toolkit.createSlice)({
28
+ name: 'schedule',
29
+ initialState,
30
+ reducers: {},
31
+ extraReducers: builder => {
32
+ builder.addCase(fetchSchedule.pending, state => {
33
+ state.loading = true;
34
+ });
35
+ builder.addCase(fetchSchedule.fulfilled, (state, action) => {
36
+ state.loading = false;
37
+ state.data = action.payload;
38
+ state.error = null;
39
+ });
40
+ builder.addCase(fetchSchedule.rejected, (state, action) => {
41
+ state.loading = false;
42
+ state.data = null;
43
+ state.error = action.error;
44
+ });
45
+ }
46
+ });
47
+ exports.scheduleSlice = scheduleSlice;
48
+
49
+ const scheduleSelector = state => state.schedule;
50
+
51
+ const selectLoading = (0, _toolkit.createSelector)(scheduleSelector, schedule => schedule.loading);
52
+ exports.selectLoading = selectLoading;
53
+ const selectError = (0, _toolkit.createSelector)(scheduleSelector, schedule => schedule.error);
54
+ exports.selectError = selectError;
55
+ const selectData = (0, _toolkit.createSelector)(scheduleSelector, schedule => schedule.data);
56
+ exports.selectData = selectData;
57
+ var _default = scheduleSlice.reducer;
58
+ exports.default = _default;
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.standingsSlice = exports.selectLoading = exports.selectError = exports.selectData = exports.fetchStandings = exports.default = void 0;
7
+
8
+ var _axios = _interopRequireDefault(require("axios"));
9
+
10
+ var _toolkit = require("@reduxjs/toolkit");
11
+
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+
14
+ const initialState = {
15
+ loading: false,
16
+ error: null,
17
+ data: null
18
+ };
19
+ const SEASON = new Date().getFullYear();
20
+ const fetchStandings = (0, _toolkit.createAsyncThunk)('standings/fetch', async () => {
21
+ const url = `https://statsapi.mlb.com/api/v1/standings?leagueId=103,104&season=${SEASON}&standingsTypes=regularSeason&hydrate=division,team`;
22
+ const response = await _axios.default.get(url);
23
+ return response.data;
24
+ });
25
+ exports.fetchStandings = fetchStandings;
26
+ const standingsSlice = (0, _toolkit.createSlice)({
27
+ name: 'standings',
28
+ initialState,
29
+ reducers: {},
30
+ extraReducers: builder => {
31
+ builder.addCase(fetchStandings.pending, state => {
32
+ state.loading = true;
33
+ });
34
+ builder.addCase(fetchStandings.fulfilled, (state, action) => {
35
+ state.loading = false;
36
+ state.data = action.payload;
37
+ state.error = null;
38
+ });
39
+ builder.addCase(fetchStandings.rejected, (state, action) => {
40
+ state.loading = false;
41
+ state.data = null;
42
+ state.error = action.error;
43
+ });
44
+ }
45
+ });
46
+ exports.standingsSlice = standingsSlice;
47
+
48
+ const standingsSelector = state => state.standings;
49
+
50
+ const selectLoading = (0, _toolkit.createSelector)(standingsSelector, standings => standings.loading);
51
+ exports.selectLoading = selectLoading;
52
+ const selectError = (0, _toolkit.createSelector)(standingsSelector, standings => standings.error);
53
+ exports.selectError = selectError;
54
+ const selectData = (0, _toolkit.createSelector)(standingsSelector, standings => standings.data);
55
+ exports.selectData = selectData;
56
+ var _default = standingsSlice.reducer;
57
+ exports.default = _default;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _react = require("react");
9
+
10
+ var _alternateRenderers = require("react-redux/lib/alternate-renderers");
11
+
12
+ var _keys = require("../features/keys");
13
+
14
+ function useKey(key, handler, help) {
15
+ const dispatch = (0, _alternateRenderers.useDispatch)();
16
+ return (0, _react.useEffect)(() => {
17
+ dispatch((0, _keys.addKeyListener)(key, handler, help));
18
+ return () => dispatch((0, _keys.removeKeyListener)(key, handler, help));
19
+ }, [key, handler, help, dispatch]);
20
+ }
21
+
22
+ var _default = useKey;
23
+ exports.default = _default;
package/dist/logger.js CHANGED
@@ -3,22 +3,20 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports["default"] = void 0;
6
+ exports.default = void 0;
7
7
 
8
8
  var _path = _interopRequireDefault(require("path"));
9
9
 
10
10
  var _winston = _interopRequireDefault(require("winston"));
11
11
 
12
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
13
 
14
- _winston["default"].configure({
15
- transports: [new _winston["default"].transports.File({
16
- filename: _path["default"].resolve(__dirname, 'playball.log'),
17
- format: _winston["default"].format.combine(_winston["default"].format.timestamp(), _winston["default"].format.printf(function (info) {
18
- return "[".concat(info.timestamp, "] ").concat(info.level, ": ").concat(info.message);
19
- }))
14
+ _winston.default.configure({
15
+ transports: [new _winston.default.transports.File({
16
+ filename: _path.default.resolve(__dirname, 'playball.log'),
17
+ format: _winston.default.format.combine(_winston.default.format.timestamp(), _winston.default.format.printf(info => `[${info.timestamp}] ${info.level}: ${info.message}`))
20
18
  })]
21
19
  });
22
20
 
23
- var _default = _winston["default"];
24
- exports["default"] = _default;
21
+ var _default = _winston.default;
22
+ exports.default = _default;
package/dist/main.js CHANGED
@@ -2,37 +2,27 @@
2
2
 
3
3
  var _react = _interopRequireDefault(require("react"));
4
4
 
5
- var _blessed = _interopRequireDefault(require("blessed"));
6
-
7
5
  var _reactBlessed = require("react-blessed");
8
6
 
9
- var _reactRedux = require("react-redux");
7
+ var _alternateRenderers = require("react-redux/lib/alternate-renderers");
8
+
9
+ var _raf = _interopRequireDefault(require("raf"));
10
+
11
+ var _screen = _interopRequireDefault(require("./screen"));
10
12
 
11
13
  var _store = _interopRequireDefault(require("./store"));
12
14
 
13
- require("./logger");
15
+ var _logger = _interopRequireDefault(require("./logger"));
14
16
 
15
17
  var _App = _interopRequireDefault(require("./components/App"));
16
18
 
17
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
19
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
20
 
19
- var screen = _blessed["default"].screen({
20
- autoPadding: true,
21
- debug: true,
22
- smartCSR: true,
23
- title: 'Playball!'
24
- });
21
+ _raf.default.polyfill();
25
22
 
26
- screen.key(['escape', 'q', 'C-c'], function () {
27
- return process.exit(0);
23
+ process.on('uncaughtException', function (error) {
24
+ _logger.default.error('UNCAUGHT EXCEPTION\n' + JSON.stringify(error) + '\n' + error.stack);
28
25
  });
29
- (0, _reactBlessed.render)( /*#__PURE__*/_react["default"].createElement(_reactRedux.Provider, {
30
- store: _store["default"]
31
- }, /*#__PURE__*/_react["default"].createElement(_App["default"], {
32
- debug: function debug(message) {
33
- return screen.debug(message);
34
- },
35
- onKeyPress: function onKeyPress(keys, handler) {
36
- return screen.key(keys, handler);
37
- }
38
- })), screen);
26
+ (0, _reactBlessed.render)( /*#__PURE__*/_react.default.createElement(_alternateRenderers.Provider, {
27
+ store: _store.default
28
+ }, /*#__PURE__*/_react.default.createElement(_App.default, null)), _screen.default);
package/dist/screen.js ADDED
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+
8
+ var _blessed = _interopRequireDefault(require("blessed"));
9
+
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+
12
+ const screen = _blessed.default.screen({
13
+ autoPadding: true,
14
+ debug: true,
15
+ smartCSR: true,
16
+ title: 'Playball!',
17
+ handleUncaughtExceptions: false
18
+ });
19
+
20
+ screen.key(['escape', 'q', 'C-c'], () => process.exit(0));
21
+ var _default = screen;
22
+ exports.default = _default;