Passed
Push — feature/player-stats ( 5dcf04...b120d6 )
by Kevin Van
04:31
created

src/components/MiniRanking.tsx   A

Complexity

Total Complexity 17
Complexity/F 3.4

Size

Lines of Code 126
Function Count 5

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 17
eloc 101
mnd 12
bc 12
fnc 5
dl 0
loc 126
bpm 2.4
cpm 3.4
noi 0
c 0
b 0
f 0
rs 10

5 Functions

Rating   Name   Duplication   Size   Complexity  
A MiniRanking.renderRankings 0 14 2
A MiniRanking.render 0 15 1
A MiniRanking.componentDidMount 0 3 1
C MiniRanking.renderRanking 0 47 11
A MiniRanking.updateData 0 11 2
1
import React, { Fragment } from "react"
2
import { graphql, useStaticQuery } from "gatsby"
3
4
import "./MiniRanking.scss"
5
6
class MiniRanking extends React.Component<MiniRankingProps, MiniRankingState> {
7
  kcvvPsdApi: string
8
  teamId: number
9
  homeTeam: string
10
  awayTeam: string
11
  constructor(props: MiniRankingProps) {
12
    super(props)
13
14
    this.state = {
15
      data: [],
16
      loading: true,
17
    }
18
19
    this.kcvvPsdApi = ``
20
    this.teamId = props.teamId
21
    this.homeTeam = props.homeTeam
22
    this.awayTeam = props.awayTeam
23
  }
24
25
  updateData(): void {
26
    if (this.teamId === null || this.kcvvPsdApi === ``) {
27
      return
28
    }
29
30
    const apiUrl = `${this.kcvvPsdApi}/ranking/${this.teamId}`
31
32
    fetch(apiUrl)
33
      .then((response) => response.json())
34
      .then((json) => this.setState({ data: json, loading: false }))
35
  }
36
37
  componentDidMount(): void {
38
    this.updateData()
39
  }
40
41
  renderRanking = (ranking: RankingDataObject, i: number): JSX.Element => {
42
    return (
43
      <div className={`ranking`} key={i}>
44
        <h4>{ranking.name.replace(`Voetbal : `, ``)}</h4>
45
        <table>
46
          <thead>
47
            <tr>
48
              <th className={`table__column__number`}>#</th>
49
              <th className={`table__column__string`}>Team</th>
50
              <th className={`table__column__number show-for-medium`}>P</th>
51
              <th className={`table__column__number`}>W</th>
52
              <th className={`table__column__number`}>D</th>
53
              <th className={`table__column__number`}>L</th>
54
              <th className={`table__column__number show-for-medium`}>G+</th>
55
              <th className={`table__column__number show-for-medium`}>G-</th>
56
              <th className={`table__column__number`}>+/-</th>
57
              <th className={`table__column__number`}>Pts</th>
58
            </tr>
59
          </thead>
60
          <tbody>
61
            {ranking.teams.map(
62
              (team: RankingDataTeamObject, j: number) =>
63
                (team.team?.club?.localName.includes(this.homeTeam) ||
64
                  team.team?.club?.localName.includes(this.awayTeam)) && (
65
                  <tr key={j}>
66
                    <td className={`table__column__number`}>{team.rank || `-`}</td>
67
                    <td
68
                      className={`table__column__string ${
69
                        team.team?.club?.localName?.toLowerCase().includes(`elewijt`) ? `table__column--highlight` : ``
70
                      }`}
71
                    >
72
                      {team.team?.club?.localName || ``}
73
                    </td>
74
                    <td className={`table__column__number show-for-medium`}>{team.matchesPlayed || `0`}</td>
75
                    <td className={`table__column__number`}>{team.wins || `0`}</td>
76
                    <td className={`table__column__number`}>{team.draws || `0`}</td>
77
                    <td className={`table__column__number`}>{team.losses || `0`}</td>
78
                    <td className={`table__column__number show-for-medium`}>{team.goalsScored || `0`}</td>
79
                    <td className={`table__column__number show-for-medium`}>{team.goalsConceded || `0`}</td>
80
                    <td className={`table__column__number`}>{team.goalsScored - team.goalsConceded || `0`}</td>
81
                    <td className={`table__column__number`}>{team.points || `0`}</td>
82
                  </tr>
83
                )
84
            )}
85
          </tbody>
86
        </table>
87
      </div>
88
    )
89
  }
90
91
  renderRankings = (): JSX.Element => {
92
    if (this.state.loading === false && this.state.data) {
93
      const rankings = this.state.data
94
      return (
95
        <Fragment>
96
          {rankings
97
            .sort((a, b) => a.name.localeCompare(b.name))
98
            .map((ranking: RankingDataObject, i: number) => {
99
              return i === 0 && this.renderRanking(ranking, i)
100
            })}
101
        </Fragment>
102
      )
103
    } else {
104
      return <div>Loading...</div>
105
    }
106
  }
107
108
  render(): JSX.Element {
109
    const config: MiniRankingData = useStaticQuery(graphql`
110
      query {
111
        site {
112
          siteMetadata {
113
            kcvvPsdApi
114
          }
115
        }
116
      }
117
    `)
118
119
    this.kcvvPsdApi = config.site.siteMetadata.kcvvPsdApi
120
121
    return <section className={`ranking__wrapper`}>{this.renderRankings()}</section>
122
  }
123
}
124
125
export default MiniRanking
126