Skip to content

Commit 7b7e680

Browse files
committed
feat: 그룹 일정 등록 구현
1 parent c74d2cf commit 7b7e680

File tree

6 files changed

+319
-230
lines changed

6 files changed

+319
-230
lines changed

src/apis/groupScheduleApis.ts

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,47 @@ interface addGroupShedule {
66
startDate: string;
77
endDate: string;
88
memo: string;
9-
newMemberList: any[];
9+
newMemberList: Member[];
1010
}
1111

12-
export const addGroupSchedule = async ({ startDate, endDate, ...props }: addGroupShedule) => {
13-
const { error } = await supabase
12+
export const addGroupScheduleFetch = async ({ startDate, endDate, newMemberList, ...props }: addGroupShedule) => {
13+
// 그룹을 생성한다.
14+
const { data: groupInfo, error: groupInfoError } = await supabase
15+
.from('groups')
16+
.insert({
17+
name: props.title,
18+
open: true,
19+
start_date: startDate,
20+
end_date: endDate,
21+
})
22+
.select()
23+
.single();
24+
25+
if (!groupInfo || groupInfoError) {
26+
throw groupInfoError;
27+
}
28+
29+
// 그룹에 멤버를 추가한다.
30+
const { error: groupMemberError } = await supabase.from('group_user_ralations').insert(
31+
newMemberList.map((member) => ({
32+
group_id: groupInfo.id,
33+
user_id: member.id,
34+
})),
35+
);
36+
if (groupMemberError) {
37+
throw groupMemberError;
38+
}
39+
// 그룹 일정을 생성한다.
40+
const { data: groupScheduleData, error: groupScheduleError } = await supabase
1441
.from('group_schedules')
15-
.insert({ ...props, start_date: startDate, end_date: endDate });
42+
.insert({ ...props, start_date: startDate, end_date: endDate, group_id: groupInfo.id })
43+
.select()
44+
.single();
1645

17-
if (error) {
18-
throw error;
46+
if (groupScheduleError) {
47+
throw groupScheduleError;
1948
}
49+
return groupScheduleData;
2050
};
2151

2252
interface UpdateGroupSchedule {

src/hooks/useAddGroupSchedule.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { useAddNewGroup } from '@/react-queries/useAddNewGroup';
2+
import { Member } from '@/types/Member';
3+
import { useRef } from 'react';
4+
5+
interface DialogElement {
6+
openModal: () => void;
7+
closeModal: () => void;
8+
}
9+
10+
export const useAddGroupSchedule = () => {
11+
const { mutate, isPending } = useAddNewGroup();
12+
const successDialogRef = useRef<DialogElement | null>(null);
13+
const failDialogRef = useRef<DialogElement | null>(null);
14+
15+
const addGroupSchedule = (e: React.FormEvent<HTMLFormElement>, userList: Member[]) => {
16+
const formData = new FormData(e.currentTarget);
17+
const newGroupSchedule = {
18+
title: formData.get('name') as string,
19+
description: formData.get('description') as string,
20+
startDate: formData.get('startDate') as string,
21+
endDate: formData.get('endDate') as string,
22+
memo: formData.get('memo') as string,
23+
newMemberList: userList,
24+
};
25+
mutate(newGroupSchedule, {
26+
onError: (error) => {
27+
console.error(error);
28+
failDialogRef.current?.openModal();
29+
},
30+
onSuccess: () => {
31+
successDialogRef.current?.openModal();
32+
},
33+
});
34+
};
35+
36+
return {
37+
addGroupSchedule,
38+
isPending,
39+
successDialogRef,
40+
failDialogRef,
41+
};
42+
};

src/pages/AddGroupSchedulePage.tsx

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,22 @@
1-
import { addGroupSchedule } from '@/apis/groupScheduleApis';
21
import GroupForm from '@/components/Group/GroupForm';
32
import AppBar from '@/components/common/AppBar';
3+
import Dialog from '@/components/common/Dialog';
4+
import { useAddGroupSchedule } from '@/hooks/useAddGroupSchedule';
45
import { Member } from '@/types/Member';
56

67
const AddGroupPage = () => {
8+
const { addGroupSchedule, isPending, failDialogRef, successDialogRef } = useAddGroupSchedule();
79
const handleSubmit = (e: React.FormEvent<HTMLFormElement>, userList: Member[]) => {
810
e.preventDefault();
9-
const formData = new FormData(e.currentTarget);
10-
const addSchedule = {
11-
title: formData.get('name') as string,
12-
description: formData.get('description') as string,
13-
startDate: formData.get('startDate') as string,
14-
endDate: formData.get('endDate') as string,
15-
memo: formData.get('memo') as string,
16-
newMemberList: userList,
17-
};
18-
addGroupSchedule(addSchedule);
11+
addGroupSchedule(e, userList);
1912
};
2013

2114
return (
2215
<div className="flex min-h-dvh w-screen flex-col overflow-x-hidden px-6">
2316
<AppBar backButton title={'모임 일정 등록하기'} />
24-
<GroupForm onSubmit={handleSubmit} />
17+
<GroupForm onSubmit={handleSubmit} isLoading={isPending} />
18+
<Dialog ref={successDialogRef} desc="모임 일정이 등록되었습니다." />
19+
<Dialog ref={failDialogRef} desc="모임 일정 등록에 실패했습니다." />
2520
</div>
2621
);
2722
};

src/react-queries/queryKeys.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,6 @@ export const queries = createQueryKeyStore({
1818
update: null,
1919
updateMember: null,
2020
getAllMember: (groupId: string) => [groupId],
21+
add: null,
2122
},
2223
});
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { useMutation } from '@tanstack/react-query';
2+
import { queries } from './queryKeys';
3+
import { addGroupScheduleFetch } from '@/apis/groupScheduleApis';
4+
5+
export const useAddNewGroup = () =>
6+
useMutation({
7+
mutationKey: queries.group.add.queryKey,
8+
mutationFn: addGroupScheduleFetch,
9+
});

0 commit comments

Comments
 (0)