Skip to content

Commit 33d4ac0

Browse files
authored
Merge pull request #107 from part3-4team-Taskify/feature/SignUp
[Feat] signup: 회원가입 post 요청 연결 / 성공 시 login 페이지 이동
2 parents 7969d20 + daa5e24 commit 33d4ac0

File tree

2 files changed

+90
-23
lines changed

2 files changed

+90
-23
lines changed

src/api/users.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,23 @@ export const getUserInfo = async ({ teamId }: { teamId: string }) => {
1515
const response = await axiosInstance.get<UserResponse>(`/${teamId}/users/me`);
1616
return response.data;
1717
};
18+
19+
interface SignUpRequest {
20+
email: string;
21+
nickname: string;
22+
password: string;
23+
}
24+
25+
export const signUp = async ({
26+
teamId,
27+
payload,
28+
}: {
29+
teamId: string;
30+
payload: SignUpRequest;
31+
}) => {
32+
const response = await axiosInstance.post<SignUpRequest>(
33+
`/${teamId}/users`,
34+
payload
35+
);
36+
return response.data;
37+
};

src/pages/signup.tsx

Lines changed: 70 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,22 @@
11
import { useState } from "react";
2+
import { useRouter } from "next/router";
3+
import { signUp } from "@/api/users";
4+
import { TEAM_ID } from "@/constants/team";
25
import Input from "@/components/input/Input";
36
import Link from "next/link";
7+
import { Modal } from "@/components/modal/Modal";
8+
import { CustomBtn } from "@/components/button/CustomButton";
49

510
export default function SignUpPage() {
611
const [email, setEmail] = useState("");
712
const [nickName, setNickname] = useState("");
813
const [password, setPassword] = useState("");
914
const [passwordCheck, setPasswordCheck] = useState("");
1015
const [agree, setAgree] = useState(false);
16+
const [isSuccessModalOpen, setIsSuccessModalOpen] = useState(false);
17+
18+
const router = useRouter();
19+
const teamId = TEAM_ID;
1120

1221
const isFormValid =
1322
email.trim() !== "" &&
@@ -16,6 +25,32 @@ export default function SignUpPage() {
1625
passwordCheck.trim() !== "" &&
1726
agree;
1827

28+
/*모달 닫고 로그인 페이지 이동*/
29+
const handleSuccessConfirm = () => {
30+
setIsSuccessModalOpen(false);
31+
router.push("/login");
32+
};
33+
34+
const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
35+
e.preventDefault();
36+
37+
if (!isFormValid) return;
38+
try {
39+
await signUp({
40+
teamId,
41+
payload: {
42+
email,
43+
nickname: nickName,
44+
password,
45+
},
46+
});
47+
setIsSuccessModalOpen(true);
48+
} catch (error) {
49+
console.error("회원가입 실패", error);
50+
alert("회원가입에 실패했습니다.");
51+
}
52+
};
53+
1954
return (
2055
<div className="flex flex-col items-center justify-center min-h-screen bg-[var(--color-gray5)] py-10">
2156
<div className="text-center mb-[40px]">
@@ -27,7 +62,10 @@ export default function SignUpPage() {
2762
<p className="font-20m text-black3">첫 방문을 환영합니다!</p>
2863
</div>
2964

30-
<form className="flex flex-col w-[350px] md:w-[520px] gap-[20px] font-16r text-black3">
65+
<form
66+
onSubmit={handleSubmit}
67+
className="flex flex-col w-[350px] md:w-[520px] gap-[20px] font-16r text-black3"
68+
>
3169
<Input
3270
type="email"
3371
name="email"
@@ -53,30 +91,18 @@ export default function SignUpPage() {
5391
placeholder="비밀번호를 입력해 주세요"
5492
onChange={setPassword}
5593
pattern=".{8,}"
56-
invalidMessage="비밀번호는 8자 이상이어야 해요"
94+
invalidMessage="영문, 숫자를 포함한 8자 이상 입력해 주세요"
5795
/>
5896

59-
<div className="gap-2">
60-
<Input
61-
type="password"
62-
name="passwordCheck"
63-
label="비밀번호 확인"
64-
placeholder="비밀번호를 한번 더 입력해 주세요"
65-
onChange={setPasswordCheck}
66-
pattern="{password}"
67-
invalidMessage=""
68-
className={
69-
passwordCheck && password !== passwordCheck
70-
? "border-[var(--color-red)] focus:border-[var(--color-red)]"
71-
: ""
72-
}
73-
/>
74-
{passwordCheck && password !== passwordCheck && (
75-
<span className="font-14r text-[var(--color-red)]">
76-
비밀번호가 일치하지 않습니다.
77-
</span>
78-
)}
79-
</div>
97+
<Input
98+
type="password"
99+
name="passwordCheck"
100+
label="비밀번호 확인"
101+
placeholder="비밀번호를 한번 더 입력해 주세요"
102+
onChange={setPasswordCheck}
103+
pattern="{passwordCheckPattern}"
104+
invalidMessage="비밀번호가 일치하지 않습니다."
105+
/>
80106

81107
<label className="flex items-center gap-[8px] font-16r text-black3">
82108
<input
@@ -116,6 +142,27 @@ export default function SignUpPage() {
116142
</Link>
117143
</span>
118144
</form>
145+
{isSuccessModalOpen && (
146+
<Modal
147+
width="w-[300px]"
148+
height="h-[180px]"
149+
isOpen={isSuccessModalOpen}
150+
onClose={handleSuccessConfirm}
151+
className="flex flex-col items-center justify-center text-center"
152+
>
153+
<p className="text-black3 font-16m">
154+
회원가입에 성공했습니다.
155+
<br />
156+
로그인 화면으로 이동합니다.
157+
</p>
158+
<CustomBtn
159+
onClick={handleSuccessConfirm}
160+
className="w-[180px] h-[40px] bg-[var(--primary)] font-16m text-white rounded-[8px] cursor-pointer"
161+
>
162+
확인
163+
</CustomBtn>
164+
</Modal>
165+
)}
119166
</div>
120167
);
121168
}

0 commit comments

Comments
 (0)