Skip to content

Commit 4397d72

Browse files
committed
рендер отдельных состояний UI (pending, error, success) в одном месте
1 parent 233b9ae commit 4397d72

File tree

6 files changed

+69
-30
lines changed

6 files changed

+69
-30
lines changed

src/js/model.js

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
import * as yup from "yup";
2-
// import i18next from "../i18n.js";
32
import { fetchRssData } from "./fetchRssData.js";
43
import { parseRss } from "./parseRss.js";
5-
// import { renderRssFeed } from "./renderRssFeed.js";
64

75
import createState from './state.js';
86

@@ -40,17 +38,14 @@ export const updateInputValue = (value) => {
4038

4139
const fetchAndParseFeed = (url) => {
4240
state.ui.pending = true;
43-
//перерендер
4441
return fetchRssData(url)
4542
.then((xmlString) => {
4643
state.ui.pending = false;
4744
state.ui.success = true;
48-
//перерендер
4945
return parseRss(xmlString);
5046
})
5147
.catch((error) => {
5248
state.ui.pending = false;
53-
//тоже перерендер
5449
throw error;
5550
});
5651
};
@@ -97,6 +92,7 @@ export const feedsChecking = () => {
9792

9893
export const checkRssFeed = () => {
9994
const promises = state.feedsList.map((feed) => {
95+
// разделять ли это для UI ? если да, то как отслеживать разницу. Обрабатывать оба случая одинакого и поменять условия рендера?
10096
return fetchAndParseFeed(feed)
10197
.then(({ items }) => {
10298
return items;

src/js/renderRssFeed.js

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,6 @@ export const renderFeeds = (feeds) => {
2323
`;
2424
};
2525

26-
export const renderFeedsPending = () => {
27-
const postsContainer = document.querySelector(".feeds");
28-
postsContainer.innerHTML = `
29-
<div
30-
id="posts-spinner"
31-
class="spinner-border text-primary d-none"
32-
role="status">
33-
<span>Загрузка фидов...</span>
34-
</div>
35-
`;
36-
};
37-
3826
export const renderPosts = (posts) => {
3927
const postsContainer = document.querySelector(".posts");
4028

src/js/state.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import onChange from "on-change";
22
import { renderFeeds, renderPosts, renderViewedPost } from "./renderRssFeed.js";
33
import { closeModal, showModal } from "./renderModal.js";
4-
import { renderErrors, renderInputValue } from "./view.js";
4+
import { renderInputValue, renderUi } from "./view.js";
55
import { feedsChecking, markPostAsRead } from "./model.js";
66

77
const createState = () => {
@@ -43,7 +43,13 @@ const createState = () => {
4343
renderInputValue(value);
4444
}
4545
if (path === "ui.error") {
46-
renderErrors(value);
46+
renderUi('error', value);
47+
}
48+
if (path === "ui.success") {
49+
renderUi("success");
50+
}
51+
if (path === "ui.pending") {
52+
renderUi("pending");
4753
}
4854
});
4955

src/js/view.js

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,61 @@ export const renderUIText = () => {
2020
example.textContent = i18next.t("example");
2121
};
2222

23-
export const renderErrors = (error) => {
24-
if (error) {
25-
input.classList.add("is-invalid");
26-
feedback.textContent = i18next.t(`errors.${error}`);
27-
} else {
28-
input.classList.remove("is-invalid");
29-
feedback.textContent = "";
23+
const renderErrors = (error) => {
24+
input.classList.add("is-invalid");
25+
feedback.classList.add("text-danger");
26+
feedback.textContent = i18next.t(`errors.${error}`);
27+
};
28+
29+
const renderSuccess = () => {
30+
feedback.classList.add("text-success");
31+
feedback.textContent = i18next.t(`ui.success`);
32+
};
33+
34+
const renderFeedsPending = () => {
35+
const postsContainer = document.querySelector(".feeds");
36+
const spinner = document.createElement('div');
37+
spinner.classList.add('spinner-container')
38+
spinner.innerHTML = `
39+
<div
40+
id="posts-spinner"
41+
class="spinner-border text-primary d-none"
42+
role="status">
43+
<span>${i18next.t("ui.pending")}</span>
44+
</div>
45+
`;
46+
postsContainer.append(spinner);
47+
};
48+
49+
const cleanDomElements = () => {
50+
input.classList.remove("is-invalid");
51+
feedback.classList.remove("text-danger");
52+
feedback.classList.remove("text-success");
53+
feedback.textContent = "";
54+
const spinner = document.querySelector(".spinner-container");
55+
if (spinner) spinner.remove();
56+
}
57+
58+
export const renderUi = (uiState, message) => {
59+
switch (uiState) {
60+
case 'error':
61+
cleanDomElements();
62+
renderErrors(message);
63+
break;
64+
case 'success':
65+
cleanDomElements();
66+
renderSuccess();
67+
break;
68+
case 'pending':
69+
cleanDomElements();
70+
renderFeedsPending();
71+
break;
72+
case 'update':
73+
// нужен ли отдельный case?
74+
break;
75+
default:
76+
cleanDomElements();
77+
break;
3078
}
3179
};
3280

src/locales/en.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ export default {
77
full_btn: "Full",
88
close_btn: "Close",
99
example: "Example",
10+
ui: {
11+
success: "RSS успешно загружен",
12+
pending: "Загрузка фидов...",
13+
},
1014
errors: {
1115
exists: "This feed has already been added",
1216
required: "Required field",

src/locales/ru.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@ export default {
77
full_btn: "Читать полностью",
88
close_btn: "Закрыть",
99
example: "Пример",
10-
invalid_url: "Ссылка должна быть валидным URL",
11-
required_field: "Обязательное поле",
12-
no_duplicate: "Эта лента уже добавлена",
13-
loading: {
10+
ui: {
1411
success: "RSS успешно загружен",
1512
},
1613
errors: {

0 commit comments

Comments
 (0)