codeforthailand/election-live

View on GitHub
src/components/PartyStatsRow.js

Summary

Maintainability
A
0 mins
Test Coverage
import React from "react"
import VisuallyHidden from "@reach/visually-hidden"
import { DISPLAY_FONT } from "../styles"
import { partyColor, partyLogo, partyPath } from "../models/information"
import PercentBarChart from "./PercentBarChart"
import Arrow, { RightArrow } from "./Arrow"
import { Link } from "gatsby"

const ARTICLE_STYLE = {
  position: "relative",
  marginBottom: "0.5rem",
  padding: "0.5rem 0",
  display: "grid",
  gridTemplateColumns: "28px auto 32px",
  gridGap: "6px",
  background: "white",
}

const PARTY_NAME_STYLE = {
  margin: 0,
  fontSize: "1.5rem",
  fontFamily: DISPLAY_FONT,
  whiteSpace: "nowrap",
  textOverflow: "ellipsis",
  overflow: "hidden",
}

/**
 * @param {{ party: IParty, constituencySeats: number, partyListSeats: number, maxSeats: number, filtered: boolean }} props
 */
const PartyStatsRow = props => {
  const totalSeats = props.constituencySeats + props.partyListSeats
  const barWidth = totalSeats / props.maxSeats

  return (
    <article css={ARTICLE_STYLE}>
      <div>
        <img alt="" src={partyLogo(props.party.name)} width="28" />
      </div>
      <div css={{ overflow: "hidden" }}>
        <h3 css={PARTY_NAME_STYLE}>
          <Link
            to={partyPath(props.party)}
            css={{ color: "inherit", textDecoration: "none" }}
          >
            {props.party.name}
            <div
              css={{
                display: "inline-block",
                transform: "translate(-5px,-1px) scale(0.8)",
              }}
            >
              <RightArrow />
            </div>
          </Link>
        </h3>
        <div css={{ margin: 0 }}>
          ส.ส. เขต: {props.constituencySeats}
          <VisuallyHidden> ที่นั่ง </VisuallyHidden>
          {!props.filtered && (
            <React.Fragment>
              , ส.ส. ปาร์ตี้ลิสต์: {props.partyListSeats}
              <VisuallyHidden> ที่นั่ง</VisuallyHidden>
            </React.Fragment>
          )}
        </div>
        <PercentBarChart color={partyColor(props.party)} percent={barWidth} />
      </div>
      <div>
        <VisuallyHidden> ทั้งหมด </VisuallyHidden>
        <div
          css={{
            backgroundColor: " #eee",
            width: "2rem",
            height: "2rem",
            borderRadius: "50%",
            textAlign: "center",
          }}
        >
          <span
            css={{
              fontSize: "1rem",
              top: 4,
              position: "relative",
              fontWeight: "bold",
            }}
          >
            {totalSeats}
          </span>
        </div>
      </div>
    </article>
  )
}

export default PartyStatsRow