diff --git a/index.html b/index.html index e97cccf..5635f4f 100644 --- a/index.html +++ b/index.html @@ -7,6 +7,7 @@ + @@ -33,7 +34,7 @@

Фотографии других

Загрузка фотографии

-
+
@@ -122,7 +123,7 @@

Загрузка фотограф

- +
diff --git a/js/main.js b/js/main.js index f3143e9..3ef2337 100644 --- a/js/main.js +++ b/js/main.js @@ -1,5 +1,6 @@ import { photoslist } from './modules/photo-template.js'; import { displaysPictures } from './modules/photo-template.js'; +import './modules/upload-form.js'; displaysPictures(photoslist); diff --git a/js/modules/upload-form.js b/js/modules/upload-form.js new file mode 100644 index 0000000..ad2ab44 --- /dev/null +++ b/js/modules/upload-form.js @@ -0,0 +1,99 @@ +import { isEscapeKey } from './util'; + +const HASHTAGS_COUNT = 5; +const COMMENT_LENGTH = 140; +const REGEXP = /^#[a-zф-яё0-9]{1,19}$/i; + +const errorMessage = { + invalidName: 'введён невалидный хэштег', + hashtagsLimit: 'превышено количество хэштегов', + hashtagsRepeat: 'хэштеги повторяются', + commentsLength: 'длина комментария больше 140 символов' +}; + +const formUpload = document.querySelector('.img-upload__form'); +const imageUploadInput = formUpload.querySelector('.img-upload__input'); +const imageOverlay = formUpload.querySelector('.img-upload__overlay'); +const imageUploadCancel = formUpload.querySelector('.img-upload__cancel'); +const uploadHashtag = formUpload.querySelector('.text__hashtags'); +const uploadComment = formUpload.querySelector('.text__description'); + + +const pristine = new Pristine(formUpload, { + classTo: 'img-upload__field-wrapper', + errorTextParent: 'img-upload__field-wrapper', + errorTextTag: 'div', + errorTextClass: 'img-upload__field-wrapper--error' +}); + +const onDocumentKeyDown = (evt) => { + if(isEscapeKey(evt)){ + evt.preventDefault(); + onCloseUploadWindow(); + } +}; + +const onCancleKeyDown = (evt) => { + if(isEscapeKey(evt)){ + evt.stopPropagation(); + } +}; + +const onOpenUploadWindow = () => { + imageOverlay.classList.remove('hidden'); + document.body.classList.add('modal-open'); + uploadHashtag.addEventListener('keydown', onCancleKeyDown); + uploadComment.addEventListener('keydown', onCancleKeyDown); + document.addEventListener('keydown', onDocumentKeyDown); +}; + +function onCloseUploadWindow() { + imageUploadInput.value = ''; + uploadHashtag.value = ''; + uploadComment.value = ''; + imageOverlay.classList.add('hidden'); + document.body.classList.remove('modal-open'); + document.removeEventListener('keydown', onDocumentKeyDown); + uploadHashtag.removeEventListener('focus', onCancleKeyDown); + uploadComment.removeEventListener('focus', onCancleKeyDown); +} + +imageUploadInput.addEventListener('change', onOpenUploadWindow); + +imageUploadCancel.addEventListener('click', onCloseUploadWindow); + +const getHashtagsArray = (element) => { + const hashtagsArray = element.toLowerCase().split(/\s+/).filter(Boolean); + return hashtagsArray; +}; + +const getHashtagsName = (element) => { + const hashtagsName = getHashtagsArray(element); + + return hashtagsName.every((hashtag) => REGEXP.test(hashtag)); +}; + +const getHashtagsCount = (element) => { + const hashtagsArray = getHashtagsArray(element); + return hashtagsArray.length <= HASHTAGS_COUNT; +}; + +const getHashtagsDuplicate = (element) => { + const hashtagsArray = getHashtagsArray(element); + return new Set(hashtagsArray).size === hashtagsArray.length; +}; + +const getCommentLength = (element) => element.length < COMMENT_LENGTH; + + +pristine.addValidator(uploadHashtag, getHashtagsName, errorMessage.invalidName); +pristine.addValidator(uploadHashtag, getHashtagsCount, errorMessage.hashtagsLimit); +pristine.addValidator(uploadHashtag, getHashtagsDuplicate, errorMessage.hashtagsRepeat); +pristine.addValidator(uploadComment, getCommentLength, errorMessage.commentsLength); + +formUpload.addEventListener('submit', (evt) => { + evt.preventDefault(); + if(pristine.validate()){ + formUpload.submit(); + } +});