Main.js

import React from 'react';
import IndividualLeaderboard from './IndividualLeaderboard';
import TeamLeaderboard from './TeamLeaderboard';
import AddPlayer from './AddPlayer';

class Main extends React.Component {
    constructor(props) {
        super(props);

        this.state = {
            players: [],
            teams: {}
        };

        this.addToPlayers = this.addToPlayers.bind(this);
    }

    addToPlayers(player) {
        const newPlayers = this.state.players.concat(player);
        this.setState({
            players: newPlayers
        });

        // Update teams as well
        this.updateTeams(player);
    }

    updateTeams(newPlayer) {
        const teams = Object.assign({}, this.state.teams);
        const newPlayerTeamName = newPlayer.team;
        const team = Object.assign({}, teams[newPlayerTeamName]);
        
        if (!team.name) {
            team.name = newPlayerTeamName;
        }
    
        if (!team.score) {
            team.score = 0;
        }
        team.score += parseInt(newPlayer.score);
    
        teams[newPlayerTeamName] = team;
        this.setState({ teams: teams });
    }

    render() {
        return (
            <div className="container">
                <div className="jumbotron bg-info text-white text-center">
                    <h1>Laser Tag Leaderboard</h1>
                </div>
                <IndividualLeaderboard players={this.state.players} />
                <TeamLeaderboard teams={this.state.teams} />
                <AddPlayer addToPlayers={this.addToPlayers} />
            </div>
        );
    }
}

export default Main;

TeamLeaderboard.js

import React from 'react';

class TeamLeaderboard extends React.Component {
    render() {
        return (
            <div className="team-leaderboard">
                <h3>Team Leaderboard</h3>
                <table className="table">
                    <thead>
                        <tr>
                            <th scope="col">Rank</th>
                            <th scope="col">Team</th>
                            <th scope="col">Score</th>
                        </tr>
                    </thead>
                    <tbody>
                        {Object.keys(this.props.teams)
                            .map((teamName) => this.props.teams[teamName])
                            .sort((teamA, teamB) => {
                                return parseInt(teamA.score) < parseInt(teamB.score);
                            })
                            .map((team, index) => {
                                return (                        
                                    <tr key={index}>
                                        <th scope="row">{index + 1}</th>
                                        <td>{team.name}</td>
                                        <td>{team.score}</td>
                                    </tr>
                                );
                        })}
                    </tbody>
                </table>
            </div>
        )
    }
}

export default TeamLeaderboard;

IndividualLeaderboard.js (no change since lab 6)

import React from 'react';

class IndividualLeaderboard extends React.Component {
    render() {
        return (
            <div className="individual-leaderboard">
                <h3>Individual Leaderboard</h3>
                <table className="table">
                    <thead>
                        <tr>
                            <th scope="col">Rank</th>
                            <th scope="col">First Name</th>
                            <th scope="col">Last Name</th>
                            <th scope="col">Score</th>
                            <th scope="col">Accuracy</th>
                            <th scope="col">Team</th>
                        </tr>
                    </thead>
                    <tbody>
                        {this.props.players
                            .sort((playerA, playerB) => {
                                return parseInt(playerA.score) < parseInt(playerB.score);
                            })
                            .map((player, index) => {
                            return (
                                <tr key={index}>
                                    <th scope="row">{index + 1}</th>
                                    <td>{player.firstName}</td>
                                    <td>{player.lastName}</td>
                                    <td>{player.score}</td>
                                    <td>{player.accuracy}</td>
                                    <td>{player.team}</td>
                                </tr>
                            );
                        })}
                    </tbody>
                </table>
            </div>
        )
    }
}

export default IndividualLeaderboard;