1+ const initialRender = ( initialElements , i18n ) => {
2+ Object . entries ( initialElements ) . forEach ( ( [ elementName , element ] ) => {
3+ if ( elementName === 'urlInput' ) {
4+ element . setAttribute ( 'placeholder' , i18n . t ( elementName ) )
5+ return
6+ }
7+ const textNode = document . createTextNode ( i18n . t ( elementName ) )
8+ element . prepend ( textNode )
9+ } )
10+ }
11+
112const createInnerContainer = ( entityName , i18n ) => {
213 const innerContainer = document . createElement ( 'div' )
314 innerContainer . classList . add ( 'card' , 'border-0' )
@@ -32,20 +43,28 @@ const insertChildren = (elements, entityName, children, i18n) => {
3243 }
3344}
3445
35- const initialRender = ( initialElements , i18n ) => {
36- Object . entries ( initialElements ) . forEach ( ( [ elementName , element ] ) => {
37- if ( elementName === 'urlInput' ) {
38- element . setAttribute ( 'placeholder' , i18n . t ( elementName ) )
39- return
40- }
41- const textNode = document . createTextNode ( i18n . t ( elementName ) )
42- element . prepend ( textNode )
43- } )
46+ const handleFormStatus = ( elements , status ) => {
47+ switch ( status ) {
48+ case 'validating' :
49+ elements . addUrlButton . disabled = true
50+ break
51+ case 'invalid' :
52+ case 'filling' :
53+ elements . addUrlButton . disabled = false
54+ break
55+ case 'valid' :
56+ break
57+ default :
58+ throw new Error ( `Unknown form status: ${ status } ` )
59+ }
4460}
4561
46- const handleProcessState = ( elements , i18n , processState ) => {
47- switch ( processState ) {
48- case 'added' :
62+ const handleLoadingProcessStatus = ( elements , i18n , status ) => {
63+ switch ( status ) {
64+ case 'loading' :
65+ elements . addUrlButton . disabled = true
66+ break
67+ case 'success' :
4968 elements . form . reset ( )
5069 elements . urlInput . focus ( )
5170 elements . urlInput . classList . remove ( 'is-invalid' )
@@ -54,17 +73,11 @@ const handleProcessState = (elements, i18n, processState) => {
5473 elements . formFeedback . textContent = i18n . t ( 'formFeedback.success' )
5574 elements . addUrlButton . disabled = false
5675 break
57- case 'error' :
58- elements . addUrlButton . disabled = false
59- break
60- case 'adding' :
61- elements . addUrlButton . disabled = true
62- break
63- case 'filling' :
76+ case 'failed' :
6477 elements . addUrlButton . disabled = false
6578 break
6679 default :
67- throw new Error ( `Unknown process state : ${ processState } ` )
80+ throw new Error ( `Unknown loading process status : ${ status } ` )
6881 }
6982}
7083
@@ -91,7 +104,6 @@ const renderFeeds = (elements, i18n, state) => {
91104 p . textContent = feedDescription
92105
93106 li . append ( h3 , p )
94-
95107 insertChildren ( elements , 'feeds' , li , i18n )
96108}
97109
@@ -108,10 +120,6 @@ const renderPosts = (elements, i18n, state) => {
108120 a . setAttribute ( 'rel' , 'noopener noreferrer' )
109121 a . textContent = postTitle
110122
111- a . addEventListener ( 'click' , ( e ) => {
112- handleCheckPost ( state , e )
113- } )
114-
115123 const button = document . createElement ( 'button' )
116124 button . classList . add ( 'btn' , 'btn-outline-primary' , 'btn-sm' )
117125 button . setAttribute ( 'type' , 'button' )
@@ -120,48 +128,38 @@ const renderPosts = (elements, i18n, state) => {
120128 button . setAttribute ( 'data-bs-target' , '#modal' )
121129 button . textContent = i18n . t ( 'postPreviewButton' )
122130
123- button . addEventListener ( 'click' , ( e ) => {
124- handleCheckPost ( state , e )
125- state . uiState . modal . openedPostId = postId
126- } )
127-
128131 li . append ( a , button )
129132 return li
130133 } )
131134 insertChildren ( elements , 'posts' , postsElements , i18n )
132135}
133136
134- const handleCheckPost = ( state , event ) => {
135- const { viewedPostsIds } = state . uiState
136- const { id } = event . target . dataset
137- if ( viewedPostsIds . includes ( id ) ) {
138- return
139- }
140- viewedPostsIds . push ( id )
141- }
142-
143137const renderCheckedPost = ( state ) => {
144138 const checkedPostId = state . uiState . viewedPostsIds . at ( - 1 )
145- const checkedPost = document . querySelector ( `[data-posts] a[data-id="${ checkedPostId } "]` )
139+ const checkedPost = document . querySelector ( `[data-posts-container ] a[data-id="${ checkedPostId } "]` )
146140 checkedPost . classList . remove ( 'fw-bold' )
147141 checkedPost . classList . add ( 'fw-normal' , 'link-secondary' )
148142}
149143
150144const renderModalContent = ( elements , state ) => {
151- const openedPost = state . posts . allPosts . find ( ( { postId } ) => postId === state . uiState . modal . openedPostId )
145+ const openedPost = state . posts . allPosts . find ( ( { postId } ) => postId === state . uiState . modalOpenedPostId )
152146 const { postTitle, postDescription, postLink } = openedPost
153147 elements . modalPostTitle . textContent = postTitle
154148 elements . modalPostDescription . textContent = postDescription
155149 elements . modalReadMoreButton . href = postLink
156150}
157151
158- const render = ( elements , i18n , state , onChangePath , onChangeValue ) => {
159- switch ( onChangePath ) {
160- case 'form.processState' :
161- handleProcessState ( elements , i18n , onChangeValue )
152+ const render = ( elements , i18n , state ) => ( path , value ) => {
153+ switch ( path ) {
154+ case 'form.status' :
155+ handleFormStatus ( elements , value )
156+ break
157+ case 'loadingProcess.status' :
158+ handleLoadingProcessStatus ( elements , i18n , value )
162159 break
163160 case 'form.errorKey' :
164- renderErrors ( elements , i18n , onChangeValue )
161+ case 'loadingProcess.errorKey' :
162+ renderErrors ( elements , i18n , value )
165163 break
166164 case 'feeds' :
167165 renderFeeds ( elements , i18n , state )
@@ -172,7 +170,7 @@ const render = (elements, i18n, state, onChangePath, onChangeValue) => {
172170 case 'uiState.viewedPostsIds' :
173171 renderCheckedPost ( state )
174172 break
175- case 'uiState.modal.openedPostId ' :
173+ case 'uiState.modalOpenedPostId ' :
176174 renderModalContent ( elements , state )
177175 break
178176 default :
0 commit comments