diff --git a/components/Oauth2/SocialSignupForm/index.tsx b/components/Oauth2/SocialSignupForm/index.tsx new file mode 100644 index 0000000..0938a39 --- /dev/null +++ b/components/Oauth2/SocialSignupForm/index.tsx @@ -0,0 +1,260 @@ +import "react-datepicker/dist/react-datepicker.css"; + +import { useRouter } from "next/router"; +import { useEffect, useState } from "react"; +import { Controller, useForm } from "react-hook-form"; + +import DatePickerInput from "@/components/Form/Input/DatePickerInput"; +import ImageUpload from "@/components/Form/Input/ImageUploadInput"; +import IntroTextarea from "@/components/Form/Input/IntroTextarea"; +import RadioInput from "@/components/Form/Input/RadioInput"; +import TagInput from "@/components/Form/Input/TagInput"; +import Modal from "@/components/Modal"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import axios from "@/lib/api/axios"; + +interface SignUp { + bio?: string; + confirmPassword: string; + dayOfBirth: string; + favoriteSpots?: string[]; + gender: "MALE" | "FEMALE"; + nickname: string; + password: string; + profile?: string; +} + +function SocialSignUpForm() { + const { + register, + handleSubmit, + control, + formState: { errors, isValid }, + watch, + } = useForm({ mode: "onBlur" }); + + const router = useRouter(); + + const [isModalOpen, setIsModalOpen] = useState(false); + const [isCheckEmailModalOpen, setIsCheckEmailModalOpen] = useState(false); + + const [oauthEmail, setOauthEmail] = useState("default@email.com"); + + const onSubmit = async (data: SignUp) => { + const formData = new FormData(); + + const { confirmPassword, profile, ...submitData } = data; + formData.append( + "request", + new Blob([JSON.stringify(submitData)], { type: "application/json" }), + ); + + if (data.profile) { + formData.append("profile", data.profile); + } + + try { + const res = await axios.post("/oauth2/signup", formData, { + headers: { + "Content-Type": "multipart/form-data", + }, + }); + setIsModalOpen(true); + } catch (error) { + console.error("회원가입 실패:", error); + } + }; + + const handleFormSubmit = (data: SignUp) => { + onSubmit(data); + }; + + const getOauthEmail = async () => { + try { + const response = await axios.get("/oauth2/signup", { + baseURL: "http://mylittleforest.shop:8080", + }); + console.log(response); + setOauthEmail(response.data.email); + console.log("oauth2 이메일 조회 성공! ", response.data); + } catch (error) { + console.error("oauth2 이메일 조회 실패", error); + } + }; + + useEffect(() => { + getOauthEmail(); + }, []); + + return ( + <> +
+
+
+
+
+ 필수 정보 입력 +
+
+
+
+
+ + +
+
+ + + {errors.nickname && errors.nickname.type === "required" && ( + + 닉네임을 입력해 주세요 + + )} + {errors.nickname && errors.nickname.type === "minLength" && ( + + 닉네임은 최소 2글자 입니다 + + )} + {errors.nickname && errors.nickname.type === "maxLength" && ( + + 닉네임은 최대 8글자 입니다 + + )} +
+ +
+ + ( + field.onChange(gender)} + value={field.value} + pageType="singUp" + id={"gender"} + /> + )} + /> +
+
+ + ( + field.onChange(date)} + value={field.value} + id={"date"} + /> + )} + /> +
+
+
+
+
+ 추가 정보 입력 +
+
+
+
+ ( + field.onChange(profile)} + value={field.value ?? ""} + /> + )} + /> +
+ + ( + field.onChange(tags)} + value={field.value} + formType={"signUp"} + id={"tags"} + /> + )} + /> +
+
+ + ( + field.onChange(text)} + value={field.value ?? ""} + id={"bio"} + /> + )} + /> +
+
+
+
+ +
+
+ {isModalOpen && ( + { + setIsModalOpen(false); + router.push("/login"); + }} + /> + )} + {isCheckEmailModalOpen && ( + { + setIsCheckEmailModalOpen(false); + }} + /> + )} + + ); +} + +export default SocialSignUpForm; diff --git a/components/Travel/Contents/CardGrid.tsx b/components/Travel/Contents/CardGrid.tsx index b4295ed..9011862 100644 --- a/components/Travel/Contents/CardGrid.tsx +++ b/components/Travel/Contents/CardGrid.tsx @@ -31,6 +31,8 @@ interface itemType { export interface CardData { content: itemType[]; totalPages: number; + first: boolean; + last: boolean; numberOfElements: number; } @@ -140,7 +142,7 @@ function CardGrid() {
firstLastPage(0)} >
-
+
이전페이지 -
+
다음페이지
firstLastPage(Number(card?.totalPages) - 1)} >