Skip to content

Commit a0e7f49

Browse files
authored
Add form provider (#24)
* react-hook-form을 wrapping한 FormProvider 컴포넌트 추가 * 기존 코드에서 FormProvider만 사용한 방법으로 변경
1 parent 7db646f commit a0e7f49

File tree

4 files changed

+75
-58
lines changed

4 files changed

+75
-58
lines changed

components/FormProvider.tsx

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import React from 'react';
2+
3+
import {
4+
FormProvider as ReactHookFormProvider,
5+
useForm,
6+
} from 'react-hook-form';
7+
8+
const DEFAULT_FORM_VALUES: FormValues = {
9+
liveMode: true,
10+
date: '',
11+
size: '',
12+
theme: 'basic',
13+
rotate: '0',
14+
} as const;
15+
16+
type Props = {
17+
defaultValues?: FormValues;
18+
children: React.ReactNode;
19+
};
20+
21+
function FormProvider({
22+
defaultValues = DEFAULT_FORM_VALUES,
23+
children,
24+
}: Props) {
25+
const formMethods = useForm<FormValues>({
26+
defaultValues,
27+
});
28+
29+
return (
30+
<ReactHookFormProvider {...formMethods}>{children}</ReactHookFormProvider>
31+
);
32+
}
33+
34+
export default FormProvider;

components/MoonForm.tsx

+5-25
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,19 @@
11
import React, { useEffect } from 'react';
22

33
import { debounce } from 'utils';
4-
import { objectToQueryString } from 'utils/string';
5-
6-
import { FormProvider, useForm } from 'react-hook-form';
4+
import { useFormContext } from 'react-hook-form';
75
import ControlledLiveToggle from 'components/ControlledLiveToggle';
86
import FormItem from './FormItem';
97

108
const DEFAULT_FORM_KEYS: FormKeys[] = ['theme', 'size', 'rotate'];
119

12-
const DEFAULT_FORM_VALUES: FormValues = {
13-
liveMode: true,
14-
date: '',
15-
size: '',
16-
theme: 'basic',
17-
rotate: '0',
18-
} as const;
19-
2010
type Props = {
21-
defaultValues?: FormValues;
2211
keys?: FormKeys[];
2312
onChange: (v: FormValues) => void;
2413
};
2514

26-
function MoonForm({
27-
keys = DEFAULT_FORM_KEYS,
28-
defaultValues = DEFAULT_FORM_VALUES,
29-
onChange,
30-
}: Props) {
31-
const formMethods = useForm<FormValues>({
32-
defaultValues,
33-
});
34-
35-
const { register, watch } = formMethods;
36-
15+
function MoonForm({ keys = DEFAULT_FORM_KEYS, onChange }: Props) {
16+
const { register, watch } = useFormContext();
3717
const liveMode = watch('liveMode');
3818

3919
useEffect(() => {
@@ -109,12 +89,12 @@ function MoonForm({
10989
};
11090

11191
return (
112-
<FormProvider {...formMethods}>
92+
<>
11393
{/* TODO: date도 item으로 관리할 수 있도록 변경 */}
11494
<ControlledLiveToggle name="liveMode" />
11595
{!liveMode && formItemMap.date}
11696
{keys.map((key) => formItemMap[key])}
117-
</FormProvider>
97+
</>
11898
);
11999
}
120100

pages/index.tsx

+20-16
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import OgTags from 'components/OgTags';
1010
import MoonForm from 'components/MoonForm';
1111
import { objectToQueryString } from 'utils/string';
1212

13+
import FormProvider from 'components/FormProvider';
14+
1315
function Home() {
1416
const [queryString, setQueryString] = useState('');
1517

@@ -32,22 +34,24 @@ function Home() {
3234
};
3335

3436
return (
35-
<Layout>
36-
<OgTags />
37-
<p>SVG showing the Moon Phase for today.</p>
38-
<Hits />
39-
<a>
40-
{/* eslint-disable-next-line @next/next/no-img-element */}
41-
<img src={svgUrl} alt="moon.svg" />
42-
</a>
43-
<MoonForm onChange={handleFormChange} />
44-
<CopyModal.Button id="copy-modal" />
45-
<CopyModal.Modal
46-
id="copy-modal"
47-
text={`https://moon-svg.minung.dev${svgUrl}`}
48-
/>
49-
<Adfit />
50-
</Layout>
37+
<FormProvider>
38+
<Layout>
39+
<OgTags />
40+
<p>SVG showing the Moon Phase for today.</p>
41+
<Hits />
42+
<a>
43+
{/* eslint-disable-next-line @next/next/no-img-element */}
44+
<img src={svgUrl} alt="moon.svg" />
45+
</a>
46+
<MoonForm onChange={handleFormChange} />
47+
<CopyModal.Button id="copy-modal" />
48+
<CopyModal.Modal
49+
id="copy-modal"
50+
text={`https://moon-svg.minung.dev${svgUrl}`}
51+
/>
52+
<Adfit />
53+
</Layout>
54+
</FormProvider>
5155
);
5256
}
5357

pages/preview.tsx

+16-17
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Layout from 'components/Layout';
77
import OgTags from 'components/OgTags';
88
import MoonForm from 'components/MoonForm';
99
import LinkPreviewCard from 'components/LinkPreviewCard';
10+
import FormProvider from 'components/FormProvider';
1011

1112
const PREVIEW_FORM_KEYS: FormKeys[] = ['theme', 'title', 'description'];
1213

@@ -61,23 +62,21 @@ function Preview({ query }: Props) {
6162
}, [svgUrl]);
6263

6364
return (
64-
<Layout>
65-
<OgTags
66-
url={`https://moon-svg.minung.dev/preview${queryString}`}
67-
image={`https://moon-svg.minung.dev/moon.png${queryString}`}
68-
/>
69-
<p>Share Moon&apos;s Phases with your friends!</p>
70-
<LinkPreviewCard
71-
image={`https://moon-svg.minung.dev/moon.png${queryString}`}
72-
title={data.title!}
73-
description={data.description!}
74-
/>
75-
<MoonForm
76-
keys={PREVIEW_FORM_KEYS}
77-
defaultValues={defaultValues}
78-
onChange={handleFormChange}
79-
/>
80-
</Layout>
65+
<FormProvider defaultValues={defaultValues}>
66+
<Layout>
67+
<OgTags
68+
url={`https://moon-svg.minung.dev/preview${queryString}`}
69+
image={`https://moon-svg.minung.dev/moon.png${queryString}`}
70+
/>
71+
<p>Share Moon&apos;s Phases with your friends!</p>
72+
<LinkPreviewCard
73+
image={`https://moon-svg.minung.dev/moon.png${queryString}`}
74+
title={data.title!}
75+
description={data.description!}
76+
/>
77+
<MoonForm keys={PREVIEW_FORM_KEYS} onChange={handleFormChange} />
78+
</Layout>
79+
</FormProvider>
8180
);
8281
}
8382

0 commit comments

Comments
 (0)