schneidmaster/debatevid.io

View on GitHub
app/assets/components/Leaderboard/components/LeaderboardApp/LeaderboardApp.js

Summary

Maintainability
F
3 days
Test Coverage
import React from "react";
import PropTypes from "prop-types";
import { List } from "immutable";
import {
  Row,
  Col,
  Table,
  Panel,
  Tooltip,
  Glyphicon,
  OverlayTrigger
} from "react-bootstrap";
import Pagination from "react-js-pagination";

const LeaderboardApp = ({
  tagsPage,
  videosPage,
  scorePage,
  itemsPerPage,
  users,
  tagsUsers,
  videosUsers,
  scoreUsers,
  setTagsPage,
  setVideosPage,
  setScorePage
}) => {
  const tooltip = (
    <Tooltip id="score-tooltip">3 points per video, 1 point per tag</Tooltip>
  );

  return (
    <Row>
      <Col md={4} xs={12}>
        <Panel header="Top score">
          <Table striped>
            <thead>
              <tr>
                <th>Rank</th>
                <th>Name</th>
                <th>
                  Score{" "}
                  <OverlayTrigger placement="right" overlay={tooltip}>
                    <Glyphicon glyph="question-sign" />
                  </OverlayTrigger>
                </th>
              </tr>
            </thead>
            <tbody>
              {scoreUsers.map((user, idx) => (
                <tr key={user.id}>
                  <td>{itemsPerPage * (scorePage - 1) + idx + 1}</td>
                  <td>
                    <a href={`/users/${user.id}`}>{user.name}</a>
                  </td>
                  <td>{user.score}</td>
                </tr>
              ))}
            </tbody>
          </Table>

          <div className="text-center">
            <Pagination
              activePage={scorePage}
              itemsCountPerPage={itemsPerPage}
              totalItemsCount={users.size}
              onChange={setScorePage}
            />
          </div>
        </Panel>
      </Col>

      <Col md={4} xs={12}>
        <Panel header="Top submitters">
          <Table striped>
            <thead>
              <tr>
                <th>Rank</th>
                <th>Name</th>
                <th>Videos</th>
              </tr>
            </thead>
            <tbody>
              {videosUsers.map((user, idx) => (
                <tr key={user.id}>
                  <td>{itemsPerPage * (videosPage - 1) + idx + 1}</td>
                  <td>
                    <a href={`/users/${user.id}`}>{user.name}</a>
                  </td>
                  <td>{user.videosCount}</td>
                </tr>
              ))}
            </tbody>
          </Table>

          <div className="text-center">
            <Pagination
              activePage={videosPage}
              itemsCountPerPage={itemsPerPage}
              totalItemsCount={users.size}
              onChange={setVideosPage}
            />
          </div>
        </Panel>
      </Col>

      <Col md={4} xs={12}>
        <Panel header="Top taggers">
          <Table striped>
            <thead>
              <tr>
                <th>Rank</th>
                <th>Name</th>
                <th>Tags</th>
              </tr>
            </thead>
            <tbody>
              {tagsUsers.map((user, idx) => (
                <tr key={user.id}>
                  <td>{itemsPerPage * (tagsPage - 1) + idx + 1}</td>
                  <td>
                    <a href={`/users/${user.id}`}>{user.name}</a>
                  </td>
                  <td>{user.tagsCount}</td>
                </tr>
              ))}
            </tbody>
          </Table>

          <div className="text-center">
            <Pagination
              activePage={tagsPage}
              itemsCountPerPage={itemsPerPage}
              totalItemsCount={users.size}
              onChange={setTagsPage}
            />
          </div>
        </Panel>
      </Col>
    </Row>
  );
};

LeaderboardApp.propTypes = {
  tagsPage: PropTypes.number.isRequired,
  videosPage: PropTypes.number.isRequired,
  scorePage: PropTypes.number.isRequired,
  itemsPerPage: PropTypes.number.isRequired,
  users: PropTypes.instanceOf(List).isRequired,
  tagsUsers: PropTypes.instanceOf(List).isRequired,
  videosUsers: PropTypes.instanceOf(List).isRequired,
  scoreUsers: PropTypes.instanceOf(List).isRequired,
  setTagsPage: PropTypes.func.isRequired,
  setVideosPage: PropTypes.func.isRequired,
  setScorePage: PropTypes.func.isRequired
};

export default LeaderboardApp;