-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathApp.tsx
97 lines (88 loc) · 2.12 KB
/
App.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import "./App.css";
import { Country, CountryForm } from "./CountryForm";
import { Entry, useMozard } from "react-form-mozard";
import { Profile, ProfileForm } from "./ProfileForm";
import { WhichKorea, WhichKoreaForm } from "./WhichKoreaForm";
import { useState } from "react";
function App() {
const [values, setValue] = useState<Entry<Schema>[]>([]);
const { elements, done, value, get } = useMozard<Schema, Result>(
{
values,
onNext: setValue,
*do(step) {
const { name, age } = yield* step("profile", ProfileForm, {});
const isMinor = age < 20;
const { country } = yield* step("country", CountryForm, { isMinor });
if (country !== "Korea") {
return {
name,
age,
country,
};
}
const { side } = yield* step("whichKorea", WhichKoreaForm, {});
return {
name,
age,
country: `${side} ${country}`,
};
},
},
[],
);
const profile = get("profile");
const country = get("country");
const activeIndex = values.length + 1;
return (
<div>
{done ? (
<>
<h1>Done</h1>
<button
onClick={() => {
setValue([]);
}}
>
Reset
</button>
<h2>
{value.name} is {value.age} years old and from {value.country}!
</h2>
</>
) : (
<>
<h1>Step {activeIndex}</h1>
<button
onClick={() => {
setValue(values.slice(0, -1));
}}
>
Back
</button>
<ul>
{profile && (
<>
<li>name: {profile.name}</li>
<li>age: {profile.age}</li>
</>
)}
{country && <li>country: {country.country}</li>}
</ul>
{elements.at(-1)}
</>
)}
</div>
);
}
export default App;
type Schema = {
profile: Profile;
country: Country;
whichKorea: WhichKorea;
};
type Result = {
name: string;
age: number;
country: string;
};