Skip to content

Commit 1cf09dd

Browse files
authored
Merge pull request #160 from imaginer-dev/51-그룹일정-추가-시-DB-저장
51 그룹일정 추가 시 db 저장
2 parents 7118b05 + ce0879d commit 1cf09dd

File tree

10 files changed

+124
-21
lines changed

10 files changed

+124
-21
lines changed

src/apis/groupScheduleApis.ts

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,53 @@
11
import supabase from '@/supabase';
22
import { Member } from '@/types/Member';
3+
interface addGroupShedule {
4+
title: string;
5+
description: string;
6+
startDate: string;
7+
endDate: string;
8+
memo: string;
9+
newMemberList: Member[];
10+
}
11+
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
41+
.from('group_schedules')
42+
.insert({ ...props, start_date: startDate, end_date: endDate, group_id: groupInfo.id })
43+
.select()
44+
.single();
45+
46+
if (groupScheduleError) {
47+
throw groupScheduleError;
48+
}
49+
return groupScheduleData;
50+
};
351

452
interface UpdateGroupSchedule {
553
name: string;

src/components/common/UserInvite.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ const UserInvite: FC<Props> = ({ member, setMember }) => {
3737
<div>
3838
멤버 초대하기 *
3939
<ul className="flex gap-2">
40-
{member.map((user) => (
41-
<UserInvited id={user.id} user_nickname={user.user_nickname} key={user.id + '-UserInvited'} />
40+
{member.map(({ user_nickname, id }) => (
41+
<UserInvited id={id} user_nickname={user_nickname} key={id + '-UserInvited'} />
4242
))}
4343
<li>
4444
<DialogButton

src/components/common/UserInviteDialog.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ interface Props {
1010
onUserItemClick: (clickedUser: Member) => void;
1111
}
1212

13-
const UserInvite: FC<Props> = ({ list, onChange, onSearchClick, onUserItemClick }) => {
13+
const UserInviteDialog: FC<Props> = ({ list, onChange, onSearchClick, onUserItemClick }) => {
1414
return (
1515
<div>
1616
<div className="flex items-end">
@@ -33,4 +33,4 @@ const UserInvite: FC<Props> = ({ list, onChange, onSearchClick, onUserItemClick
3333
);
3434
};
3535

36-
export default UserInvite;
36+
export default UserInviteDialog;

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: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
11
import GroupForm from '@/components/Group/GroupForm';
22
import AppBar from '@/components/common/AppBar';
3+
import Dialog from '@/components/common/Dialog';
4+
import { useAddGroupSchedule } from '@/hooks/useAddGroupSchedule';
5+
import { Member } from '@/types/Member';
36

47
const AddGroupPage = () => {
5-
const handleSubmit: React.FormEventHandler<HTMLFormElement> = (e) => {
8+
const { addGroupSchedule, isPending, failDialogRef, successDialogRef } = useAddGroupSchedule();
9+
const handleSubmit = (e: React.FormEvent<HTMLFormElement>, userList: Member[]) => {
610
e.preventDefault();
7-
const formData = new FormData(e.currentTarget);
8-
console.log(formData.get('name'));
11+
addGroupSchedule(e, userList);
912
};
1013

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

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+
});

src/supabase/supabse.types.ts

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export type Database = {
88
created_at: string;
99
description: string | null;
1010
end_date: string;
11-
group_id: string;
11+
group_id: number;
1212
id: number;
1313
memo: string | null;
1414
owner_id: string;
@@ -19,7 +19,7 @@ export type Database = {
1919
created_at?: string;
2020
description?: string | null;
2121
end_date: string;
22-
group_id?: string;
22+
group_id: number;
2323
id?: number;
2424
memo?: string | null;
2525
owner_id?: string;
@@ -30,7 +30,7 @@ export type Database = {
3030
created_at?: string;
3131
description?: string | null;
3232
end_date?: string;
33-
group_id?: string;
33+
group_id?: number;
3434
id?: number;
3535
memo?: string | null;
3636
owner_id?: string;
@@ -42,14 +42,7 @@ export type Database = {
4242
foreignKeyName: 'group_schedules_group_id_fkey';
4343
columns: ['group_id'];
4444
isOneToOne: false;
45-
referencedRelation: 'users';
46-
referencedColumns: ['id'];
47-
},
48-
{
49-
foreignKeyName: 'group_schedules_owner_id_fkey';
50-
columns: ['owner_id'];
51-
isOneToOne: false;
52-
referencedRelation: 'users';
45+
referencedRelation: 'groups';
5346
referencedColumns: ['id'];
5447
},
5548
];
@@ -179,20 +172,23 @@ export type Database = {
179172
Row: {
180173
created_at: string;
181174
id: string;
175+
image_url: string | null;
182176
phone: string;
183177
user_name: string;
184-
user_nickname: string;
178+
user_nickname: string | null;
185179
};
186180
Insert: {
187181
created_at?: string;
188182
id?: string;
183+
image_url?: string | null;
189184
phone: string;
190185
user_name: string;
191186
user_nickname?: string | null;
192187
};
193188
Update: {
194189
created_at?: string;
195190
id?: string;
191+
image_url?: string | null;
196192
phone?: string;
197193
user_name?: string;
198194
user_nickname?: string | null;

src/tests/fixtures/groupScheduleFixture.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,6 @@ export const groupScheduleFixture: Database['public']['Tables']['group_schedules
1010
end_date: '2024-05-18 06:22:02+00',
1111
owner_id: '1d7a5662-922e-4167-932d-4dda46f67ef2',
1212
memo: 'Test용으로 생성된 모임 일정 입니다.',
13-
group_id: '1',
13+
group_id: 1,
1414
},
1515
];

src/tests/fixtures/memberFixture.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ export const memberListFixture: Member[] = [
77
created_at: '2021-10-10',
88
phone: '010-1234-5678',
99
user_nickname: 'gihwan-dev',
10+
image_url: '',
1011
},
1112
{
1213
id: '2',
1314
user_name: '홍길동',
1415
created_at: '2021-10-10',
1516
phone: '010-1234-5678',
1617
user_nickname: 'hong',
18+
image_url: '',
1719
},
1820
];

0 commit comments

Comments
 (0)