11import { isEscapeKey } from './util.js' ;
2+ import { sendFormData } from './api.js' ;
23
34let currentSuccessElement = null ;
45let currentErrorElement = null ;
56
6- // Удаление сообщения об успехе
7+ // Простые функции удаления (не вызывают обработчики)
78const removeSuccessMessage = ( ) => {
89 if ( currentSuccessElement && currentSuccessElement . parentNode ) {
910 currentSuccessElement . parentNode . removeChild ( currentSuccessElement ) ;
1011 currentSuccessElement = null ;
11- document . removeEventListener ( 'keydown' , onSuccessKeydown ) ;
12- document . removeEventListener ( 'click' , onSuccessClickOutside ) ;
1312 }
1413} ;
1514
16- // Обработчик нажатия клавиш для сообщения успеха
15+ const removeErrorMessage = ( ) => {
16+ if ( currentErrorElement && currentErrorElement . parentNode ) {
17+ currentErrorElement . parentNode . removeChild ( currentErrorElement ) ;
18+ currentErrorElement = null ;
19+ }
20+ } ;
21+
22+ // Обработчики событий (используют уже объявленные функции удаления)
1723const onSuccessKeydown = ( evt ) => {
1824 if ( isEscapeKey ( evt ) ) {
1925 evt . preventDefault ( ) ;
2026 removeSuccessMessage ( ) ;
2127 }
2228} ;
2329
24- // Обработчик клика вне блока сообщения успеха
2530const onSuccessClickOutside = ( evt ) => {
2631 if ( ! currentSuccessElement ?. contains ( evt . target ) ) {
2732 removeSuccessMessage ( ) ;
2833 }
2934} ;
3035
31- // Показ сообщения об успешной отправке
36+ const onErrorKeydown = ( evt ) => {
37+ if ( isEscapeKey ( evt ) ) {
38+ evt . preventDefault ( ) ;
39+ removeErrorMessage ( ) ;
40+ }
41+ } ;
42+
43+ const onErrorClickOutside = ( evt ) => {
44+ if ( ! currentErrorElement ?. contains ( evt . target ) ) {
45+ removeErrorMessage ( ) ;
46+ }
47+ } ;
48+
49+ // Используем обработчики и функции удаления
50+ const addSuccessEventListeners = ( ) => {
51+ document . addEventListener ( 'keydown' , onSuccessKeydown ) ;
52+ document . addEventListener ( 'click' , onSuccessClickOutside ) ;
53+ } ;
54+
55+ const removeSuccessEventListeners = ( ) => {
56+ document . removeEventListener ( 'keydown' , onSuccessKeydown ) ;
57+ document . removeEventListener ( 'click' , onSuccessClickOutside ) ;
58+ } ;
59+
60+ const addErrorEventListeners = ( ) => {
61+ document . addEventListener ( 'keydown' , onErrorKeydown ) ;
62+ document . addEventListener ( 'click' , onErrorClickOutside ) ;
63+ } ;
64+
65+ const removeErrorEventListeners = ( ) => {
66+ document . removeEventListener ( 'keydown' , onErrorKeydown ) ;
67+ document . removeEventListener ( 'click' , onErrorClickOutside ) ;
68+ } ;
69+
70+ // Функции показа сообщений (используют всё выше объявленное)
3271const showSuccessMessage = ( ) => {
3372 const successTemplate = document . querySelector ( '#success' ) ;
3473 if ( ! successTemplate ) {
35- console . warn ( 'Шаблон #success не найден' ) ;
3674 return ;
3775 }
3876
3977 const fragment = successTemplate . content . cloneNode ( true ) ;
4078 currentSuccessElement = fragment . firstElementChild ;
4179
4280 if ( ! currentSuccessElement ) {
43- console . warn ( 'Не удалось извлечь элемент из шаблона #success' ) ;
4481 return ;
4582 }
4683
4784 document . body . appendChild ( currentSuccessElement ) ;
4885
4986 const successButton = currentSuccessElement . querySelector ( '.success__button' ) ;
5087 if ( successButton ) {
51- successButton . addEventListener ( 'click' , removeSuccessMessage ) ;
52- }
53-
54- document . addEventListener ( 'keydown' , onSuccessKeydown ) ;
55- document . addEventListener ( 'click' , onSuccessClickOutside ) ;
56- } ;
57-
58- // Удаление сообщения об ошибке
59- const removeErrorMessage = ( ) => {
60- if ( currentErrorElement && currentErrorElement . parentNode ) {
61- currentErrorElement . parentNode . removeChild ( currentErrorElement ) ;
62- currentErrorElement = null ;
63- document . removeEventListener ( 'keydown' , onErrorKeydown ) ;
64- document . removeEventListener ( 'click' , onErrorClickOutside ) ;
65- }
66- } ;
67-
68- // Обработчик нажатия клавиш для сообщения ошибки
69- const onErrorKeydown = ( evt ) => {
70- if ( isEscapeKey ( evt ) ) {
71- evt . preventDefault ( ) ;
72- removeErrorMessage ( ) ;
88+ successButton . addEventListener ( 'click' , ( ) => {
89+ removeSuccessMessage ( ) ;
90+ removeSuccessEventListeners ( ) ;
91+ } ) ;
7392 }
74- } ;
7593
76- // Обработчик клика вне блока сообщения ошибки
77- const onErrorClickOutside = ( evt ) => {
78- if ( ! currentErrorElement ?. contains ( evt . target ) ) {
79- removeErrorMessage ( ) ;
80- }
94+ addSuccessEventListeners ( ) ;
8195} ;
8296
83- // Показ сообщения об ошибке отправки
8497const showErrorMessage = ( errorMessage ) => {
8598 const errorTemplate = document . querySelector ( '#error' ) ;
8699 if ( ! errorTemplate ) {
87- console . warn ( 'Шаблон #error не найден' ) ;
88100 return ;
89101 }
90102
91103 const fragment = errorTemplate . content . cloneNode ( true ) ;
92104 currentErrorElement = fragment . firstElementChild ;
93105
94106 if ( ! currentErrorElement ) {
95- console . warn ( 'Не удалось извлечь элемент из шаблона #error' ) ;
96107 return ;
97108 }
98109
@@ -106,40 +117,16 @@ const showErrorMessage = (errorMessage) => {
106117
107118 const errorButton = currentErrorElement . querySelector ( '.error__button' ) ;
108119 if ( errorButton ) {
109- errorButton . addEventListener ( 'click' , removeErrorMessage ) ;
110- }
111-
112- document . addEventListener ( 'keydown' , onErrorKeydown ) ;
113- document . addEventListener ( 'click' , onErrorClickOutside ) ;
114- } ;
115-
116- const sendFormData = async ( formData ) => {
117- const submitButton = document . querySelector ( '.img-upload__submit' ) ;
118-
119- try {
120- // Блокируем кнопку отправки
121- submitButton . disabled = true ;
122- submitButton . textContent = 'Отправка...' ;
123-
124- const response = await fetch ( 'https://31.javascript.htmlacademy.pro/kekstagram' , {
125- method : 'POST' ,
126- body : formData
120+ errorButton . addEventListener ( 'click' , ( ) => {
121+ removeErrorMessage ( ) ;
122+ removeErrorEventListeners ( ) ;
127123 } ) ;
128-
129- if ( ! response . ok ) {
130- throw new Error ( `HTTP error! status: ${ response . status } ` ) ;
131- }
132-
133- return await response . json ( ) ;
134- } catch ( error ) {
135- throw error ;
136- } finally {
137- // Разблокируем кнопку после завершения запроса
138- submitButton . disabled = false ;
139- submitButton . textContent = 'Отправить' ;
140124 }
125+
126+ addErrorEventListeners ( ) ;
141127} ;
142128
129+ //Настраивает все обработчики событий для формы загрузки
143130const setupEventHandlers = (
144131 fileInput ,
145132 cancelButton ,
@@ -170,15 +157,16 @@ const setupEventHandlers = (
170157 }
171158
172159 try {
173- // Отправляем данные на сервер
174- await sendFormData ( new FormData ( uploadForm ) ) ;
160+ // Создаём FormData из формы
161+ const formData = new FormData ( uploadForm ) ;
162+
163+ // Отправляем данные на сервер через API-модуль
164+ await sendFormData ( formData ) ;
175165
176166 // Показ успеха и закрытие формы с сбросом
177167 showSuccessMessage ( ) ;
178168 onSubmitSuccess ( ) ; // Вызываем callback для сброса формы
179169 } catch ( error ) {
180- console . error ( 'Ошибка отправки формы:' , error ) ;
181- // Показ ошибки — форма остаётся открытой для повторной отправки
182170 showErrorMessage ( 'Не удалось отправить форму. Проверьте подключение и попробуйте ещё раз.' ) ;
183171 }
184172 } ) ;
@@ -205,4 +193,4 @@ const setupEventHandlers = (
205193 }
206194} ;
207195
208- export { setupEventHandlers , showSuccessMessage , showErrorMessage , sendFormData } ;
196+ export { setupEventHandlers , showSuccessMessage , showErrorMessage } ;
0 commit comments