madnight/githut

View on GitHub
src/components/Select.js

Summary

Maintainability
A
3 hrs
Test Coverage
import { useState, useEffect } from "react";
import ReactSelect from "react-select"
import { range, toString } from "lodash/fp"
import { getMaxDataDate } from "common/utils.js"

export default function Select(props) {
    const year = props.year
    const [state, setState] = useState({})

    function vals(start, end) {
        return range(--start, end).map((i) => ({
            value: toString(i + 1),
            label: toString(i + 1),
        }))
    }

    function setValue(value) {
        const [_, dispatch] = props.hist

        dispatch({ type: year ? "setYear" : "setQuarter", payload: value })
        setState({ ...state, value: value })
    }

    useEffect(() => {
        getMaxDataDate().then((maxDate) => {
            setState({
                ...state,
                options: year ? vals(2014, maxDate.year) : vals(1, 4),
                value: year
                    ? props.match.params.year
                    : props.match.params.quarter,
            })
        })
        const { params } = props.match
        setValue(year ? params.year : params.quarter)
    }, [])

    function histPush(x, y, z) {
        const { params } = props.match
        const lang = (params.lang ?  ("/" + params.lang) : "")
        props.history.push("/" + x + "/" + y + "/" + z + lang)
    }

    function onChange({ value }) {
        const { params } = props.match
        setValue(value)
        if (year) {
            histPush(params.event, value, params.quarter)
        } else {
            histPush(params.event, params.year, value)
        }
    }

    if (!state) return null
    const styles = {
        control: (provided) => ({ ...provided, height: 38 }),
        valueContainer: (provided) => ({ ...provided, height: 38 }),
    }
    return (
        <div style={{ width: "200px", paddingRight: "20px" }}>
            <h4 className="section-heading">{year ? "Year" : "Quarter"}</h4>
            <ReactSelect
                styles={styles}
                onChange={onChange}
                options={state.options}
                searchable={false}
                clearable={false}
                value={{ value: state.value, label: state.value }}
            />
        </div>
    )
}