Passed
Push — feature/share-pages ( ea9437 )
by Kevin Van
05:36
created

PlayerShare.render   A

Complexity

Conditions 1

Size

Total Lines 31
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

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