import React, { useEffect, useState } from "react" import { useRouter } from "next/router" import { useSnapshot } from "valtio" import { appState } from "~utils/appState" import { jobGroups } from "~utils/jobGroups" import "./index.scss" // Props interface Props { currentJob?: string onChange?: (job?: Job) => void onBlur?: (event: React.ChangeEvent) => void } type GroupedJob = { [key: string]: Job[] } const JobDropdown = React.forwardRef( function useFieldSet(props, ref) { // Set up router for locale const router = useRouter() const locale = router.locale || "en" // Create snapshot of app state const { party } = useSnapshot(appState) // Set up local states for storing jobs const [currentJob, setCurrentJob] = useState() const [jobs, setJobs] = useState() const [sortedJobs, setSortedJobs] = useState() // Set current job from state on mount useEffect(() => { setCurrentJob(party.job) }, []) // Organize jobs into groups on mount useEffect(() => { const jobGroups = appState.jobs .map((job) => job.row) .filter((value, index, self) => self.indexOf(value) === index) let groupedJobs: GroupedJob = {} jobGroups.forEach((group) => { groupedJobs[group] = appState.jobs.filter((job) => job.row === group) }) setJobs(appState.jobs) setSortedJobs(groupedJobs) }, [appState]) // Set current job on mount useEffect(() => { if (jobs && props.currentJob) { const job = appState.jobs.find((job) => job.id === props.currentJob) setCurrentJob(job) } }, [appState, props.currentJob]) // Enable changing select value function handleChange(event: React.ChangeEvent) { if (jobs) { const job = jobs.find((job) => job.id === event.target.value) if (props.onChange) props.onChange(job) setCurrentJob(job) } } // Render JSX for each job option, sorted into optgroups function renderJobGroup(group: string) { const options = sortedJobs && sortedJobs[group].length > 0 && sortedJobs[group] .sort((a, b) => a.order - b.order) .map((item, i) => { return ( ) }) const groupName = jobGroups.find((g) => g.slug === group)?.name[locale] return ( {options} ) } return ( ) } ) export default JobDropdown