react-hook-form의 handleSubmit을 이용
onSubmit은 개발자가 직접 제출하는 함수를 만들어준다.
<aside> 💡 여기 onSubmit 함수에서의 핵심은 STEPS가 마지막이 아니면, STEPS.price 가 아니면 다음 스텝으로 보내는 onNext()를 실헹 시켜준다.
</aside>
const onSubmit: SubmitHandler<FieldValues> = (data) => {
// 마지막 스텝이 아니면 onNext 실행
if (step !== STEPS.PRICE) {
return onNext();
}
setIsLoading(true);
// post 제출
axios
.post('/api/listings', data)
.then(() => {
toast.success('Listing Created!');
router.refresh();
// 폼 제출후 모든 폼 리셋 react-hook-form
reset();
setStep(STEPS.CATEGORY);
rentModal.onClose();
})
.catch(() => {
toast.error('Something went wrong');
})
.finally(() => {
setIsLoading(false);
});
};
import { NextResponse } from 'next/server';
import prisma from '@/app/libs/prismadb';
import getCurrentUser from '@/app/actions/getCurrentUser';
export async function POST(request: Request) {
// 현재 로그인 되어있는 사용자의 정보가져오기
const currentUser = await getCurrentUser();
// 없으면 에러
if (!currentUser) {
return NextResponse.error();
}
// 클라이언트에서 받아온 정보
const body = await request.json();
const {
category,
location,
guestCount,
roomCount,
bathroomCount,
imageSrc,
price,
title,
description,
} = body;
// You can remove this if you want to
Object.keys(body).forEach((value: any) => {
if (!body[value]) {
NextResponse.error();
}
});
const listing = await prisma.listing.create({
data: {
category,
locationValue: location.value,
guestCount,
roomCount,
bathroomCount,
imageSrc,
price: parseInt(price, 10),
title,
description,
userId: currentUser.id,
},
});
return NextResponse.json(listing);
}