diff --git a/packages/web/components/RegisterPlayer.tsx b/packages/web/components/RegisterPlayer.tsx index ace5c9e8..4781a128 100644 --- a/packages/web/components/RegisterPlayer.tsx +++ b/packages/web/components/RegisterPlayer.tsx @@ -5,7 +5,7 @@ import { Icon3box, MetaHeading, } from '@metafam/ds'; -import NextLink from 'next/link'; +import { useRouter } from 'next/router'; import React from 'react'; import { FlexContainer } from './Container'; @@ -30,10 +30,21 @@ export const RegisterPlayer: React.FC = () => { type ButtonProps = React.ComponentProps; -const RegisterButton: React.FC = ({ children, ...props }) => ( - - - -); + ); +}; diff --git a/packages/web/components/SetupDone.tsx b/packages/web/components/SetupDone.tsx index 3cf710bf..a5cec5cc 100644 --- a/packages/web/components/SetupDone.tsx +++ b/packages/web/components/SetupDone.tsx @@ -1,16 +1,15 @@ import { MetaButton, MetaHeading } from '@metafam/ds'; -import NextLink from 'next/link'; +import { useRouter } from 'next/router'; import React from 'react'; import { FlexContainer } from './Container'; export const SetupDone: React.FC = () => { + const router = useRouter(); return ( Game on! - - Play - + router.push('/')}>Play ); }; diff --git a/packages/web/components/SetupHeader.tsx b/packages/web/components/SetupHeader.tsx index b14d5455..2a35eb7a 100644 --- a/packages/web/components/SetupHeader.tsx +++ b/packages/web/components/SetupHeader.tsx @@ -1,49 +1,64 @@ import { Box, Flex, Grid, Image, ResponsiveText } from '@metafam/ds'; -import React from 'react'; +import React, { useContext } from 'react'; +import { SetupContext } from '../contexts/SetupContext'; import AvatarImage from '../public/images/avatar.png'; import BackImage from '../public/images/Back.svg'; import SkipImage from '../public/images/Skip.svg'; import { FlexContainer } from './Container'; -interface HeaderProps { - step: number; - progress: number; -} - -export const SetupHeader: React.FC = ({ step, progress }) => ( - - - - - 0} - progress={step > 0 ? 1 : progress} - /> - 1} - progress={step > 1 ? 1 : progress} - /> - - - - - -); +export const SetupHeader: React.FC = () => { + const { step, progress, setStep, numTotalSteps } = useContext(SetupContext); + return ( + + { + if (step > 0) { + setStep((_step) => (_step - 1) % numTotalSteps); + } + }} + cursor="pointer" + > + + + 0} + progress={step > 0 ? 1 : progress} + /> + 1} + progress={step > 1 ? 1 : progress} + /> + + { + if ((step + 1) % numTotalSteps !== 0) { + setStep((_step) => (_step + 1) % numTotalSteps); + } + }} + cursor="pointer" + > + + + + ); +}; interface StepProps { title: any[] | Record; diff --git a/packages/web/components/SetupPersonality.tsx b/packages/web/components/SetupPersonality.tsx index 56d34d35..d9996df6 100644 --- a/packages/web/components/SetupPersonality.tsx +++ b/packages/web/components/SetupPersonality.tsx @@ -1,41 +1,20 @@ import { MetaButton, MetaHeading } from '@metafam/ds'; -import React, { useEffect, useState } from 'react'; +import React, { useContext } from 'react'; +import { SetupContext } from '../contexts/SetupContext'; import { FlexContainer } from './Container'; -interface Props { - setStep: React.Dispatch>; - setProgress: React.Dispatch>; -} - -export const SetupPersonality: React.FC = ({ setStep, setProgress }) => { +export const SetupPersonality: React.FC = () => { + const { useProgress } = useContext(SetupContext); const numProgressSteps = 2; - const [progressStep, setProgressStep] = useState(0); - - useEffect(() => { - const progressValue = (progressStep + 1) / numProgressSteps; - setProgress(progressValue); - }, [progressStep, setProgress]); - + const [currentProgress, onNextPress] = useProgress(numProgressSteps); return ( - {progressStep === 0 && ( + {currentProgress === 0 && ( Personality type )} - {progressStep === 1 && Player type} - - setProgressStep( - (_progressStep) => (_progressStep + 1) % numProgressSteps, - ) - } - > - Progress - - setStep((_step) => (_step + 1) % 4)}> - Next Step - + {currentProgress === 1 && Player type} + Next Step ); }; diff --git a/packages/web/components/SetupProfession.tsx b/packages/web/components/SetupProfession.tsx index a7d29813..68c1864b 100644 --- a/packages/web/components/SetupProfession.tsx +++ b/packages/web/components/SetupProfession.tsx @@ -1,42 +1,22 @@ import { MetaButton, MetaHeading } from '@metafam/ds'; -import React, { useEffect, useState } from 'react'; +import React, { useContext } from 'react'; +import { SetupContext } from '../contexts/SetupContext'; import { FlexContainer } from './Container'; -interface Props { - setStep: React.Dispatch>; - setProgress: React.Dispatch>; -} - -export const SetupProfession: React.FC = ({ setStep, setProgress }) => { +export const SetupProfession: React.FC = () => { + const { useProgress } = useContext(SetupContext); const numProgressSteps = 3; - const [progressStep, setProgressStep] = useState(0); - - useEffect(() => { - const progressValue = (progressStep + 1) / numProgressSteps; - setProgress(progressValue); - }, [progressStep, setProgress]); + const [currentProgress, onNextPress] = useProgress(numProgressSteps); return ( - {progressStep === 0 && ( + {currentProgress === 0 && ( What are your superpowers? )} - {progressStep === 1 && Availability} - {progressStep === 2 && Memberships} - - setProgressStep( - (_progressStep) => (_progressStep + 1) % numProgressSteps, - ) - } - > - Progress - - setStep((_step) => (_step + 1) % 4)}> - Next Step - + {currentProgress === 1 && Availability} + {currentProgress === 2 && Memberships} + Next Step ); }; diff --git a/packages/web/components/SuccessPlayer.tsx b/packages/web/components/SuccessPlayer.tsx index 76c7d8b4..9771e856 100644 --- a/packages/web/components/SuccessPlayer.tsx +++ b/packages/web/components/SuccessPlayer.tsx @@ -1,5 +1,5 @@ import { Image, MetaButton, MetaHeading, Text } from '@metafam/ds'; -import NextLink from 'next/link'; +import { useRouter } from 'next/router'; import React from 'react'; import AvatarImage from '../public/images/avatar.png'; @@ -7,15 +7,14 @@ import { FlexContainer } from './Container'; import { MetaLink } from './Link'; export const SuccessPlayer: React.FC = () => { + const router = useRouter(); return ( Success! - - - Set up your profile - - + router.push('/profile/setup')}> + Set up your profile + {`I'll do this later. `} Go to my profile diff --git a/packages/web/contexts/SetupContext.tsx b/packages/web/contexts/SetupContext.tsx new file mode 100644 index 00000000..af9a2988 --- /dev/null +++ b/packages/web/contexts/SetupContext.tsx @@ -0,0 +1,61 @@ +import React, { useEffect, useState } from 'react'; + +type SetupContextType = { + useProgress: (numProgressSteps: number) => any[]; + step: number; + progress: number; + setStep: React.Dispatch>; + setProgress: React.Dispatch>; + numTotalSteps: number; +}; + +export const SetupContext = React.createContext({ + useProgress: (numProgressSteps: number) => [numProgressSteps], + step: 0, + progress: 0, + setStep: () => undefined, + setProgress: () => undefined, + numTotalSteps: 0, +}); + +export const SetupContextProvider: React.FC = ({ children }) => { + const [step, setStep] = useState(0); + const [progress, setProgress] = useState(0.5); + const numTotalSteps = 3; + + const useProgress = (numProgressSteps: number) => { + const [currentProgress, setCurrentProgress] = useState(0); + + useEffect(() => { + const progressValue = (currentProgress + 1) / numProgressSteps; + setProgress(progressValue); + }, [currentProgress, numProgressSteps]); + + const onNextPress = () => { + if ((currentProgress + 1) % numProgressSteps === 0) { + setStep((_step) => (_step + 1) % numTotalSteps); + } else { + setCurrentProgress( + (_currentProgress) => (_currentProgress + 1) % numProgressSteps, + ); + } + }; + + return [currentProgress, onNextPress]; + }; + + return ( + + {children} + + ); +}; diff --git a/packages/web/pages/profile/setup.tsx b/packages/web/pages/profile/setup.tsx index de4712f4..fa57752f 100644 --- a/packages/web/pages/profile/setup.tsx +++ b/packages/web/pages/profile/setup.tsx @@ -1,29 +1,32 @@ -import React, { useState } from 'react'; +import React, { useContext } from 'react'; import { PageContainer } from '../../components/Container'; import { SetupDone } from '../../components/SetupDone'; import { SetupHeader } from '../../components/SetupHeader'; import { SetupPersonality } from '../../components/SetupPersonality'; import { SetupProfession } from '../../components/SetupProfession'; +import { + SetupContext, + SetupContextProvider, +} from '../../contexts/SetupContext'; import BackgroundImage from '../../public/images/profile-background.jpg'; const ProfileSetup: React.FC = () => { - const [step, setStep] = useState(0); - const [progress, setProgress] = useState(0.33); - + const { step, numTotalSteps } = useContext(SetupContext); return ( - {step % 3 !== 2 && } - - {step === 0 && ( - - )} - {step === 1 && ( - - )} + {(step + 1) % numTotalSteps !== 0 && } + {step === 0 && } + {step === 1 && } {step === 2 && } ); }; -export default ProfileSetup; +const ProfileSetupWithContext: React.FC = () => ( + + + +); + +export default ProfileSetupWithContext;