async signup({ email, name, password }: {
email: string;
name: string;
password: string;
}): Promise<string> {
const { data } = await this.instance.post('/users', {
email, name, password,
});
const { accessToken } = data;
return accessToken;
}
export default function useSignupFormStore() {
const store = container.resolve(SignupFormStore);
return useStore(store);
}
export default function SignupForm() {
const { setAccessToken } = useAccessToken();
const [{
email, name, password, passwordConfirmation, valid, error, accessToken,
}, store] = useSignupFormStore();
useEffect(() => {
if (accessToken) {
setAccessToken(accessToken);
}
}, [accessToken]);
const handleChangeEmail = (value: string) => {
store.changeEmail(value);
};
// 중략
const handleSubmit = (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault();
store.signup();
};
return (
<Container>
<h2>회원 가입</h2>
<form onSubmit={handleSubmit}>
<TextBox
label="E-mail"
placeholder="tester@example.com"
value={email}
onChange={handleChangeEmail}
/>
<TextBox
label="Name"
value={name}
onChange={handleChangeName}
/>
<TextBox
label="Password"
type="password"
value={password}
onChange={handleChangePassword}
/>
<TextBox
label="Password Confirmation"
type="password"
value={passwordConfirmation}
onChange={handleChangePasswordConfirmation}
/>
<Button type="submit" disabled={!valid}>
회원 가입
</Button>
{error && (
<p>회원 가입 실패</p>
)}
</form>
</Container>
);
}
export default function SignupPage() {
const navigate = useNavigate();
const [{ accessToken }, store] = useSignupFormStore();
useEffect(() => {
store.reset();
}, []);
useEffect(() => {
if (accessToken) {
store.reset();
navigate('/signup/complete'); // 회원가입 성공 페이지
}
}, [accessToken]);
return (
<SignupForm />
);
}
export default function SignupCompletePage() {
return (
<p>
회원 가입이 완료되었습니다.
</p>
);
}
{ path: '/signup', element: <SignupPage /> },
{ path: '/signup/complete', element: <SignupCompletePage /> },
<p>
<Link to="/signup">
회원 가입
</Link>
</p>