Skip to content

Commit 9901df2

Browse files
committed
feat: 수정 성공 또는 실패에 따른 UI 표현
1 parent 01fa318 commit 9901df2

File tree

5 files changed

+61
-29
lines changed

5 files changed

+61
-29
lines changed

src/apis/groupScheduleApis.ts

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,20 @@
11
import supabase from '@/supabase';
22
import { Member } from '@/types/Member';
33

4+
interface UpdateGroupSchedule {
5+
name: string;
6+
description: string;
7+
startDate: string;
8+
endDate: string;
9+
memo: string;
10+
scheduleId: string;
11+
}
12+
13+
interface UpdateGroupScheduleMember {
14+
updatedMemberList: Member[];
15+
groupId: string;
16+
}
17+
418
export const getOneGroupSchedule = async (scheduleId: string) => {
519
const { data, error } = await supabase.from('group_schedules').select('*').eq('id', +scheduleId);
620

@@ -15,15 +29,6 @@ export const getOneGroupSchedule = async (scheduleId: string) => {
1529
return data[0];
1630
};
1731

18-
interface UpdateGroupSchedule {
19-
name: string;
20-
description: string;
21-
startDate: string;
22-
endDate: string;
23-
memo: string;
24-
scheduleId: string;
25-
}
26-
2732
export const updateGroupSchedule = async ({
2833
name,
2934
description,
@@ -50,11 +55,6 @@ export const updateGroupSchedule = async ({
5055
return data;
5156
};
5257

53-
interface UpdateGroupScheduleMember {
54-
updatedMemberList: Member[];
55-
groupId: string;
56-
}
57-
5858
export const updateGroupScheduleMember = async ({ updatedMemberList, groupId }: UpdateGroupScheduleMember) => {
5959
const { error: deleteError } = await supabase.from('group_user_ralations').delete().eq('group_id', groupId);
6060
if (deleteError) {

src/components/Group/GroupForm.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ interface Props {
1313
endDate?: string;
1414
memo?: string | null;
1515
memberList?: Member[];
16+
isLoading?: boolean;
1617
onSubmit: (e: React.FormEvent<HTMLFormElement>, userList: Member[]) => void;
1718
}
1819

@@ -24,6 +25,7 @@ const GroupForm: FC<Props> = ({
2425
memo = '',
2526
memberList = [],
2627
onSubmit,
28+
isLoading = false,
2729
}) => {
2830
const [member, setMember] = useState<Member[]>(memberList);
2931

@@ -43,8 +45,12 @@ const GroupForm: FC<Props> = ({
4345
<UserInvite member={member} setMember={onClick} />
4446
<GroupFormMemoInput memo={memo ?? ''} />
4547
</div>
46-
<button type="submit" className="btn btn-outline btn-primary w-full">
47-
저장
48+
<button
49+
disabled={isLoading}
50+
type="submit"
51+
className={`btn btn-outline btn-primary w-full ${isLoading ? 'disabled' : ''}`}
52+
>
53+
{isLoading ? <span className="loading" /> : '저장'}
4854
</button>
4955
</form>
5056
);

src/components/common/Loading/Loading.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ interface Props {
55
display: 'spinner' | 'dots' | 'ring' | 'ball' | 'bars' | 'infinity';
66
size: 'xs' | 'sm' | 'md' | 'lg';
77
color: 'primary' | 'secondary' | 'accent' | 'neutral' | 'info' | 'success' | 'warning' | 'error';
8+
transparent?: boolean;
89
}
910

1011
const styleMap = {
@@ -28,12 +29,10 @@ const styleMap = {
2829
error: 'text-error',
2930
};
3031

31-
const Loading: React.FC<Props> = ({ display, size, color }) => {
32+
const Loading: React.FC<Props> = ({ display, size, color, transparent = false }) => {
3233
return (
3334
<div
34-
className={
35-
'fixed left-0 top-0 z-50 flex h-screen w-screen flex-col items-center justify-center overflow-hidden bg-base-100'
36-
}
35+
className={`fixed left-0 top-0 z-50 flex h-screen w-screen flex-col items-center justify-center overflow-hidden bg-base-100 ${transparent ? 'bg-opacity-50' : ''}`}
3736
>
3837
<Logo />
3938
<span className={`loading absolute bottom-20 ${styleMap[display]} ${styleMap[size]} ${styleMap[color]}`}></span>

src/pages/EditGroupSchedulePage.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Loading } from '.';
55
import { Member } from '@/types/Member';
66
import { useUpdateGroupSchedule } from '@/react-queries/useUpdateGroupSchedule';
77
import { useGetGroupScheduleDefaultData } from '@/hooks/useGetGroupScheduleDefaultData';
8+
import Dialog from '@/components/common/Dialog';
89

910
const EditGroupSchedulePage = () => {
1011
const params = useParams<{ groupId: string; scheduleId: string }>();
@@ -15,7 +16,7 @@ const EditGroupSchedulePage = () => {
1516
scheduleId,
1617
groupId,
1718
);
18-
const { mutate, isError: updateHasError, isPending: updateIsPending } = useUpdateGroupSchedule();
19+
const { mutate, successDialog, errorDialogRef, isPending: updateIsPending } = useUpdateGroupSchedule();
1920

2021
if (isError) {
2122
return <div>{error!.message}</div>;
@@ -40,10 +41,6 @@ const EditGroupSchedulePage = () => {
4041
mutate(updatePayload);
4142
};
4243

43-
if (updateHasError) {
44-
// TODO: 에러 다이얼로그 표시
45-
}
46-
4744
if (updateIsPending) {
4845
// TODO: 로딩 스피너 표시
4946
}
@@ -63,7 +60,10 @@ const EditGroupSchedulePage = () => {
6360
endDate={groupScheduleData!.end_date}
6461
memo={groupScheduleData!.memo}
6562
memberList={groupMemberData}
63+
isLoading={updateIsPending}
6664
/>
65+
<Dialog ref={errorDialogRef} desc="오류가 발생했습니다. 다시시도해 주세요." />
66+
<Dialog ref={successDialog} desc="성공적으로 수정했습니다." />
6767
</div>
6868
)}
6969
</>

src/react-queries/useUpdateGroupSchedule.ts

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { useMutation } from '@tanstack/react-query';
33
import { queries } from './queryKeys';
44
import { Member } from '@/types/Member';
55
import { useNavigate } from 'react-router-dom';
6-
import { useEffect } from 'react';
6+
import { useEffect, useRef } from 'react';
77

88
interface UpdateGroupSchedule {
99
name: string;
@@ -15,14 +15,23 @@ interface UpdateGroupSchedule {
1515
newMemberList: Member[];
1616
}
1717

18+
interface DialogElement {
19+
openModal: () => void;
20+
closeModal: () => void;
21+
}
22+
1823
export const useUpdateGroupSchedule = () => {
1924
const navigator = useNavigate();
2025

26+
const errorDialogRef = useRef<DialogElement | null>(null);
27+
const successDialog = useRef<DialogElement | null>(null);
28+
2129
const {
2230
mutate: updateGroupScheduleMutate,
2331
isPending: updateGroupScheduleIsPending,
2432
isSuccess: updateGroupScheduleIsSuccess,
2533
isError: updateGroupScheduleIsError,
34+
reset: updateGroupScheduleReset,
2635
} = useMutation({
2736
mutationKey: queries.groupSchedule.update.queryKey,
2837
mutationFn: updateGroupSchedule,
@@ -33,6 +42,7 @@ export const useUpdateGroupSchedule = () => {
3342
isPending: updateGroupMemberIsPending,
3443
isSuccess: updateGroupMemberIsSuccess,
3544
isError: updateGroupMemberIsError,
45+
reset: updateGroupMemberReset,
3646
} = useMutation({
3747
mutationKey: queries.group.updateMember.queryKey,
3848
mutationFn: updateGroupScheduleMember,
@@ -48,13 +58,30 @@ export const useUpdateGroupSchedule = () => {
4858

4959
useEffect(() => {
5060
if (updateGroupScheduleIsSuccess && updateGroupMemberIsSuccess) {
51-
navigator(-1);
61+
successDialog.current?.openModal();
62+
updateGroupMemberReset();
63+
updateGroupScheduleReset();
64+
}
65+
}, [
66+
updateGroupScheduleIsSuccess,
67+
updateGroupMemberIsSuccess,
68+
navigator,
69+
updateGroupMemberReset,
70+
updateGroupScheduleReset,
71+
]);
72+
73+
useEffect(() => {
74+
if (updateGroupScheduleIsError || updateGroupMemberIsError) {
75+
errorDialogRef.current?.openModal();
76+
updateGroupMemberReset();
77+
updateGroupScheduleReset();
5278
}
53-
}, [updateGroupScheduleIsSuccess, updateGroupMemberIsSuccess, navigator]);
79+
}, [updateGroupScheduleIsError, updateGroupMemberIsError, updateGroupMemberReset, updateGroupScheduleReset]);
5480

5581
return {
5682
mutate,
5783
isPending: updateGroupScheduleIsPending || updateGroupMemberIsPending,
58-
isError: updateGroupScheduleIsError || updateGroupMemberIsError,
84+
errorDialogRef,
85+
successDialog,
5986
};
6087
};

0 commit comments

Comments
 (0)