mavend/octoboard

View on GitHub
src/components/game/Sidebar/Player.js

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import React from "react";
import PropTypes from "prop-types";
import { Icon, Segment, Feed } from "semantic-ui-react";
import { useTranslation } from "react-i18next";
import { PlayerType } from "config/propTypes";
import Avatar from "components/user/Avatar";

import styles from "./Player.module.css";

const propTypes = {
  player: PlayerType,
  showCurrentPlayer: PropTypes.bool,
  maxPoints: PropTypes.number,
};

const defaultProps = {
  player: { id: "" },
};

const Player = ({
  player: { uid, isConnected, points, isWinning, isYou, isCurrentPlayer, profile },
  maxPoints,
  showCurrentPlayer,
  children,
}) => {
  const { t } = useTranslation("lobby");

  if (!uid) {
    return (
      <Segment disabled={true}>
        <Feed>
          <Feed.Event>
            <Feed.Label>
              <Avatar empty />
            </Feed.Label>
            <Feed.Content>
              <Feed.Date>{t("sidebar.player.waiting")}</Feed.Date>
            </Feed.Content>
          </Feed.Event>
        </Feed>
      </Segment>
    );
  }

  const { displayName } = profile;

  return (
    <Segment disabled={!isConnected} className={`${styles.player} ${styles.smoothDisabled}`}>
      <Feed>
        <Feed.Event>
          <Feed.Label>
            <Avatar uid={uid} />
          </Feed.Label>
          <Feed.Content>
            <Feed.Date>
              {displayName} {isYou && <span>({t("sidebar.player.you")})</span>}{" "}
              {showCurrentPlayer && isCurrentPlayer && <Icon name="check circle" color="green" />}
              <Icon
                name="broken chain"
                className={`${styles.smoothDisabled} ${isConnected ? "hidden" : ""}`}
                style={{ opacity: isConnected ? 0 : 0.45 }}
              />
            </Feed.Date>
            <Feed.Content>
              <Icon name="trophy" color={isWinning ? "yellow" : "grey"} />
              {points !== undefined &&
                t("sidebar.player.points", {
                  points: maxPoints ? `${points} / ${maxPoints}` : points,
                })}
            </Feed.Content>
            {children && (
              <Feed.Extra text className={styles.extra}>
                {children}
              </Feed.Extra>
            )}
          </Feed.Content>
        </Feed.Event>
      </Feed>
    </Segment>
  );
};
Player.propTypes = propTypes;
Player.defaultProps = defaultProps;

export default React.memo(Player);