src/pages/share.tsx   A
last analyzed

Complexity

Total Complexity 3
Complexity/F 0

Size

Lines of Code 142
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 3
eloc 111
mnd 3
bc 3
fnc 0
dl 0
loc 142
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
rs 10
1
import { graphql, useStaticQuery } from "gatsby"
2
import React, { useState } from "react"
3
import { Seo } from "../components/Seo"
4
import { Spinner } from "../components/Spinner"
5
import Layout from "../layouts"
6
import { PlayerListProps } from "../Types/Player"
7
import Select from "react-select"
8
9
import "./share.scss"
10
11
const ShareForm = () => {
12
  const templateUrl = `https://footbalisto.be/share/instagram/`
13
14
  const [playerSelected, setPlayerSelected] = useState<string>(``)
15
  const [score, setScore] = useState<string>(``)
16
  const [match, setMatch] = useState<string>(``)
17
  const [imageUrl, setImageUrl] = useState<string>(``)
18
  const [imageLoading, setImageLoading] = useState<boolean>(false)
19
20
  const { playerEdges }: PlayerListProps = useStaticQuery(graphql`
21
    query {
22
      playerEdges: allNodePlayer(filter: { field_vv_id: { ne: null } }) {
23
        edges {
24
          node {
25
            path {
26
              alias
27
            }
28
            field_firstname
29
            field_lastname
30
          }
31
        }
32
      }
33
    }
34
  `)
35
36
  const players = playerEdges.edges.map(({ node }) => ({
37
    value: node.path.alias,
38
    label: `${node.field_firstname} ${node.field_lastname}`,
39
  }))
40
41
  const handlePlayerChange = (inputValue: { value: string; label: string } | null) => {
42
    if (inputValue?.value) {
43
      setPlayerSelected(inputValue.value.replace(`/player/`, ``))
44
    } else {
45
      setPlayerSelected(``)
46
    }
47
  }
48
49
  const handleMatchChange = (event: { target: { value: React.SetStateAction<string> } }) => {
50
    setMatch(event.target.value)
51
  }
52
53
  const handleScoreChange = (event: { target: { value: React.SetStateAction<string> } }) => {
54
    setScore(event.target.value)
55
  }
56
57
  const handleGenerateImage = (event: React.MouseEvent<HTMLButtonElement>) => {
58
    event.preventDefault()
59
    if (match !== `` && score !== `` && playerSelected !== ``) {
60
      setImageUrl(``)
61
      setImageUrl(`${templateUrl}${playerSelected}?score=${score}&match=${match}`)
62
      setImageLoading(true)
63
    }
64
  }
65
66
  const handleImageLoaded = () => {
67
    setImageLoading(false)
68
  }
69
70
  return (
71
    <div>
72
      <form>
73
        <p>
74
          <label htmlFor="share__player">Speler:</label>
75
          <Select
76
            options={players}
77
            name="player"
78
            id="share__player"
79
            className="select__input"
80
            onChange={handlePlayerChange}
81
          />
82
        </p>
83
        <p>
84
          <label htmlFor="share__game">Wedstrijd:</label>
85
          <input
86
            id="share__game"
87
            onChange={handleMatchChange}
88
            className={`input__input`}
89
            placeholder="KCVV Elewijt - KFC Eppegem"
90
            value={match}
91
            required={true}
92
          />
93
        </p>
94
        <p>
95
          <label htmlFor="share__score">Score:</label>
96
          <input
97
            id="share__score"
98
            onChange={handleScoreChange}
99
            className={`input__input`}
100
            placeholder="2 — 0"
101
            value={score}
102
            required={true}
103
          />
104
        </p>
105
        <p>
106
          <button onClick={handleGenerateImage} className="btn">
107
            Creëer afbeelding.
108
          </button>
109
        </p>
110
      </form>
111
112
      <p>
113
        {imageLoading && <Spinner />}
114
        {imageUrl && <img src={imageUrl} onLoad={handleImageLoaded} />}
115
      </p>
116
    </div>
117
  )
118
}
119
120
const SharePage = () => (
121
  <Layout>
122
    <header className="page_header__wrapper">
123
      <div className="page_header">
124
        <h1>Creëer afbeelding</h1>
125
      </div>
126
    </header>
127
    <div className="share__wrapper page__wrapper page__wrapper--limited page__section">
128
      <ShareForm />
129
    </div>
130
  </Layout>
131
)
132
133
export const Head = () => (
134
  <Seo
135
    title="Creëer instagram goal story"
136
    description="Creëer een nieuwe instagram story voor een doelpunt."
137
    path="/share"
138
  />
139
)
140
141
export default SharePage
142