Skip to content

Commit 5192dea

Browse files
authored
임시저장 QA 반영 (#1224)
1 parent 897f62c commit 5192dea

File tree

2 files changed

+33
-11
lines changed

2 files changed

+33
-11
lines changed

pages/make/index.tsx

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { fontsObject } from '@sopt-makers/fonts';
1111
import { FormType, schema } from '@type/form';
1212
import dynamic from 'next/dynamic';
1313
import { useRouter } from 'next/router';
14-
import { useEffect } from 'react';
14+
import { useEffect, useRef, useState } from 'react';
1515
import { FormProvider, SubmitHandler, useForm } from 'react-hook-form';
1616
import { styled } from 'stitches.config';
1717

@@ -21,7 +21,7 @@ const DevTool = dynamic(() => import('@hookform/devtools').then(module => module
2121

2222
const MakePage = () => {
2323
const router = useRouter();
24-
const { draftFormValues } = useDraftCreateMeeting();
24+
const { draftFormValues, removeDraftCreateMeeting } = useDraftCreateMeeting();
2525
const formMethods = useForm<FormType>({
2626
mode: 'onChange',
2727
reValidateMode: 'onChange',
@@ -34,6 +34,8 @@ const MakePage = () => {
3434
});
3535
const { isValid, errors, isDirty } = formMethods.formState;
3636
const { mutate: mutateCreateMeeting, isPending: isSubmitting } = usePostMeetingMutation();
37+
const submittedRef = useRef(false);
38+
const [hasDraftLoaded, setHasDraftLoaded] = useState(false);
3739

3840
const handleChangeImage = (index: number, url: string) => {
3941
const files = formMethods.getValues().files.slice();
@@ -51,30 +53,43 @@ const MakePage = () => {
5153
mutateCreateMeeting(formData, {
5254
onSuccess: data => {
5355
ampli.completedMakeGroup();
56+
submittedRef.current = true;
57+
removeDraftCreateMeeting();
5458
alert('모임을 개설했습니다.');
5559
router.push(`/detail?id=${data.meetingId}`);
5660
},
5761
});
5862
};
5963

6064
useEffect(() => {
61-
return () => {
62-
if (isDirty) {
65+
const persistDraft = () => {
66+
if (isDirty && !submittedRef.current) {
6367
LocalStorage.setItem(LocalStorageKey.DraftCreateMeeting, {
6468
dateTime: Date.now(),
6569
formValues: formMethods.getValues(),
6670
});
6771
}
6872
};
73+
74+
window.addEventListener('beforeunload', persistDraft);
75+
window.addEventListener('pagehide', persistDraft);
76+
77+
return () => {
78+
window.removeEventListener('beforeunload', persistDraft);
79+
window.removeEventListener('pagehide', persistDraft);
80+
persistDraft();
81+
};
6982
}, [formMethods, isDirty]);
7083

7184
useEffect(() => {
7285
if (draftFormValues) {
7386
formMethods.reset(draftFormValues);
87+
setHasDraftLoaded(true);
7488
}
75-
}, [draftFormValues]);
89+
}, [draftFormValues, formMethods]);
7690

7791
const handleSubmit = formMethods.handleSubmit(onSubmit);
92+
const isSubmitDisabled = isSubmitting || !isValid || Object.keys(errors).length > 0 || (!isDirty && !hasDraftLoaded);
7893

7994
return (
8095
<FormProvider {...formMethods}>
@@ -87,14 +102,14 @@ const MakePage = () => {
87102
handleChangeImage={handleChangeImage}
88103
handleDeleteImage={handleDeleteImage}
89104
onSubmit={handleSubmit}
90-
disabled={isSubmitting || !isValid || Object.keys(errors).length > 0 || !isDirty}
105+
disabled={isSubmitDisabled}
91106
/>
92107
</SFormContainer>
93108
<TableOfContents
94109
label="작성 항목"
95110
onSubmit={handleSubmit}
96111
submitButtonLabel="개설하기"
97-
disabled={isSubmitting || !isValid || Object.keys(errors).length > 0 || !isDirty}
112+
disabled={isSubmitDisabled}
98113
/>
99114
</SContainer>
100115
{/* eslint-disable-next-line @typescript-eslint/ban-ts-comment */}

src/domain/meeting/DraftCreateMeetingModal/index.tsx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import LocalStorageKey from '@/store/localStorage/LocalStorageKey';
33
import { useDialog } from '@sopt-makers/ui';
44
import { FormType } from '@type/form';
55
import dayjs from '@util/dayjs';
6-
import { useEffect, useState } from 'react';
6+
import { useCallback, useEffect, useState } from 'react';
77

88
const formatDateTime = (dateTime: number) => {
99
return dayjs(dateTime).format('YYYY년 M월 D일 HH시 mm분');
@@ -12,6 +12,10 @@ const formatDateTime = (dateTime: number) => {
1212
const useDraftCreateMeeting = () => {
1313
const { open: openDialog, close: closeDialog } = useDialog();
1414
const [draftFormValues, setDraftFormValues] = useState<FormType | null>(null);
15+
const removeDraftCreateMeeting = useCallback(() => {
16+
LocalStorage.removeItem(LocalStorageKey.DraftCreateMeeting);
17+
setDraftFormValues(null);
18+
}, []);
1519

1620
useEffect(() => {
1721
const draftCreateMeeting = LocalStorage.getItem(LocalStorageKey.DraftCreateMeeting);
@@ -25,8 +29,7 @@ const useDraftCreateMeeting = () => {
2529
cancelButtonText: '새로 쓰기',
2630
approveButtonText: '이어서 쓰기',
2731
onCancel: () => {
28-
setDraftFormValues(null);
29-
LocalStorage.removeItem(LocalStorageKey.DraftCreateMeeting);
32+
removeDraftCreateMeeting();
3033
closeDialog();
3134
},
3235
onApprove: () => {
@@ -36,10 +39,14 @@ const useDraftCreateMeeting = () => {
3639
},
3740
});
3841
}
42+
43+
return () => {
44+
closeDialog();
45+
};
3946
// eslint-disable-next-line react-hooks/exhaustive-deps
4047
}, []);
4148

42-
return { draftFormValues };
49+
return { draftFormValues, removeDraftCreateMeeting };
4350
};
4451

4552
export default useDraftCreateMeeting;

0 commit comments

Comments
 (0)