|
| 1 | +import { isEsc } from './util.js'; |
| 2 | + |
| 3 | +const uploadForm = document.querySelector('.img-upload__form'); |
| 4 | +const fileInput = uploadForm.querySelector('.img-upload__input'); |
| 5 | +const overlay = uploadForm.querySelector('.img-upload__overlay'); |
| 6 | +const closeButton = uploadForm.querySelector('.img-upload__cancel'); |
| 7 | +const hashtagInput = uploadForm.querySelector('.text__hashtags'); |
| 8 | +const commentInput = uploadForm.querySelector('.text__description'); |
| 9 | + |
| 10 | +// Инициализация Pristine |
| 11 | +const pristine = new Pristine(uploadForm, { |
| 12 | + classTo: 'img-upload__field-wrapper', |
| 13 | + errorTextParent: 'img-upload__field-wrapper', |
| 14 | + errorTextClass: 'img-upload__field-wrapper--error', |
| 15 | +}); |
| 16 | + |
| 17 | +// Закрытие формы |
| 18 | +const closeUploadModal = () => { |
| 19 | + overlay.classList.add('hidden'); |
| 20 | + document.body.classList.remove('modal-open'); |
| 21 | + uploadForm.reset(); // Сбрасывает все поля |
| 22 | + pristine.reset(); // Очищает ошибки валидации |
| 23 | + document.removeEventListener('keydown', onDocumentKeydown); |
| 24 | +}; |
| 25 | + |
| 26 | +// Обработчик Esc (не закрывать, если фокус в полях ввода) |
| 27 | +function onDocumentKeydown(evt) { |
| 28 | + if (isEsc(evt) && document.activeElement !== hashtagInput && document.activeElement !== commentInput) { |
| 29 | + evt.preventDefault(); |
| 30 | + closeUploadModal(); |
| 31 | + } |
| 32 | +} |
| 33 | + |
| 34 | +// Открытие формы при выборе файла |
| 35 | +fileInput.addEventListener('change', () => { |
| 36 | + overlay.classList.remove('hidden'); |
| 37 | + document.body.classList.add('modal-open'); |
| 38 | + document.addEventListener('keydown', onDocumentKeydown); |
| 39 | +}); |
| 40 | + |
| 41 | +closeButton.addEventListener('click', closeUploadModal); |
| 42 | + |
| 43 | +// Валидация хэштегов |
| 44 | +const MAX_HASHTAGS = 5; |
| 45 | +const VALID_SYMBOLS = /^#[a-zа-яё0-9]{1,19}$/i; |
| 46 | + |
| 47 | +const validateHashtags = (value) => { |
| 48 | + const hashtags = value.trim().toLowerCase().split(/\s+/).filter(Boolean); |
| 49 | + |
| 50 | + const hasValidCount = hashtags.length <= MAX_HASHTAGS; |
| 51 | + const hasUniqueHashtags = new Set(hashtags).size === hashtags.length; |
| 52 | + const hasValidSymbols = hashtags.every((tag) => VALID_SYMBOLS.test(tag)); |
| 53 | + |
| 54 | + return hasValidCount && hasUniqueHashtags && hasValidSymbols; |
| 55 | +}; |
| 56 | + |
| 57 | +pristine.addValidator(hashtagInput, validateHashtags, 'Некорректные хэштеги (макс 5, без повторов, начинаются с #)'); |
| 58 | + |
| 59 | +// Валидация комментария |
| 60 | +pristine.addValidator(commentInput, (val) => val.length <= 140, 'Максимум 140 символов'); |
| 61 | + |
| 62 | +// Отправка формы |
| 63 | +uploadForm.addEventListener('submit', (evt) => { |
| 64 | + const isValid = pristine.validate(); |
| 65 | + if (!isValid) { |
| 66 | + evt.preventDefault(); |
| 67 | + } |
| 68 | +}); |
0 commit comments