Skip to content

Commit 14c1a31

Browse files
committed
fix: 특정 탭에서 수정한 후 다른 탭으로 이동하여 저장 버튼을 클릭할 시, 이전 탭의 수정 내역이 저장되지 않는 문제 수정
1 parent bf4d58d commit 14c1a31

File tree

1 file changed

+17
-10
lines changed

1 file changed

+17
-10
lines changed

apps/pyconkr-admin/src/components/layouts/admin_editor.tsx

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import { addErrorSnackbar, addSnackbar } from "../../utils/snackbar";
2828
import { BackendAdminSignInGuard } from "../elements/admin_signin_guard";
2929

3030
type EditorFormDataEventType = IChangeEvent<Record<string, string>, RJSFSchema, { [k in string]: unknown }>;
31-
type onSubmitType = (data: EditorFormDataEventType, event: React.FormEvent<unknown>) => void;
31+
type onSubmitType = (data: Record<string, string>, event: React.FormEvent<unknown>) => void;
3232

3333
type AppResourceType = { app: string; resource: string };
3434
type AppResourceIdType = AppResourceType & { id?: string };
@@ -97,9 +97,12 @@ const InnerAdminEditor: React.FC<AppResourceIdType & AdminEditorPropsType> = Err
9797
const backendAdminClient = Common.Hooks.BackendAdminAPI.useBackendAdminClient();
9898
const { data: schemaInfo } = Common.Hooks.BackendAdminAPI.useSchemaQuery(backendAdminClient, app, resource);
9999

100-
const setTab = (_: React.SyntheticEvent, selectedTab: number) =>
101-
setEditorState((ps) => ({ ...ps, tab: selectedTab }));
102-
const setFormDataState = (formData?: Record<string, string>) => setEditorState((ps) => ({ ...ps, formData }));
100+
const setTab = (_: React.SyntheticEvent, tab: number) => setEditorState((ps) => ({ ...ps, tab }));
101+
const setFormDataState = (newFormData?: Record<string, string>) =>
102+
setEditorState((ps) => {
103+
const formData = newFormData ? { ...ps.formData, ...newFormData } : ps.formData;
104+
return { ...ps, formData };
105+
});
103106
const selectedLanguage = editorState.tab === 0 ? "ko" : "en";
104107
const notSelectedLanguage = editorState.tab === 0 ? "en" : "ko";
105108

@@ -140,14 +143,18 @@ const InnerAdminEditor: React.FC<AppResourceIdType & AdminEditorPropsType> = Err
140143
const onSubmitButtonClick: React.MouseEventHandler<HTMLButtonElement> = () =>
141144
formRef.current && formRef.current.submit();
142145

143-
const onSubmitFunc: onSubmitType = (data, event) => {
144-
beforeSubmit?.(data, event);
145-
submitMutation.mutate(data.formData || {}, {
146-
onSuccess: () => {
146+
const onSubmitFunc = (data: EditorFormDataEventType, event: React.FormEvent) => {
147+
// react-jsonschema-form에서 주는 formData에는 translation_fields로 필터링된 필드가 빠져있어,
148+
// 사용자가 특정 탭에서 수정한 후 다른 탭으로 이동해서 수정하게 되면 이전 탭의 수정 내용이 사라지는 문제가 발생함.
149+
// 따라서, onChange로 항상 값이 추적되는 editorState.formData를 가장 우선적으로 사용함.
150+
const newFormData = editorState.formData || data.formData || {};
151+
beforeSubmit?.(newFormData, event);
152+
submitMutation.mutate(newFormData, {
153+
onSuccess: (newFormData) => {
147154
addSnackbar(id ? "저장했습니다." : "페이지를 생성했습니다.", "success");
148-
afterSubmit?.(data, event);
155+
afterSubmit?.(newFormData, event);
149156

150-
if (!id && data.formData?.id) navigate(`/${app}/${resource}/${data.formData?.id}`);
157+
if (!id && newFormData.id) navigate(`/${app}/${resource}/${newFormData.id}`);
151158
},
152159
onError: addErrorSnackbar,
153160
});

0 commit comments

Comments
 (0)