import { PlayerType } from 'graphql/autogen/types'; import { Membership, PersonalityType } from 'graphql/types'; import React, { useCallback, useContext, useEffect, useState } from 'react'; import { CategoryOption, SkillOption } from 'utils/skillHelpers'; type SetupOption = { label: string; title: { [any: string]: string | undefined; }; screens: Array<{ label: string; component: React.ReactNode; }>; }; type SetupContextType = { options: Array; step: number; screen: number; onNextPress: () => void; onBackPress: () => void; nextButtonLabel: string; numTotalSteps: number; skillsList: Array; personalityTypes: Array; playerTypes: Array; username: string; setUsername: React.Dispatch>; skills: Array; setSkills: React.Dispatch>>; personalityType: PersonalityType | undefined; setPersonalityType: React.Dispatch< React.SetStateAction >; playerType: PlayerType | undefined; setPlayerType: React.Dispatch>; availability: string; setAvailability: React.Dispatch>; memberships: Array | null | undefined; setMemberships: React.Dispatch< React.SetStateAction | null | undefined> >; }; export const SetupContext = React.createContext({ options: [], step: 0, screen: 0, onNextPress: () => undefined, onBackPress: () => undefined, nextButtonLabel: 'Next Step', numTotalSteps: 0, skillsList: [], personalityTypes: [], playerTypes: [], username: '', setUsername: () => undefined, skills: [], setSkills: () => undefined, personalityType: undefined, setPersonalityType: () => undefined, playerType: undefined, setPlayerType: () => undefined, availability: '', setAvailability: () => undefined, memberships: undefined, setMemberships: () => undefined, }); type Props = { options: Array; skillsList: Array; personalityTypes: Array; playerTypes: Array; }; export const SetupContextProvider: React.FC = ({ children, options, skillsList, personalityTypes, playerTypes, }) => { const [step, setStep] = useState(0); const [screen, setScreen] = useState(0); const numTotalSteps = options.length; const [nextButtonLabel, setNextButtonLabel] = useState('Next Step'); useEffect(() => { const numScreens = options[step].screens.length; if (step >= numTotalSteps - 1) { setNextButtonLabel(options[(step + 1) % numTotalSteps].label); } if (screen + 1 >= numScreens) { setNextButtonLabel(`Next: ${options[(step + 1) % numTotalSteps].label}`); } else { setNextButtonLabel( `Next: ${options[step].screens[(screen + 1) % numScreens].label}`, ); } }, [options, step, screen, setNextButtonLabel, numTotalSteps]); const onNextPress = useCallback(() => { const numScreens = options[step].screens.length; if (step >= numTotalSteps - 1 && screen >= numScreens - 1) return; if (screen + 1 >= numScreens) { setStep((step + 1) % numTotalSteps); setScreen(0); } else { setScreen((screen + 1) % numScreens); } }, [options, step, screen, setStep, setScreen, numTotalSteps]); const onBackPress = useCallback(() => { if (step <= 0 && screen <= 0) return; const numScreens = options[step].screens.length; if (screen <= 0) { setStep((step - 1) % numTotalSteps); setScreen(options[(step - 1) % numTotalSteps].screens.length - 1); } else { setScreen((screen - 1) % numScreens); } }, [options, step, screen, setStep, setScreen, numTotalSteps]); const [username, setUsername] = useState(''); const [skills, setSkills] = useState>([]); const [personalityType, setPersonalityType] = useState(); const [playerType, setPlayerType] = useState(); const [availability, setAvailability] = useState(''); const [memberships, setMemberships] = useState< Array | null | undefined >(); return ( {children} ); }; export const useSetupFlow = (): SetupContextType => useContext(SetupContext);