-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[#523] [모임 상세] 모임 수정 페이지 #527
Changes from 19 commits
e5f5ab2
3d21c66
c07cec7
2e3904d
3dbd717
54616e9
8f46d59
5db5c83
b58a72d
9a4534b
eabf937
469bdd4
c2d1055
a125040
3314a6b
59d8916
7732d10
aba6109
cf5724d
2dc9955
e456f70
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,43 +1,97 @@ | ||
'use client'; | ||
|
||
import GroupAPI from '@/apis/group'; | ||
import { APIGroupDetail } from '@/types/group'; | ||
import AuthRequired from '@/ui/AuthRequired'; | ||
import TopNavigation from '@/ui/common/TopNavigation'; | ||
import EditGroupForm from '@/ui/Group/EditGroupForm'; | ||
import { VStack } from '@chakra-ui/react'; | ||
import { useCallback, useEffect, useState } from 'react'; | ||
|
||
const GroupEditPage = ({ | ||
import { useRouter } from 'next/navigation'; | ||
import { FormProvider, SubmitHandler, useForm } from 'react-hook-form'; | ||
|
||
import type { APIGroupDetail, BookGroupEdit } from '@/types/group'; | ||
import { | ||
useBookGroupEditCurrentInfo, | ||
useBookGroupInfoMutation, | ||
} from '@/queries/group/useBookGroupQuery'; | ||
|
||
import BookGroupEditTopNavigation from '@/v1/bookGroup/edit/BookGroupEditTopNavigation'; | ||
import BookGroupEditTitleForm from '@/v1/bookGroup/edit/BookGroupEditTitleForm'; | ||
import BookGroupEditIntroduceForm from '@/v1/bookGroup/edit/BookGroupEditIntroduceForm'; | ||
import BookGroupEditDateForm from '@/v1/bookGroup/edit/BookGroupEditDateForm'; | ||
import { isAxiosErrorWithCustomCode } from '@/utils/helpers'; | ||
import { SERVICE_ERROR_MESSAGE } from '@/constants'; | ||
import useToast from '@/v1/base/Toast/useToast'; | ||
|
||
const BookGroupEditPage = ({ | ||
params: { groupId }, | ||
}: { | ||
params: { groupId: number }; | ||
params: { groupId: APIGroupDetail['bookGroupId'] }; | ||
}) => { | ||
const [group, setGroup] = useState<APIGroupDetail>(); | ||
|
||
const getGroup = useCallback(async () => { | ||
try { | ||
const { data } = await GroupAPI.getGroupDetailInfo({ | ||
bookGroupId: groupId, | ||
}); | ||
setGroup(data); | ||
} catch (error) { | ||
console.error(error); | ||
} | ||
}, [groupId]); | ||
|
||
useEffect(() => { | ||
getGroup(); | ||
}, [getGroup]); | ||
const { show: showToast } = useToast(); | ||
|
||
const router = useRouter(); | ||
|
||
const { data: bookGroupData } = useBookGroupEditCurrentInfo(groupId); | ||
const { title, description, maxMemberCount, startDate, endDate } = | ||
bookGroupData; | ||
|
||
const bookGroupEdit = useBookGroupInfoMutation(groupId); | ||
|
||
const methods = useForm<BookGroupEdit>({ | ||
mode: 'all', | ||
defaultValues: { | ||
title: title, | ||
introduce: description, | ||
maxMemberCount: maxMemberCount ? maxMemberCount : 9999, | ||
startDate: startDate, | ||
endDate: endDate, | ||
}, | ||
}); | ||
|
||
const handleFormSubmit: SubmitHandler<BookGroupEdit> = async ({ | ||
title, | ||
introduce, | ||
maxMemberCount, | ||
endDate, | ||
}) => { | ||
bookGroupEdit.mutate( | ||
{ title, introduce, maxMemberCount, endDate }, | ||
{ | ||
onSuccess: () => { | ||
router.push(`/group/${groupId}`); | ||
|
||
showToast({ type: 'success', message: '모임 정보 수정 완료 🎉' }); | ||
return; | ||
}, | ||
onError: error => { | ||
if (isAxiosErrorWithCustomCode(error)) { | ||
const { code } = error.response.data; | ||
const message = SERVICE_ERROR_MESSAGE[code]; | ||
|
||
showToast({ type: 'error', message }); | ||
return; | ||
} | ||
|
||
showToast({ | ||
type: 'error', | ||
message: '모임 정보 수정을 실패했어요 🥲', | ||
}); | ||
}, | ||
} | ||
); | ||
}; | ||
|
||
return ( | ||
<AuthRequired> | ||
<VStack justify="center" align="center"> | ||
<TopNavigation pageTitle="모임 수정" /> | ||
{group && <EditGroupForm group={group} />} | ||
</VStack> | ||
</AuthRequired> | ||
<> | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. p3; 불필요한 fragment가 눈에 띄어서.. 코멘트 남겨용..😊 |
||
<FormProvider {...methods}> | ||
<BookGroupEditTopNavigation onSubmit={handleFormSubmit} /> | ||
|
||
<form | ||
className="mt-[2.5rem] flex flex-col gap-[3.2rem]" | ||
onSubmit={methods.handleSubmit(handleFormSubmit)} | ||
> | ||
<BookGroupEditTitleForm /> | ||
<BookGroupEditIntroduceForm /> | ||
<BookGroupEditDateForm /> | ||
</form> | ||
</FormProvider> | ||
</> | ||
); | ||
}; | ||
|
||
export default GroupEditPage; | ||
export default BookGroupEditPage; |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -95,3 +95,11 @@ export type BookGroupComment = { | |
createdAt: APIGroupComment['createdAt']; | ||
content: APIGroupComment['contents']; | ||
}; | ||
|
||
export type BookGroupEdit = { | ||
title: APIGroupDetail['title']; | ||
introduce: APIGroupDetail['introduce']; | ||
maxMemberCount: APIGroupDetail['maxMemberCount']; | ||
startDate: APIGroupDetail['startDate']; | ||
endDate: APIGroupDetail['endDate']; | ||
}; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. p5; patch 요청에 쓰이는 타입이라면.. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
import { useFormContext } from 'react-hook-form'; | ||
|
||
import type { BookGroupEdit } from '@/types/group'; | ||
|
||
import DatePicker from '@/v1/base/DatePicker'; | ||
import ErrorMessage from '@/v1/base/ErrorMessage'; | ||
|
||
type EditDateFormTypes = Pick<BookGroupEdit, 'startDate' | 'endDate'>; | ||
|
||
const BookGroupEditDateForm = () => { | ||
const { | ||
register, | ||
formState: { errors, defaultValues }, | ||
} = useFormContext<EditDateFormTypes>(); | ||
|
||
return ( | ||
<> | ||
<section className="flex justify-between"> | ||
<div> | ||
<h2 className="text-md text-black-500">모임 시작일</h2> | ||
<p className="text-xs text-placeholder"> | ||
모임 시작일은 수정할 수 없어요 | ||
</p> | ||
</div> | ||
<DatePicker disabled={true} {...register('startDate')} /> | ||
</section> | ||
<section className="flex flex-col gap-[0.5rem]"> | ||
<div className="flex justify-between"> | ||
<h2 className="text-md text-black-700">모임 종료일</h2> | ||
<DatePicker | ||
{...register('endDate', { | ||
required: { value: true, message: '종료일을 입력해주세요' }, | ||
min: { | ||
value: defaultValues?.startDate as string, | ||
message: '종료일은 시작일보다 늦어야 해요', | ||
}, | ||
})} | ||
/> | ||
</div> | ||
<div> | ||
{errors.endDate && ( | ||
<ErrorMessage>{errors.endDate.message}</ErrorMessage> | ||
)} | ||
</div> | ||
</section> | ||
</> | ||
); | ||
}; | ||
|
||
export default BookGroupEditDateForm; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
p3;
모임 정보를 수정했어요!
이런 메세지는 어떨까용? 좀더.. 구어체로..😀