Skip to content

Commit 8ba9fc5

Browse files
Merge pull request #29 from Alexandra0107/module12-task2
Правки к защите
2 parents 5e319c9 + 883bfd7 commit 8ba9fc5

14 files changed

Lines changed: 368 additions & 235 deletions

js/api.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
const BASE_URL = 'https://31.javascript.htmlacademy.pro/kekstagram';
2+
3+
//Отправляет данные формы на сервер
4+
const sendFormData = async (formData) => {
5+
const submitButton = document.querySelector('.img-upload__submit');
6+
7+
try {
8+
// Блокируем кнопку отправки
9+
submitButton.disabled = true;
10+
submitButton.textContent = 'Отправка...';
11+
12+
const response = await fetch(BASE_URL, {
13+
method: 'POST',
14+
body: formData
15+
});
16+
17+
if (!response.ok) {
18+
throw new Error(`HTTP error! status: ${response.status}`);
19+
}
20+
21+
return await response.json();
22+
} catch (error) {
23+
throw new Error(`Ошибка отправки данных: ${error.message}`);
24+
} finally {
25+
// Разблокируем кнопку после завершения запроса
26+
submitButton.disabled = false;
27+
submitButton.textContent = 'Отправить';
28+
}
29+
};
30+
31+
//Получает данные с сервера
32+
const getData = async (endpoint) => {
33+
try {
34+
const response = await fetch(`${BASE_URL}${endpoint}`);
35+
36+
if (!response.ok) {
37+
throw new Error(`HTTP error! status: ${response.status}`);
38+
}
39+
40+
return await response.json();
41+
} catch (error) {
42+
throw new Error(`Ошибка получения данных: ${error.message}`);
43+
}
44+
};
45+
46+
export { sendFormData, getData };

js/data.js

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,3 @@
1-
// Массив случайных имён
2-
const NAMES = [
3-
'Алексей',
4-
'Мария',
5-
'Дмитрий',
6-
'Елена',
7-
'Сергей',
8-
'Анна',
9-
'Иван',
10-
'Ольга',
11-
'Николай',
12-
'Татьяна'
13-
];
14-
15-
const MESSAGES = [
16-
'Всё отлично!',
17-
'В целом всё неплохо. Но не всё.',
18-
'Когда вы делаете фотографию, хорошо бы убирать палец из кадра. В конце концов это просто непрофессионально.',
19-
'Моя бабушка случайно чихнула с фотоаппаратом в руках и у неё получилась фотография лучше.',
20-
'Я поскользнулся на банановой кожуре и уронил фотоаппарат на кота и у меня получилась фотография лучше.',
21-
'Лица у людей на фотке перекошены, как будто их избивают. Как можно было поймать такой неудачный момент?!'
22-
];
23-
241
// Константы для управления масштабом изображения
252
const SCALE = {
263
STEP: 25, // шаг изменения в процентах
@@ -77,5 +54,4 @@ const EFFECTS = {
7754
// Значение по умолчанию для эффекта
7855
const DEFAULT_EFFECT = 'none';
7956

80-
export {NAMES, MESSAGES,SCALE, EFFECTS, DEFAULT_EFFECT};
81-
57+
export {SCALE, EFFECTS, DEFAULT_EFFECT};

js/dom.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ const getImageElement = () => {
5757
};
5858
export {
5959
getBigPicture,
60-
getBody,
60+
getBody,
6161
getFileInput,
6262
getOverlay,
6363
getPreviewImage,

js/event-handlers.js

Lines changed: 62 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,98 +1,109 @@
11
import { isEscapeKey } from './util.js';
2+
import { sendFormData } from './api.js';
23

34
let currentSuccessElement = null;
45
let currentErrorElement = null;
56

6-
// Удаление сообщения об успехе
7+
// Простые функции удаления (не вызывают обработчики)
78
const 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+
// Обработчики событий (используют уже объявленные функции удаления)
1723
const onSuccessKeydown = (evt) => {
1824
if (isEscapeKey(evt)) {
1925
evt.preventDefault();
2026
removeSuccessMessage();
2127
}
2228
};
2329

24-
// Обработчик клика вне блока сообщения успеха
2530
const 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+
// Функции показа сообщений (используют всё выше объявленное)
3271
const 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-
// Показ сообщения об ошибке отправки
8497
const 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+
//Настраивает все обработчики событий для формы загрузки
143130
const 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

Comments
 (0)