import { FC, memo, ReactNode, useCallback, useEffect, useRef, useState } from "react" import classnames from "classnames" import get from "lodash/get" import includes from "lodash/includes" import without from "lodash/without" import set from "lodash/set" import styles from "./styles.module.scss" import { useUserHosting, nightList, NightOption, nightChoiceSelectionDefaultState, NightChoices, bedList, hostLocations, } from "../hosting.utils" import FormButton from "../../Form/FormButton/FormButton" import { fetchVolunteerHostingSetIfNeed } from "../../../store/volunteerHostingSet" import IgnoreButton from "../../Form/IgnoreButton/IgnoreButton" type Props = { children?: ReactNode | undefined afterSubmit?: () => void | undefined } const HostingForm: FC = ({ children, afterSubmit }): JSX.Element => { const [hostingType, setHostingType] = useState("") const canHostCountRef = useRef(null) const [nights, setNights] = useState(nightChoiceSelectionDefaultState) const cohostVolunteerRef = useRef(null) const petAllergiesRef = useRef(null) const [backProblems, setBackProblems] = useState(false) const [bedType, setBedType] = useState([]) const [isolatedBed, setIsolatedBed] = useState(false) const bedConfigurationRef = useRef(null) const hostAddressRef = useRef(null) const transportTypeRef = useRef(null) const [festivalProximity, setFestivalProximity] = useState("") const distanceToFestivalRef = useRef(null) const [hostingAbsoluteNeed, setHostingAbsoluteNeed] = useState(false) const hostingNeedReasonRef = useRef(null) const [userWishes, saveWishes] = useUserHosting() useEffect(() => { if (!userWishes) return setHostingType(get(userWishes, "hostingType", "")) const hostingNights = get(userWishes, "hostingNights", "") as string const newNights = hostingNights.split("").reduce( (acc: NightChoices, abbr: string) => ({ ...acc, [abbr]: true, }), {} as NightChoices ) setNights(newNights) setBedType(get(userWishes, "bedType", [])) setBackProblems(get(userWishes, "backProblems", false)) set(canHostCountRef, "current.value", `${get(userWishes, "canHostCount", 0)}`) set(cohostVolunteerRef, "current.value", get(userWishes, "cohostVolunteer", "")) set(petAllergiesRef, "current.value", get(userWishes, "petAllergies", "")) set(bedConfigurationRef, "current.value", get(userWishes, "bedConfiguration", "")) set(hostAddressRef, "current.value", get(userWishes, "hostAddress", "")) set(transportTypeRef, "current.value", get(userWishes, "transportType", "")) setFestivalProximity(get(userWishes, "festivalProximity", "")) set(distanceToFestivalRef, "current.value", get(userWishes, "distanceToFestival", "")) set(hostingNeedReasonRef, "current.value", get(userWishes, "hostingNeedReason", "")) setHostingAbsoluteNeed(get(userWishes, "hostingAbsoluteNeed", false)) }, [userWishes]) const onHostingTypeChange = useCallback((newHostingType: string) => { setHostingType(newHostingType) }, []) const onBackProblemsChange = useCallback((newBackProblems: boolean) => { setBackProblems(newBackProblems) }, []) const onNightClick = useCallback( (changes: NightChoices) => { setNights({ ...nights, ...changes, }) }, [nights, setNights] ) function isNightUnselected(abbr: string): boolean { return !nights[abbr] && !nights[abbr.toLowerCase()] } function isNightSelected(abbr: string): boolean { return nights[abbr] } const onBedTypeChange = useCallback( (bed: string) => { if (includes(bedType, bed)) { setBedType(without(bedType, bed)) } else { setBedType([...bedType, bed]) } }, [bedType] ) const onIsolatedBedChange = useCallback((newIsolatedBed: boolean) => { setIsolatedBed(newIsolatedBed) }, []) const onHostingAbsoluteNeedChange = useCallback((newHostingAbsoluteNeed: boolean) => { setHostingAbsoluteNeed(newHostingAbsoluteNeed) }, []) const onFestivalProximityChange = useCallback((newFestivalProximity: string) => { setFestivalProximity(newFestivalProximity) }, []) const onChoiceSubmit = useCallback(() => { const canHostCount = +get(canHostCountRef, "current.value", "0") const cohostVolunteer = get(cohostVolunteerRef, "current.value", "") const bedConfiguration = get(bedConfigurationRef, "current.value", "") const hostingNights = nightList.reduce((res, { abbr }) => { if (nights[abbr]) { res += abbr } if (nights[abbr.toLowerCase()]) { res += abbr.toLowerCase() } return res }, "") const hostAddress = get(hostAddressRef, "current.value", "") const petAllergies = get(petAllergiesRef, "current.value", "") const transportType = get(transportTypeRef, "current.value", "") const distanceToFestival = get(distanceToFestivalRef, "current.value", "") const hostingNeedReason = get(hostingNeedReasonRef, "current.value", "") saveWishes( hostingType, canHostCount, cohostVolunteer, backProblems, hostingNights, bedType, isolatedBed, bedConfiguration, hostAddress, petAllergies, transportType, festivalProximity, distanceToFestival, hostingNeedReason, hostingAbsoluteNeed ) if (afterSubmit) afterSubmit() }, [ saveWishes, hostingType, backProblems, bedType, isolatedBed, festivalProximity, hostingAbsoluteNeed, afterSubmit, nights, ]) const getNightElement = (option: NightOption, maybeText: string): JSX.Element => (
{option.title}
) return (
Mon hébergement
Combien de bénévoles peux-tu héberger ?
As-tu un animal de compagnie ? (Possibles allergies ou phobies) ?
As-tu des problèmes de dos ?
{nightList.map((nightOption) => getNightElement( nightOption, hostingType === "need" ? " J'aimerai bien mais pas obligatoire" : " Je peux mais ça ne m'arrange pas trop" ) )}
Le couchage que tu proposes est-il :
{bedList.map((bed) => ( ))}
Le couchage est-il dans une pièce séparée ?
Si tu peux héberger plusieurs bénévoles, quelle est la configuration des couchages proposés ?