Skip to content

Commit 8c2d6fe

Browse files
committed
api
1 parent 96acd5a commit 8c2d6fe

9 files changed

Lines changed: 112 additions & 151 deletions

File tree

js/api.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
export const getPhotos = () => fetch('https://31.javascript.htmlacademy.pro/kekstagram/data')
2+
.then((response) => {
3+
if (!response.ok) {
4+
throw new Error();
5+
}
6+
return response.json();
7+
});
8+
9+
export const postPhoto = (body) => fetch('https://31.javascript.htmlacademy.pro/kekstagram/',
10+
{
11+
method: 'post',
12+
body
13+
}
14+
);

js/big-picture.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* eslint-disable no-use-before-define */
22

33
const COMMENTS_STEP = 5;
4-
const body = document.body;
4+
const bodyNode = document.body;
55
const modalNode = document.querySelector('.big-picture');
66
const closeButtonNode = modalNode.querySelector('.big-picture__cancel');
77
const imageNode = modalNode.querySelector('.big-picture__img img');
@@ -23,14 +23,14 @@ let renderedComments;
2323
const showModal = (isVisible = true) => {
2424
if (isVisible) {
2525
modalNode.classList.remove('hidden');
26-
body.classList.add('modal-open');
26+
bodyNode.classList.add('modal-open');
2727

2828

2929
document.addEventListener('keydown', onDocumentKeydown);
3030
return;
3131
}
3232
modalNode.classList.add('hidden');
33-
body.classList.remove('modal-open');
33+
bodyNode.classList.remove('modal-open');
3434

3535
document.removeEventListener('keydown', onDocumentKeydown);
3636
};

js/constans.js

Lines changed: 0 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -83,64 +83,3 @@ export const EffectsSettings = {
8383
},
8484
};
8585

86-
export const MIN_LIKES = 15;
87-
export const MAX_LIKES = 200;
88-
export const MIN_COMMENTS = 0;
89-
export const MAX_COMMENTS = 30;
90-
91-
export const DESCRIPTIONS = [
92-
'Красивый вид',
93-
'Указатель',
94-
'Море',
95-
'Девушка',
96-
'Суп-улыбка',
97-
'Спортивная-машина',
98-
'Клубника на тарелке',
99-
'Морс',
100-
'Самолет над пляжем',
101-
'Отдел для обуви',
102-
'Ограждение на пляже',
103-
'Спорткар Ауди',
104-
'Салат',
105-
'Кот ролл',
106-
'Модные сапоги',
107-
'Вид с высоты',
108-
'Оркестр',
109-
'Ретроавтомобиль',
110-
'Женщина в тапочках',
111-
'Пальмы в зоне отеля',
112-
'Тарелка с едой',
113-
'Закат на море',
114-
'Краб',
115-
'Фаер-шоу',
116-
'Тропики',
117-
];
118-
119-
// Массив имён для комментаторов
120-
export const NAMES = [
121-
'Александр',
122-
'Мария',
123-
'Иван',
124-
'Екатерина',
125-
'Дмитрий',
126-
'Анна',
127-
'Сергей',
128-
'Ольга',
129-
'Алексей',
130-
'Наталья',
131-
'Артём',
132-
'Елена',
133-
'Максим',
134-
'Татьяна',
135-
'Владимир',
136-
];
137-
138-
// Массив фраз для комментариев
139-
export const PHRASES = [
140-
'Всё отлично!',
141-
'В целом всё неплохо. Но не всё.',
142-
'Когда вы делаете фотографию, хорошо бы убирать палец из кадра. В конце концов это просто непрофессионально.',
143-
'Моя бабушка случайно чихнула с фотоаппаратом в руках и у неё получилась фотография лучше.',
144-
'Я поскользнулся на банановой кожуре и уронил фотоаппарат на кота и у меня получилась фотография лучше.',
145-
'Лица у людей на фотке перекошены, как будто их избивают. Как можно было поймать такой неудачный момент?!',
146-
];

js/data.js

Lines changed: 0 additions & 58 deletions
This file was deleted.

js/form.js

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
import { isValid, resetValidation } from './validation.js';
22
import { resetScale } from './scale.js';
33
import { resetEffects } from './effects.js';
4+
import { Popups, showPopup } from './popups.js';
5+
6+
const SubmitButtonCaptions = {
7+
IDLE: 'Опубликовать',
8+
SENDING: 'Публикую...'
9+
};
410

511
const formNode = document.querySelector('#upload-select-image');
612
const inputFileNode = document.querySelector('#upload-file');
713
const modalNode = document.querySelector('.img-upload__overlay');
814
const closeButtonNode = document.querySelector('#upload-cancel');
15+
const submitButtonNode = document.querySelector('#upload-submit');
916

1017
const closeModal = () => {
1118
modalNode.classList.add('hidden');
@@ -26,8 +33,37 @@ closeButtonNode.addEventListener('click', (evt) => {
2633
closeModal();
2734
});
2835

36+
const blockSubmit = (isBlocked = true) => {
37+
submitButtonNode.disabled = isBlocked;
38+
submitButtonNode.textContent = isBlocked ? SubmitButtonCaptions.SENDING : SubmitButtonCaptions.IDLE;
39+
};
40+
2941
formNode.addEventListener('submit', (evt) => {
30-
if (!isValid()) {
31-
evt.preventDefault();
42+
evt.preventDefault();
43+
if (isValid()) {
44+
blockSubmit();
45+
fetch('https://31.javascript.htmlacademy.pro/kekstagram/',
46+
{
47+
method: 'post',
48+
body: new FormData(formNode)
49+
}
50+
)
51+
.then((response) => {
52+
if (!response.ok) {
53+
throw new Error();
54+
}
55+
//close form
56+
closeModal();
57+
58+
//show success popup
59+
showPopup(Popups.SUCCESS);
60+
})
61+
.finally(() => {
62+
blockSubmit(false);
63+
})
64+
.catch(() => {
65+
// show error popup
66+
showPopup(Popups.ERROR);
67+
});
3268
}
3369
});

js/functions.js

Lines changed: 0 additions & 23 deletions
This file was deleted.

js/main.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1-
import { getPhotos } from './data.js';
1+
import { getPhotos } from './api.js';
22
import { renderCards } from './render-cards.js';
33
import './form.js';
4+
import { showErrorBanner } from './utils.js';
45

5-
6-
const photos = getPhotos(25);
7-
renderCards(photos);
6+
getPhotos()
7+
.then((photos) => {
8+
//set filters
9+
renderCards(photos);
10+
})
11+
.catch(() => {
12+
showErrorBanner();
13+
});

js/popups.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
export const Popups = {
2+
ERROR: 'error',
3+
SUCCESS: 'success'
4+
};
5+
const successTemplate = document.querySelector('#success').content.querySelector('.success');
6+
const errorTemplate = document.querySelector('#error').content.querySelector('.error');
7+
const bodyNode = document.body;
8+
9+
const templates = {
10+
[Popups.ERROR]: errorTemplate,
11+
[Popups.SUCCESS]: successTemplate
12+
};
13+
14+
export const showPopup = (type) => {
15+
const popup = templates[type].cloneNode(true);
16+
bodyNode.append(popup);
17+
18+
const onDocumentKeydown = ({ key }) => {
19+
if (key === 'Escape') {
20+
popup.remove();
21+
document.removeEventListener('keydown', onDocumentKeydown);
22+
}
23+
};
24+
25+
popup.addEventListener('click', ({ target }) => {
26+
if (target.classList.contains(type) || target.classList.contains(`${type}__button`)) {
27+
popup.remove();
28+
document.removeEventListener('keydown', onDocumentKeydown);
29+
}
30+
});
31+
32+
document.addEventListener('keydown', onDocumentKeydown);
33+
};

js/utils.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
const TIMEOUT = 5000;
2+
3+
const errorBannerTemplate = document.querySelector('#data-error').content.querySelector('.data-error');
4+
const bodyNode = document.body;
5+
16
// Функция getRandomNumber
27
export const getRandomNumber = (min, max) => {
38
const left = Math.ceil(Math.min(min, max));
@@ -8,3 +13,12 @@ export const getRandomNumber = (min, max) => {
813

914
//Функция getRandomElement
1015
export const getRandomElement = (items) => items[getRandomNumber(0, items.length - 1)];
16+
17+
18+
export const showErrorBanner = () => {
19+
const errorBanner = errorBannerTemplate.cloneNode(true);
20+
bodyNode.append(errorBanner);
21+
setTimeout(() => {
22+
errorBanner.remove();
23+
}, TIMEOUT);
24+
};

0 commit comments

Comments
 (0)