Passed
Push — feature/calendar-creator ( 3a297a )
by Kevin Van
05:41
created

src/pages/calendar.tsx   A

Complexity

Total Complexity 4
Complexity/F 0

Size

Lines of Code 115
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 4
eloc 89
mnd 4
bc 4
fnc 0
dl 0
loc 115
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
rs 10
1
import React, { FunctionComponent, useState } from "react"
2
import QRCode from "qrcode.react"
3
import Layout from "../layouts/index"
4
import SEO from "../components/seo"
5
import { graphql, useStaticQuery } from "gatsby"
6
import Select, { ValueType } from "react-select"
7
import { TeamsListProps } from "../types/pages.types"
8
9
const CalendarForm: FunctionComponent = () => {
10
  const calendarUrl = `https://footbalisto.be/calendar`
11
  const [teamsSelected, setTeamSelected] = useState<string[]>([])
12
  const [sideSelected, setSideSelected] = useState<string>(``)
13
14
  const sides = [
15
    { value: `home`, label: `Alleen thuiswedstrijden` },
16
    { value: `away`, label: `Alleen uitwedstrijden` },
17
    { value: `all`, label: `Alle wedstrijden` },
18
  ]
19
  const { teamEdges }: TeamsListProps = useStaticQuery(graphql`
20
    query {
21
      teamEdges: allNodeTeam(filter: { field_vv_id: { ne: null } }) {
22
        edges {
23
          node {
24
            field_division_full
25
            field_vv_id
26
            title
27
          }
28
        }
29
      }
30
    }
31
  `)
32
33
  const teams = teamEdges.edges.map(({ node }) => ({
34
    value: node.field_vv_id,
35
    label: `${node.title} ${node.field_division_full !== null ? `(${node.field_division_full})` : ``}`,
36
  }))
37
38
  const handleSideChange = (inputValue: { value: string; label: string } | null) => {
39
    if (inputValue?.value) {
40
      setSideSelected(inputValue.value)
41
    } else {
42
      setSideSelected(`all`)
43
    }
44
  }
45
46
  const handleTeamsChange = (inputValue: ValueType<{ value: string; label: string }, boolean>) => {
47
    if (Array.isArray(inputValue)) {
48
      setTeamSelected(inputValue.map(({ value }) => value))
49
    } else {
50
      setTeamSelected([])
51
    }
52
  }
53
54
  return (
55
    <div>
56
      <form>
57
        <p>
58
          <label htmlFor="calendar__sides">Wedstrijden:</label>
59
        </p>
60
        <Select
61
          options={sides}
62
          name="sides"
63
          id="calendar__sides"
64
          className="select__input"
65
          onChange={handleSideChange}
66
        />
67
        <p>
68
          <label htmlFor="calendar__teams">Teams:</label>
69
        </p>
70
        <Select
71
          options={teams}
72
          isMulti
73
          name="teams"
74
          id="calendar__teams"
75
          className="select__input"
76
          onChange={handleTeamsChange}
77
        />
78
      </form>
79
      <p>
80
        Calendar:{` `}
81
        <a
82
          href={`webcal://${calendarUrl}?teams=${teamsSelected}&side=${sideSelected}`}
83
        >{`webcal://${calendarUrl}?teams=${teamsSelected}&side=${sideSelected}`}</a>
84
      </p>
85
      <p>
86
        <QRCode value={`webcal://${calendarUrl}?teams=${teamsSelected}&side=${sideSelected}`} />
87
      </p>
88
    </div>
89
  )
90
}
91
92
const CalendarPage: FunctionComponent = () => {
93
  return (
94
    <Layout>
95
      <SEO
96
        lang="nl-BE"
97
        title="Maak uw eigen kalender"
98
        description="Stel een eigen seizoenskalender samen met de teams die jou interesseren."
99
        path="calendar"
100
      />
101
102
      <div className={`limited-width_wrapper`}>
103
        <header>
104
          <h1>Stel je kalender samen</h1>
105
        </header>
106
        <main>
107
          <CalendarForm />
108
        </main>
109
      </div>
110
    </Layout>
111
  )
112
}
113
114
export default CalendarPage
115