Skip to content

Commit add73f7

Browse files
authored
Merge pull request #12 from YouAreNotReady/module11-task1
2 parents 02b3229 + e8549e5 commit add73f7

File tree

6 files changed

+129
-99
lines changed

6 files changed

+129
-99
lines changed

index.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
<meta charset="utf-8">
55
<meta name="viewport" content="width=device-width,initial-scale=1">
66
<link rel="stylesheet" href="css/normalize.css">
7-
<link rel="stylesheet" href="css/style.css">
87
<link rel="stylesheet" href="vendor/nouislider/nouislider.css">
8+
<link rel="stylesheet" href="css/style.css">
99
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
1010
<title>Кекстаграм</title>
1111
</head>

js/api.js

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import { uploadFormCloseHandler } from './image-upload.js';
2+
import { unblockSubmitButton } from './image-upload.js';
3+
4+
const dataErrorTemplateNode = document.querySelector('#data-error').content.querySelector('.data-error');
5+
const successTemplateNode = document.querySelector('#success').content.querySelector('.success');
6+
const errorTemplateNode = document.querySelector('#error').content.querySelector('.error');
7+
const ERROR_TIMEOUT_MS = 5000;
8+
const BASE_URL = 'https://31.javascript.htmlacademy.pro/kekstagram';
9+
const Route = {
10+
GET_DATA: '/data',
11+
SEND_DATA: '/',
12+
};
13+
14+
const showError = () => {
15+
const errorMessage = dataErrorTemplateNode.cloneNode(true);
16+
document.body.appendChild(errorMessage);
17+
setTimeout(() => {
18+
errorMessage.remove();
19+
}, ERROR_TIMEOUT_MS);
20+
};
21+
22+
const uploadSuccessful = () => {
23+
const successMessage = successTemplateNode.cloneNode(true);
24+
document.body.appendChild(successMessage);
25+
26+
const successTemplateNodeClickHandler = (evt) => {
27+
if(!evt.target.closest('div') || evt.target.closest('button')) {
28+
successMessage.remove();
29+
document.body.removeEventListener('click', successTemplateNodeClickHandler);
30+
}
31+
};
32+
document.body.addEventListener('click', successTemplateNodeClickHandler);
33+
34+
uploadFormCloseHandler();
35+
};
36+
37+
const uploadError = () => {
38+
const errorMessage = errorTemplateNode.cloneNode(true);
39+
document.body.appendChild(errorMessage);
40+
41+
const errorTemplateNodeClickHandler = (evt) => {
42+
if(!evt.target.closest('div') || evt.target.closest('button')) {
43+
errorMessage.remove();
44+
document.body.removeEventListener('click', errorTemplateNodeClickHandler);
45+
}
46+
};
47+
48+
document.body.addEventListener('click', errorTemplateNodeClickHandler);
49+
50+
uploadFormCloseHandler(true);
51+
};
52+
53+
const loadData = (onSuccess) => {
54+
fetch(`${BASE_URL}${Route.GET_DATA}`)
55+
.then((response) => {
56+
if(!response.ok) {
57+
throw new Error();
58+
}
59+
return response.json();
60+
})
61+
.then(
62+
(picturesObjects) => {
63+
onSuccess(picturesObjects);
64+
}
65+
)
66+
.catch(showError);
67+
};
68+
69+
const uploadData = (body) => {
70+
fetch(
71+
`${BASE_URL}${Route.SEND_DATA}`,
72+
{
73+
method: 'POST',
74+
body: body,
75+
},
76+
).then((response) => {
77+
if(!response.ok) {
78+
throw new Error();
79+
}
80+
81+
return uploadSuccessful();
82+
}).catch(uploadError)
83+
.finally(unblockSubmitButton);
84+
};
85+
86+
export { loadData, uploadData };

js/comment-validation.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
const validateComment = (value) => value.length <= 140;
2+
const validateCommentError = 'Длина комментария не может составлять больше 140 символов';
23

3-
export { validateComment };
4+
export { validateComment, validateCommentError };

js/data-generator.js

-81
This file was deleted.

js/image-upload.js

+36-12
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import { isEscapeKey } from './util.js';
2+
import { uploadData } from './api.js';
23
import { imagePreview, scaleValueField } from './image-scaling.js';
34
import { sliderElementWrapper } from './image-effect.js';
45
import { validateAllHashtags, validateHashtagError } from './hashtag-validation.js';
5-
import { validateComment } from './comment-validation.js';
6+
import { validateComment, validateCommentError } from './comment-validation.js';
67

78
const imageUploadForm = document.querySelector('.img-upload__form');
89
const imageUploadNode = imageUploadForm.querySelector('.img-upload__overlay');
910
const imageUploadInput = imageUploadForm.querySelector('.img-upload__input');
11+
const imageUploadSubmit = imageUploadForm.querySelector('.img-upload__submit');
1012
const imageUploadCloseButton = imageUploadForm.querySelector('.img-upload__cancel');
1113
const effectOriginal = imageUploadForm.querySelector('#effect-none');
1214
const hashtagsInput = imageUploadForm.querySelector('.text__hashtags');
@@ -19,6 +21,14 @@ const pristine = new Pristine(imageUploadForm, {
1921
errorTextTag: 'div',
2022
}, false);
2123

24+
const blockSubmitButton = () => {
25+
imageUploadSubmit.disabled = true;
26+
};
27+
28+
const unblockSubmitButton = () => {
29+
imageUploadSubmit.disabled = false;
30+
};
31+
2232
const onDocumentKeydown = (evt) => {
2333
if (isEscapeKey(evt)) {
2434
evt.preventDefault();
@@ -30,21 +40,24 @@ const onDocumentKeydown = (evt) => {
3040
};
3141

3242
function uploadFormClear() {
33-
imageUploadInput.value = '';
3443
hashtagsInput.value = '';
3544
commentInput.value = '';
3645
effectOriginal.checked = true;
3746
sliderElementWrapper.classList.add('hidden');
38-
imagePreview.style.transform = '';
3947
imagePreview.style.filter = '';
4048
scaleValueField.value = '100%';
49+
imagePreview.style.transform = '';
4150
}
4251

43-
function uploadFormCloseHandler() {
52+
function uploadFormCloseHandler(_,uploadError = false) {
4453
imageUploadNode.classList.add('hidden');
4554
document.body.classList.remove('modal-open');
55+
imageUploadInput.value = '';
56+
57+
if(!uploadError) {
58+
uploadFormClear();
59+
}
4660

47-
uploadFormClear();
4861
document.removeEventListener('keydown', onDocumentKeydown);
4962
imageUploadCloseButton.removeEventListener('click', uploadFormCloseHandler);
5063
}
@@ -65,12 +78,23 @@ imageUploadInput.addEventListener('change', ()=> {
6578
});
6679

6780
pristine.addValidator(imageUploadForm.querySelector('.text__hashtags'), validateAllHashtags, validateHashtagError);
68-
pristine.addValidator(imageUploadForm.querySelector('.text__description'), validateComment, 'Длина комментария не может составлять больше 140 символов');
81+
pristine.addValidator(imageUploadForm.querySelector('.text__description'), validateComment, validateCommentError);
6982

70-
imageUploadForm.addEventListener('submit', (evt) => {
71-
evt.preventDefault();
72-
pristine.validate();
7383

74-
imageUploadForm.removeEventListener('keydown', uploadFormNoEscWhenInputActive);
75-
imageUploadCloseButton.removeEventListener('click', uploadFormCloseHandler);
76-
});
84+
const setImageUploadFormSubmit = () => {
85+
imageUploadForm.addEventListener('submit', (evt) => {
86+
evt.preventDefault();
87+
88+
const isValid = pristine.validate();
89+
if(isValid) {
90+
const formData = new FormData(evt.target);
91+
blockSubmitButton();
92+
uploadData(formData);
93+
}
94+
95+
imageUploadForm.removeEventListener('keydown', uploadFormNoEscWhenInputActive);
96+
imageUploadCloseButton.removeEventListener('click', uploadFormCloseHandler);
97+
});
98+
};
99+
100+
export { setImageUploadFormSubmit, uploadFormCloseHandler, unblockSubmitButton };

js/main.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import { generatePhotoObjects } from './data-generator.js';
21
import { renderPictures } from './pictures-preview-loader.js';
2+
import { loadData } from './api.js';
3+
import { setImageUploadFormSubmit } from './image-upload.js';
34

45
import './show-image-fullscreen.js';
5-
import './hashtag-validation.js';
6-
import './comment-validation.js';
76
import './image-upload.js';
87
import './image-scaling.js';
98
import './image-effect.js';
109
import './image-filtration.js';
1110

12-
renderPictures(generatePhotoObjects());
11+
loadData(renderPictures);
12+
setImageUploadFormSubmit();

0 commit comments

Comments
 (0)