@@ -19,13 +19,20 @@ import {
1919import { getTemplate } from '@/apis/templates' ;
2020import { areTemplatesEqual } from '@/utils/templateUtils' ;
2121import { debugLog , errorLog } from '@/utils/logger' ;
22+ import {
23+ sendTemplateSaveSuccess ,
24+ sendTemplateSaveFail ,
25+ sendTemplateSyncSuccess ,
26+ sendTemplateSyncFail ,
27+ sendTemplatePublishSuccess ,
28+ sendTemplatePublishFail ,
29+ } from '@/utils/analytics' ;
2230
2331export const EditorHeader = ( ) => {
2432 const { state, dispatch } = useEditorContext ( ) ;
2533 const { syncToServer } = useTemplateSync ( ) ;
2634 const { publishTemplate } = useTemplatePublish ( ) ;
2735 const { loadPostedTemplates } = usePostedTemplates ( ) ;
28-
2936 const handleNameChange = ( e : React . ChangeEvent < HTMLInputElement > ) => {
3037 dispatch ( { type : 'UPDATE_TEMPLATE_NAME' , payload : e . target . value } ) ;
3138 } ;
@@ -100,24 +107,18 @@ export const EditorHeader = () => {
100107
101108 dispatch ( { type : 'SAVE_SUCCESS' , payload : savedTemplate } ) ;
102109
110+ const origin = savedTemplate . cloned ? 'cloned' : 'owned' ;
111+ sendTemplateSaveSuccess ( savedTemplate . templateId , origin , savedTemplate . items . length ) ;
112+
103113 toast . success ( '저장 완료' , {
104114 description : '템플릿이 로컬에 저장되었습니다.' ,
105115 } ) ;
106116 } catch ( error ) {
107117 errorLog ( '[EditorHeader] Save failed:' , error ) ;
108- dispatch ( {
109- type : 'SAVE_FAILED' ,
110- payload :
111- error instanceof Error
112- ? error . message
113- : '저장 중 오류가 발생했습니다.' ,
114- } ) ;
115- toast . error ( '저장 실패' , {
116- description :
117- error instanceof Error
118- ? error . message
119- : '저장 중 오류가 발생했습니다.' ,
120- } ) ;
118+ const errMsg = error instanceof Error ? error . message : '저장 중 오류가 발생했습니다.' ;
119+ dispatch ( { type : 'SAVE_FAILED' , payload : errMsg } ) ;
120+ sendTemplateSaveFail ( state . template . templateId , 'save_error' , errMsg ) ;
121+ toast . error ( '저장 실패' , { description : errMsg } ) ;
121122 }
122123 } ;
123124
@@ -145,15 +146,18 @@ export const EditorHeader = () => {
145146
146147 if ( result . success && result . data ) {
147148 dispatch ( { type : 'SYNC_SUCCESS' , payload : result . data } ) ;
149+ sendTemplateSyncSuccess (
150+ state . template . templateId ,
151+ result . data . items ?. length ?? state . template . items . length
152+ ) ;
148153 toast . success ( '동기화 완료' , {
149154 description : '템플릿이 서버에 동기화되었습니다.' ,
150155 } ) ;
151156 } else {
152157 const errorMsg = result . error || '동기화에 실패했습니다.' ;
153158 dispatch ( { type : 'SYNC_FAILED' , payload : errorMsg } ) ;
154- toast . error ( '동기화 실패' , {
155- description : errorMsg ,
156- } ) ;
159+ sendTemplateSyncFail ( state . template . templateId , 'sync_failed' , errorMsg ) ;
160+ toast . error ( '동기화 실패' , { description : errorMsg } ) ;
157161 }
158162 } ;
159163
@@ -170,13 +174,14 @@ export const EditorHeader = () => {
170174
171175 if ( result . success ) {
172176 await loadPostedTemplates ( ) ;
177+ sendTemplatePublishSuccess ( state . template . templateId , currentItems . length ) ;
173178 toast . success ( '게시 완료' , {
174179 description : '템플릿이 공개 갤러리에 게시되었습니다.' ,
175180 } ) ;
176181 } else {
177- toast . error ( '게시 실패' , {
178- description : result . error || '게시에 실패했습니다.' ,
179- } ) ;
182+ const errMsg = result . error || '게시에 실패했습니다.' ;
183+ sendTemplatePublishFail ( state . template . templateId , 'publish_failed' , errMsg ) ;
184+ toast . error ( '게시 실패' , { description : errMsg } ) ;
180185 }
181186 } ;
182187
0 commit comments