2. 회원가입

SignupPage.tsx

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 />;
}

SignupForm.tsx

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 handleChangeName = (value: string) => {
    store.changeName(value);
  };

  const handleChangePassword = (value: string) => {
    store.changePassword(value);
  };

  const handleChangePasswordConfirmation = (value: string) => {
    store.changePasswordConfirmation(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>
  );
}

accessToken을 useEffect가 바라보고 있어

SignupForm 컴포넌트에서 회원 가입이 이뤄지면

accessToken이 생성되고 그렇다면 다시 SignupPage의 useEffect에서 complete 페이지로 보낸다.

너무나 깔끔, 간단 명료, 효율적인 모습이다.

Last updated