Passed
Push — feature/player-stats ( 880a8c...903b94 )
by Kevin Van
05:30
created

PlayerDetail.renderPlayerStats   B

Complexity

Conditions 8

Size

Total Lines 44
Code Lines 42

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 42
dl 0
loc 44
rs 7.0053
c 0
b 0
f 0
cc 8
1
import React, { Component } from "react"
2
import { graphql, StaticQuery } from "gatsby"
3
import { mapPositionCode } from "../scripts/helper"
4
5
import moment from "moment"
6
7
import "./player.scss"
8
import { Link } from "gatsby"
9
10
import Icon from "../components/icon"
11
12
import iconCleansheet from "../images/i_cleansheet.png"
13
import iconCardRed from "../images/i_card_red.png"
14
import iconCardYellow from "../images/i_card_yellow.png"
15
import iconGoal from "../images/i_goal.png"
16
import Card from "./Card"
17
18
// eslint-disable-next-line
19
String.prototype.replaceAll = function (search, replacement) {
20
  var target = this
21
  return target.replace(new RegExp(search, `g`), replacement)
22
}
23
24
/**
25
 */
26
class PlayerDetail extends Component {
27
  constructor(props) {
28
    super(props)
29
30
    this.state = {
31
      data: [],
32
      loading: true,
33
    }
34
35
    const {
36
      config: {
37
        site: {
38
          siteMetadata: { kcvvPsdApi },
39
        },
40
      },
41
      player: { field_vv_id: playerId },
42
    } = this.props
43
44
    this.kcvvPsdApi = kcvvPsdApi
45
    this.playerId = playerId
46
  }
47
48
  updateData() {
49
    if (this.playerId === null) {
50
      return
51
    }
52
53
    const apiUrl = `${this.kcvvPsdApi}/stats/player/${this.playerId}`
54
55
    fetch(apiUrl)
56
      .then((response) => response.json())
57
      .then((json) => this.setState({ data: json, loading: false }))
58
  }
59
60
  componentDidMount() {
61
    this.updateData()
62
  }
63
64
  renderPlayerName = (player) => (
65
    <h1 className={`player-detail__name`}>
66
      <span className={`player-detail__name-first`}>{player.field_firstname}</span>
67
      <span className={`player-detail__name-last`}>{player.field_lastname}</span>
68
    </h1>
69
  )
70
  renderPlayerImage = (player) => (
71
    <div className={`bg-green-mask`}>
72
      <div
73
        className={`player-detail__bg-avatar`}
74
        style={
75
          player.relationships.field_image && {
76
            backgroundImage: `url(${player.relationships.field_image.localFile.childImageSharp.fixed.src})`,
77
          }
78
        }
79
      />
80
      <div className={`bg-white-end`} />
81
    </div>
82
  )
83
  renderPlayerHeader = (player) => (
84
    <header className={`player-detail__header`}>
85
      {this.renderPlayerName(player)}
86
      {this.renderPlayerImage(player)}
87
88
      <div className={`player-detail__bg-shirt-number`} aria-hidden="true">
89
        {player.field_shirtnumber || ``}
90
      </div>
91
    </header>
92
  )
93
  renderPlayerStats = (player) => {
94
    if (this.state.loading === false && this.state.data) {
95
      const { playerStatistics = [] } = this.state.data
96
97
      console.log(playerStatistics.reduce((a, b) => a + b?.gamesPlayed, 0))
98
99
      return (
100
        <aside className={`player-detail__statistics`}>
101
          <section className={`player-detail__statistics-item`}>
102
            <div className={`player-detail__statistics-item__number`}>
103
              {playerStatistics.reduce((a, b) => a + (b?.gamesPlayed || 0), 0) || `0`}
104
            </div>
105
            <div className={`player-detail__statistics-item__label`}>Wedstrijden</div>
106
          </section>
107
108
          {(player.field_position === `k` || player.field_position === `d`) && (
109
            <section className={`player-detail__statistics-item`}>
110
              <div className={`player-detail__statistics-item__number`}>
111
                {playerStatistics.reduce((a, b) => a + (b?.cleanSheets || 0), 0) || `0`}
112
              </div>
113
              <div className={`player-detail__statistics-item__label`}>Cleansheets</div>
114
            </section>
115
          )}
116
          {player.field_position !== `k` && (
117
            <section className={`player-detail__statistics-item`}>
118
              <div className={`player-detail__statistics-item__number`}>
119
                {playerStatistics.reduce((a, b) => a + (b?.goals || 0), 0) || `0`}
120
              </div>
121
              <div className={`player-detail__statistics-item__label`}>Doelpunten</div>
122
            </section>
123
          )}
124
          <section className={`player-detail__statistics-item`}>
125
            <div className={`player-detail__statistics-item__number`}>
126
              {playerStatistics.reduce((a, b) => a + (b?.yellowCards || 0), 0) || `0`}
127
            </div>
128
            <div className={`player-detail__statistics-item__label`}>Gele kaarten</div>
129
          </section>
130
          <section className={`player-detail__statistics-item`}>
131
            <div className={`player-detail__statistics-item__number`}>
132
              {playerStatistics.reduce((a, b) => a + (b?.redCards || 0), 0) || `0`}
133
            </div>
134
            <div className={`player-detail__statistics-item__label`}>Rode kaarten</div>
135
          </section>
136
        </aside>
137
      )
138
    }
139
  }
140
141
  renderPlayerStatsFull = (player) => {
142
    if (this.state.loading === false && this.state.data) {
143
      const { playerStatistics = [] } = this.state.data
144
145
      return (
146
        <Card title="Statistieken" className={`player-detail__stats`} hasTable={true}>
147
          <table className={`player-detail__stats__table`}>
148
            <thead>
149
              <tr>
150
                <th className={`player-detail__column player-detail__column--string`}>Team</th>
151
                <th className={`player-detail__column player-detail__column--number show-for-medium`}>
152
                  <span title="Wedstrijden gespeeld">P</span>
153
                </th>
154
                <th className={`player-detail__column player-detail__column--number`}>
155
                  <span title="Wedstrijden gewonnen">W</span>
156
                </th>
157
                <th className={`player-detail__column player-detail__column--number`}>
158
                  <span title="Wedstrijden gelijkgespeeld">D</span>
159
                </th>
160
                <th className={`player-detail__column player-detail__column--number`}>
161
                  <span title="Wedstrijden verloren">L</span>
162
                </th>
163
                <th className={`player-detail__column player-detail__column--number`}>
164
                  <img
165
                    src={iconCardYellow}
166
                    title="Gele kaart"
167
                    alt="Gele kaart"
168
                    className="player-detail__stats--header_icon"
169
                  />
170
                </th>
171
                <th className={`player-detail__column player-detail__column--number`}>
172
                  <img
173
                    src={iconCardRed}
174
                    title="Rode kaart"
175
                    alt="Rode kaart"
176
                    className="player-detail__stats--header_icon"
177
                  />
178
                </th>
179
                <th className={`player-detail__column player-detail__column--number`}>
180
                  <img
181
                    src={iconGoal}
182
                    title="Doelpunt(en) gescoord"
183
                    alt="Doelpunt(en) gescoord"
184
                    className="player-detail__stats--header_icon"
185
                  />
186
                </th>
187
                <th className={`player-detail__column player-detail__column--number  show-for-medium`}>
188
                  <img
189
                    src={iconCleansheet}
190
                    title="Cleansheets"
191
                    alt="Cleansheets"
192
                    className="player-detail__stats--header_icon"
193
                  />
194
                </th>
195
                <th className={`player-detail__column player-detail__column--number`}>
196
                  <span title="Minuten gespeeld">
197
                    <Icon icon="fa-clock-o" />
198
                  </span>
199
                </th>
200
              </tr>
201
            </thead>
202
            <tbody>
203
              {playerStatistics.map(function (stats) {
204
                return (
205
                  <tr>
206
                    <td className={`player-detail__column player-detail__column--string`}>
207
                      {stats.team.replace(`Voetbal : `, ``)}
208
                    </td>
209
                    <td className={`player-detail__column player-detail__column--number show-for-medium`}>
210
                      {stats.gamesPlayed}
211
                    </td>
212
                    <td className={`player-detail__column player-detail__column--number`}>{stats.gamesWon}</td>
213
                    <td className={`player-detail__column player-detail__column--number`}>{stats.gamesEqual}</td>
214
                    <td className={`player-detail__column player-detail__column--number`}>{stats.gamesLost}</td>
215
                    <td className={`player-detail__column player-detail__column--number`}>{stats.yellowCards}</td>
216
                    <td className={`player-detail__column player-detail__column--number`}>{stats.redCards}</td>
217
                    <td className={`player-detail__column player-detail__column--number`}>{stats.goals}</td>
218
                    <td className={`player-detail__column player-detail__column--number show-for-medium`}>
219
                      {stats.cleanSheets}
220
                    </td>
221
                    <td className={`player-detail__column player-detail__column--number`}>{stats.minutes}'</td>
222
                  </tr>
223
                )
224
              })}
225
            </tbody>
226
          </table>
227
        </Card>
228
      )
229
    }
230
  }
231
  renderPlayerGamesFull = () => {
232
    if (this.state.loading === false && this.state.data) {
233
      const { gameReports = [] } = this.state.data
234
235
      return (
236
        <Card className={`player-detail__games`} title="Wedstrijden" hasTable={true}>
237
          <table className={`player-detail__games__table responsive-card-table`}>
238
            <thead>
239
              <tr>
240
                <th className={`player-detail__column player-detail__column--string`}>Team</th>
241
                <th className={`player-detail__column player-detail__column--string`}>Type</th>
242
                <th className={`player-detail__column player-detail__column--string`}>Datum</th>
243
                <th className={`player-detail__column player-detail__column--number`}>
244
                  <span title="Thuis/uit">H/A</span>
245
                </th>
246
                <th className={`player-detail__column player-detail__column--score`}>Score</th>
247
                <th className={`player-detail__column player-detail__column--string`}>Tegenstander</th>
248
                <th className={`player-detail__column player-detail__column--number`}>
249
                  <img
250
                    src={iconCardYellow}
251
                    title="Gele kaart"
252
                    alt="Gele kaart"
253
                    className="player-detail__stats--header_icon"
254
                  />
255
                </th>
256
                <th className={`player-detail__column player-detail__column--number`}>
257
                  <img
258
                    src={iconCardRed}
259
                    title="Rode kaart"
260
                    alt="Rode kaart"
261
                    className="player-detail__stats--header_icon"
262
                  />
263
                </th>
264
                <th className={`player-detail__column player-detail__column--number`}>
265
                  <img
266
                    src={iconGoal}
267
                    title="Doelpunten gescoord"
268
                    alt="Rode kaart"
269
                    className="player-detail__stats--header_icon"
270
                  />
271
                </th>
272
                <th className={`player-detail__column player-detail__column--number`}>
273
                  <span title="Minuten gespeeld">
274
                    <Icon icon="fa-clock-o" />
275
                  </span>
276
                </th>
277
              </tr>
278
            </thead>
279
            <tbody>
280
              {gameReports.map(function (game) {
281
                return (
282
                  <tr>
283
                    <td data-label="Team" className={`player-detail__column player-detail__column--string`}>
284
                      {game.team.replace(`Voetbal : `, ``)}
285
                    </td>
286
                    <td data-label="Type" className={`player-detail__column player-detail__column--string`}>
287
                      {game.competition}
288
                    </td>
289
                    <td data-label="Datum" className={`player-detail__column player-detail__column--string`}>
290
                      {moment(game.date).format(`DD/MM/YYYY`)}
291
                    </td>
292
                    <td data-label="Thuis/uit" className={`player-detail__column player-detail__column--number`}>
293
                      {game.home ? (
294
                        <span className={`player-detail__games__home`} title="Thuiswedstrijd">
295
                          H
296
                        </span>
297
                      ) : (
298
                        <span className={`player-detail__games__away`} title="Uitwedstrijd">
299
                          A
300
                        </span>
301
                      )}
302
                    </td>
303
                    <td data-label="Score" className={`player-detail__column player-detail__column--score`}>
304
                      {game.goalsHomeTeam}&nbsp;-&nbsp;{game.goalsAwayTeam}
305
                    </td>
306
                    <td data-label="Tegenstander" className={`player-detail__column player-detail__column--string`}>
307
                      {game.opponent}
308
                    </td>
309
                    <td data-label="Gele kaart(en)" className={`player-detail__column player-detail__column--number`}>
310
                      {game.yellowCards}
311
                    </td>
312
                    <td data-label="Rode kaart(en)" className={`player-detail__column player-detail__column--number`}>
313
                      {game.redCards}
314
                    </td>
315
                    <td data-label="Doelpunten" className={`player-detail__column player-detail__column--number`}>
316
                      {game.goals}
317
                    </td>
318
                    <td data-label="Speeltijd" className={`player-detail__column player-detail__column--number`}>
319
                      {game.minutesPlayed}'
320
                    </td>
321
                  </tr>
322
                )
323
              })}
324
            </tbody>
325
          </table>
326
        </Card>
327
      )
328
    }
329
  }
330
331
  renderPlayerBirthdate = (player) => (
332
    <div className={`player-detail__data-item player-detail__data-item--birthdate`}>
333
      <span className={`player-detail__data-item__label`}>Geboortedatum</span>
334
      <span className={`player-detail__data-item__data`}>{player.field_birth_date || `Onbekend`}</span>
335
    </div>
336
  )
337
  renderPlayerPosition = (player) => (
338
    <div className={`player-detail__data-item player-detail__data-item--position`}>
339
      <span className={`player-detail__date-item__data`}>
340
        {player.field_position && mapPositionCode(player.field_position)}
341
      </span>
342
      <span className={`player-detail__data-item__label`}>
343
        {player.relationships.node__team && (
344
          <Link to={player.relationships.node__team[0].path.alias}>{player.relationships.node__team[0].title}</Link>
345
        )}
346
      </span>
347
    </div>
348
  )
349
  renderPlayerJoinDate = (player) => {
350
    const currentlyPlaying = !player.field_date_leave
351
    return (
352
      <div className={`player-detail__data-item player-detail__data-item--joindate`}>
353
        <span className={`player-detail__data-item__label`}>
354
          {currentlyPlaying && `Speler bij KCVV sinds`}
355
          {!currentlyPlaying && `Speler tussen`}
356
        </span>
357
        <span className={`player-detail__data-item__data`}>
358
          {player.field_join_date || `Onbekend`}
359
          {!currentlyPlaying && (
360
            <>
361
              <span className={`text--regular`}> en </span> {player.field_date_leave}
362
            </>
363
          )}
364
        </span>
365
      </div>
366
    )
367
  }
368
  renderPlayerData = (player) => (
369
    <section className={`player-detail__data`}>
370
      {this.renderPlayerBirthdate(player)}
371
      {this.renderPlayerPosition(player)}
372
      {this.renderPlayerJoinDate(player)}
373
    </section>
374
  )
375
  renderPlayerBody = (player) => {
376
    const cleanBody =
377
      (player.body &&
378
        player.body.processed.replaceAll(`/sites/default/`, `${process.env.GATSBY_API_DOMAIN}/sites/default/`)) ||
379
      ``
380
381
    return (
382
      <section className={`player-detail__body`}>
383
        <div dangerouslySetInnerHTML={{ __html: cleanBody }} />
384
      </section>
385
    )
386
  }
387
  render() {
388
    const { player } = this.props
389
390
    return (
391
      <article className={`player-detail`}>
392
        {this.renderPlayerHeader(player)}
393
        {this.renderPlayerStats(player)}
394
        <div className={`player-break`}></div>
395
        {this.renderPlayerData(player)}
396
        {this.renderPlayerBody(player)}
397
        {this.renderPlayerStatsFull(player)}
398
        {this.renderPlayerGamesFull(player)}
399
      </article>
400
    )
401
  }
402
}
403
404
// Retrieve endpoint of the logo's api from the site metadata (gatsby-config.js).
405
const query = graphql`
406
  query {
407
    site {
408
      siteMetadata {
409
        kcvvPsdApi
410
      }
411
    }
412
  }
413
`
414
415
export default ({ player }) => (
416
  <StaticQuery
417
    query={query}
418
    render={(data) => (
419
      <PlayerDetail
420
        // Data is the result of our query.
421
        config={data}
422
        player={player}
423
      />
424
    )}
425
  />
426
)
427