Skip to content

Commit 353a893

Browse files
committed
Add jank multi step form
1 parent b5a6495 commit 353a893

File tree

4 files changed

+113
-31
lines changed

4 files changed

+113
-31
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,21 @@
11
import { useRouter } from 'next/router'
22
import { useRef, useState } from 'react'
3-
import { Alert, Button, Heading } from 'theme-ui'
3+
import { Alert, Heading } from 'theme-ui'
44
import FormContainer from './form-container'
55
import OrganizationInfoForm from './org-form'
66
import PersonalInfoForm from './personal-form'
77
import { onSubmit } from './submit'
88
import Callout from './callout'
99
import TeenagerOrAdultForm from './teenager-or-adult-form'
10+
import { useMultiStepContext } from './multi-step-context'
11+
import MultiStepForm from './multi-step-form'
1012

1113
export default function ApplicationForm() {
1214
const router = useRouter()
1315
const formContainer = useRef()
1416
const [formError, setFormError] = useState(null)
1517
const [isSubmitting, setIsSubmitting] = useState(false)
18+
const { step } = useMultiStepContext()
1619

1720
const requiredFields = [
1821
'eventName',
@@ -45,35 +48,29 @@ export default function ApplicationForm() {
4548
})
4649
}
4750
>
48-
<Callout />
49-
50-
<TeenagerOrAdultForm requiredFields={requiredFields} />
51-
52-
<Heading as="h2" variant="headline" sx={{ mb: -2 }}>
53-
Your organization
54-
</Heading>
55-
<OrganizationInfoForm requiredFields={requiredFields} />
56-
<Heading as="h2" variant="headline" sx={{ mb: -2 }}>
57-
Personal details
58-
</Heading>
59-
<PersonalInfoForm requiredFields={requiredFields} />
60-
{formError && <Alert bg="primary">{formError}</Alert>}
61-
<Button
62-
variant="ctaLg"
63-
type="submit"
64-
disabled={isSubmitting}
65-
sx={{
66-
backgroundImage: theme => theme.util.gx('cyan', 'blue'),
67-
'&:disabled': {
68-
background: 'muted',
69-
cursor: 'not-allowed',
70-
transform: 'none !important'
71-
},
72-
width: 'fit-content'
73-
}}
74-
>
75-
{isSubmitting ? 'Submitting…' : 'Submit'}
76-
</Button>
51+
<MultiStepForm maxSteps={3} isSubmitting={isSubmitting}>
52+
{step === 1 ? (
53+
<>
54+
<Callout />
55+
<TeenagerOrAdultForm requiredFields={requiredFields} />
56+
</>
57+
) : step === 2 ? (
58+
<>
59+
<Heading as="h2" variant="headline" sx={{ mb: -2 }}>
60+
Your organization
61+
</Heading>
62+
<OrganizationInfoForm requiredFields={requiredFields} />
63+
</>
64+
) : (
65+
<>
66+
<Heading as="h2" variant="headline" sx={{ mb: -2 }}>
67+
Personal details
68+
</Heading>
69+
<PersonalInfoForm requiredFields={requiredFields} />
70+
{formError && <Alert bg="primary">{formError}</Alert>}
71+
</>
72+
)}
73+
</MultiStepForm>
7774
</FormContainer>
7875
)
7976
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { createContext, useContext, useState } from 'react'
2+
3+
const MultiStepContext = createContext()
4+
const useMultiStepContext = () => useContext(MultiStepContext)
5+
6+
const MultiStepProvider = ({ children }) => {
7+
const [step, setStep] = useState(1)
8+
const modifyStep = direction => {
9+
setStep(step + direction) // either 1 or -1
10+
}
11+
12+
return (
13+
<MultiStepContext.Provider value={{ step, modifyStep }}>
14+
{children}
15+
</MultiStepContext.Provider>
16+
)
17+
}
18+
19+
export { MultiStepProvider, useMultiStepContext }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { Box, Button } from 'theme-ui'
2+
import { useMultiStepContext } from './multi-step-context'
3+
4+
export default function MultiStepForm({ isSubmitting, maxSteps, children }) {
5+
const { step, modifyStep } = useMultiStepContext()
6+
// TODO: it shows form validation errors whens switching to a new page
7+
8+
return (
9+
<>
10+
{children}
11+
12+
<Box
13+
sx={{
14+
display: 'flex',
15+
gap: '1rem',
16+
marginTop: '2rem',
17+
marginLeft: 'auto'
18+
}}
19+
>
20+
{step > 1 && (
21+
<Button
22+
variant="outline"
23+
onClick={() => {
24+
modifyStep(-1)
25+
}}
26+
>
27+
Back
28+
</Button>
29+
)}
30+
31+
{step < maxSteps && (
32+
<Button
33+
variant="primary"
34+
onClick={() => {
35+
modifyStep(1)
36+
}}
37+
>
38+
Next
39+
</Button>
40+
)}
41+
42+
{step === maxSteps && (
43+
<Button
44+
variant="ctaLg"
45+
type="submit"
46+
disabled={isSubmitting}
47+
sx={{
48+
backgroundImage: theme => theme.util.gx('cyan', 'blue'),
49+
'&:disabled': {
50+
background: 'muted',
51+
cursor: 'not-allowed',
52+
transform: 'none !important'
53+
},
54+
width: 'fit-content'
55+
}}
56+
>
57+
{isSubmitting ? 'Submitting…' : 'Submit'}
58+
</Button>
59+
)}
60+
</Box>
61+
</>
62+
)
63+
}

pages/fiscal-sponsorship/apply/index.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import HCBInfo from '../../../components/fiscal-sponsorship/apply/hcb-info'
88
import Watermark from '../../../components/fiscal-sponsorship/apply/watermark'
99
import ContactBanner from '../../../components/fiscal-sponsorship/contact'
1010
import ApplicationForm from '../../../components/fiscal-sponsorship/apply/application-form'
11+
import { MultiStepProvider } from '../../../components/fiscal-sponsorship/apply/multi-step-context'
1112

1213
export default function Apply() {
1314
return (
@@ -84,7 +85,9 @@ export default function Apply() {
8485
sx={{ borderRadius: 'default', bg: 'snow', width: 'fit-content' }}
8586
/>
8687
</Flex>
87-
<ApplicationForm />
88+
<MultiStepProvider>
89+
<ApplicationForm />
90+
</MultiStepProvider>
8891
</Grid>
8992
<Watermark />
9093
</>

0 commit comments

Comments
 (0)