@@ -118,22 +118,30 @@ const InnerAdminEmailTemplateEditor: FC = ErrorBoundary.with(
118118 addSnackbar ( "에디터가 아직 준비되지 않았습니다." , "error" ) ;
119119 return ;
120120 }
121- const editor_source = editorRef . current . exportJson ( ) ;
122- const emailDocument = editorRef . current . exportEmailDocument ( ) ;
123- const subject = emailDocument . meta . subject ?. trim ( ) ;
121+ const exportedDocument = editorRef . current . exportEmailDocument ( ) ;
122+ const subject = exportedDocument . meta . subject ?. trim ( ) ;
124123 if ( ! subject ) {
125124 addSnackbar ( "에디터에서 메일 제목(subject)을 입력해주세요." , "error" ) ;
126125 return ;
127126 }
128127 if ( subject . length > MAX_RECOMMENDED_SUBJECT_LENGTH ) {
129128 addSnackbar ( `메일 제목이 ${ subject . length } 자입니다. 대부분의 메일 클라이언트에서 뒷부분이 잘립니다.` , "warning" ) ;
130129 }
130+ // data.title과 editor_source의 제목이 어긋나지 않도록 trim한 제목으로 맞춥니다.
131+ const emailDocument : EmailDocument = { ...exportedDocument , meta : { ...exportedDocument . meta , subject } } ;
132+
133+ let data : string ;
134+ try {
135+ // 백엔드는 data의 렌더 결과를 그대로 발송 payload로 쓰므로 {title, body} JSON object여야 합니다.
136+ data = JSON . stringify ( { title : subject , body : await editorRef . current . exportHTML ( ) } ) ;
137+ } catch ( e ) {
138+ addErrorSnackbar ( e instanceof Error ? e : new Error ( String ( e ) ) ) ;
139+ return ;
140+ }
131141
132142 // 저장 성공 시 쿼리가 reset되며 에디터가 initialDocument로 되돌아가므로, 방금 저장한 문서로 맞춰둡니다.
133143 setInitialDocument ( emailDocument ) ;
134- // 백엔드는 data의 렌더 결과를 그대로 발송 payload로 쓰므로 {title, body} JSON object여야 합니다.
135- const data = JSON . stringify ( { title : subject , body : await editorRef . current . exportHTML ( ) } ) ;
136- const payload : EmailTemplatePayload = { ...meta , data, editor_source } ;
144+ const payload : EmailTemplatePayload = { ...meta , data, editor_source : JSON . stringify ( emailDocument , null , 2 ) } ;
137145 if ( id ) {
138146 updateMutation . mutate ( payload , {
139147 onSuccess : ( ) => addSnackbar ( "수정했습니다." , "success" ) ,
0 commit comments