playball
Version:
Watch MLB games from the comfort of your terminal
93 lines • 3.47 kB
JavaScript
import React from 'react';
import { useSelector } from "react-redux/lib/alternate-renderers.js";
import { selectAllPlays, selectTeams } from "../features/games.js";
import { get } from "../config.js";
import style from "../style/index.js";
function getPlayResultColor(play) {
var _play$playEvents;
const lastPlay = (_play$playEvents = play.playEvents[play.playEvents.length - 1]) === null || _play$playEvents === void 0 ? void 0 : _play$playEvents.details;
if (!lastPlay) {
return get('color.other-event');
} else if (lastPlay.isBall) {
return get('color.walk');
} else if (lastPlay.isStrike) {
return get('color.strike-out');
} else if (lastPlay.isInPlay && !play.about.hasOut) {
return get('color.in-play-no-out');
} else {
return get('color.in-play-out');
}
}
function formatOut(out) {
return ` {bold}${out} out{/}`;
}
function AllPlays() {
const plays = useSelector(selectAllPlays);
const teams = useSelector(selectTeams);
const formatScoreDetail = scoreObj => ` {bold}{${get('color.in-play-runs-bg')}-bg}{${get('color.in-play-runs-fg')}-fg} ` + `${teams.away.abbreviation} ${scoreObj.awayScore} - ` + `${teams.home.abbreviation} ${scoreObj.homeScore}` + ' {/}';
let inning = '';
const lines = [];
plays && plays.slice().reverse().forEach((play, playIdx, plays) => {
let lastPlay;
if (playIdx < plays.length - 1) {
lastPlay = plays[playIdx + 1];
}
const playInning = play.about.halfInning + ' ' + play.about.inning;
if (playInning !== inning) {
inning = playInning;
if (lines.length > 0) {
lines.push('');
}
lines.push(`{bold}[${inning.toUpperCase()}]{/}`);
}
if (play.about.isComplete) {
const color = getPlayResultColor(play);
let line = `{${color}-fg}[${play.result.event}]{/} ${play.result.description}`;
if (play.about.hasOut) {
const lastOut = play.playEvents[play.playEvents.length - 1].count.outs;
if (lastOut !== play.count.outs) {
line += formatOut(play.count.outs);
}
}
if (play.about.isScoringPlay) {
line += formatScoreDetail(play.result);
}
lines.push(line);
}
play.playEvents && play.playEvents.slice().reverse().forEach((event, eventIdx, events) => {
if (event.type === 'action') {
var _event$count;
let line = '';
if (event.details.event) {
line += `{${get('color.other-event')}-fg}[${event.details.event}]{/} `;
}
line += event.details.description;
if (event.isScoringPlay || event.details.isScoringPlay) {
line += formatScoreDetail(event.details);
}
const currentOut = (_event$count = event.count) === null || _event$count === void 0 ? void 0 : _event$count.outs;
let prevOut = lastPlay ? lastPlay.count.outs : 0;
if (eventIdx < events.length - 1) {
var _events$count;
prevOut = (_events$count = events[eventIdx + 1].count) === null || _events$count === void 0 ? void 0 : _events$count.outs;
}
if (currentOut > prevOut) {
line += formatOut(currentOut);
}
lines.push(line);
}
});
});
return /*#__PURE__*/React.createElement("box", {
content: lines.join('\n'),
focused: true,
mouse: true,
keys: true,
vi: true,
scrollable: true,
scrollbar: style.scrollbar,
alwaysScroll: true,
tags: true
});
}
export default AllPlays;