11import { openModal , closeModal } from './modal.js' ;
2+ import { initImageScale } from './image-scale.js' ;
3+ import { initImageEffects } from './image-filters.js' ;
24
35const MAX_HASHTAG_COUNT = 5 ;
46const MAX_COMMENT_LENGTH = 140 ;
5- const TAG_ERROR_TEXT = 'Неправильно заполнены хэштеги' ;
67const HASHTAG_REGEXP = / ^ # [ a - z а - я 0 - 9 ] { 1 , 19 } $ / i;
78
89const form = document . querySelector ( '.img-upload__form' ) ;
@@ -23,6 +24,8 @@ const pristine = new Pristine(form, {
2324export const initUploadForm = ( ) => {
2425 fileInput . addEventListener ( 'change' , ( ) => {
2526 openModal ( uploadOverlay , body ) ;
27+ initImageScale ( ) ;
28+ initImageEffects ( ) ;
2629 } ) ;
2730
2831 cancelBtn . addEventListener ( 'click' , ( ) => {
@@ -31,19 +34,52 @@ export const initUploadForm = () => {
3134 fileInput . value = '' ;
3235 pristine . reset ( ) ;
3336 } ) ;
34- const validateTags = ( value ) => {
37+
38+ const stopEscPropagation = ( evt ) => {
39+ if ( evt . key === 'Escape' ) {
40+ evt . stopPropagation ( ) ;
41+ }
42+ } ;
43+
44+ const parseHashTags = ( value ) => {
3545 if ( ! value ) {
36- return true ;
46+ return [ ] ;
3747 }
38- const splitHashtags = value . split ( ' ' ) . filter ( Boolean ) ;
39- const lowerCaseHashtags = splitHashtags . map ( ( hashtag ) => hashtag . toLowerCase ( ) ) ;
48+ return value . split ( ' ' ) . filter ( Boolean ) ;
49+ } ;
50+
51+ const validateHashtagFormat = ( value ) => {
52+ const tags = parseHashTags ( value ) ;
53+ return tags . every ( ( tag ) => HASHTAG_REGEXP . test ( tag ) ) ;
54+ } ;
55+
56+ const validateHashtagCount = ( value ) => {
57+ const tags = parseHashTags ( value ) ;
58+ return tags . length <= MAX_HASHTAG_COUNT ;
59+ } ;
60+
61+ const validateHashtagUnique = ( value ) => {
62+ const tags = parseHashTags ( value ) ;
63+ const lowerCaseHashtags = tags . map ( ( tag ) => tag . toLowerCase ( ) ) ;
4064 const sizeUnique = new Set ( lowerCaseHashtags ) . size ;
41- if ( splitHashtags . length > MAX_HASHTAG_COUNT || splitHashtags . length !== sizeUnique ) {
42- return false ;
43- }
44- return splitHashtags . every ( ( hashtag ) => HASHTAG_REGEXP . test ( hashtag ) ) ;
65+ return tags . length === sizeUnique ;
4566 } ;
4667
68+ const hashtagValidators = [
69+ {
70+ validator : validateHashtagFormat ,
71+ error : 'Хэштег должен начинаться с # и содержать только буквы и цифры, максимум 20 символов'
72+ } ,
73+ {
74+ validator : validateHashtagCount ,
75+ error : 'Количество хэштегов не может быть больше 5'
76+ } ,
77+ {
78+ validator : validateHashtagUnique ,
79+ error : 'Хэштеги не могут повторяться'
80+ } ,
81+ ] ;
82+
4783 const validateComment = ( value ) => {
4884 if ( ! value ) {
4985 return true ;
@@ -52,11 +88,9 @@ export const initUploadForm = () => {
5288 return value . length <= MAX_COMMENT_LENGTH ;
5389 } ;
5490
55- pristine . addValidator (
56- hashtagInput ,
57- validateTags ,
58- TAG_ERROR_TEXT
59- ) ;
91+ hashtagValidators . forEach ( ( rule ) => {
92+ pristine . addValidator ( hashtagInput , rule . validator , rule . error ) ;
93+ } ) ;
6094
6195 pristine . addValidator (
6296 commentInput ,
@@ -72,11 +106,6 @@ export const initUploadForm = () => {
72106 }
73107 } ) ;
74108
75- const stopEscPropagation = ( evt ) => {
76- if ( evt . key === 'Escape' ) {
77- evt . stopPropagation ( ) ;
78- }
79- } ;
80109 hashtagInput . addEventListener ( 'keydown' , stopEscPropagation ) ;
81110 commentInput . addEventListener ( 'keydown' , stopEscPropagation ) ;
82111} ;
0 commit comments