rss-reader

Форк
0
/
app.js 
106 строк · 3.6 Кб
1
import uniqueId from 'lodash/uniqueId';
2
import axios from 'axios';
3
import urlValidator from './validator';
4
import parserRss from './parser';
5
import watcher from './view';
6

7
const refreshTiming = 5000;
8

9
const errorMessage = (error) => {
10
  switch (error.name) {
11
    case 'ParsingError':
12
      return 'errors.incorrectRss';
13
    case 'AxiosError':
14
      return 'errors.networkError';
15
    default:
16
      return error.message;
17
  }
18
};
19

20
const addProxy = (url) => {
21
  const proxyUrl = new URL('/get', 'https://allorigins.hexlet.app');
22
  proxyUrl.searchParams.append('disableCache', 'true');
23
  proxyUrl.searchParams.append('url', url);
24
  return proxyUrl.toString();
25
};
26

27
const getData = (url) => axios.get(addProxy(url), { timeout: 5000 })
28
  .catch((error) => { throw error; });
29

30
const getPosts = (feedId, data) => {
31
  const posts = [];
32
  data.items.forEach((item) => posts.unshift({ id: uniqueId(), feedId, ...item }));
33
  return posts;
34
};
35

36
const updateRss = (watchedState) => {
37
  const { feeds, posts } = watchedState.data;
38
  feeds.forEach((feed) => {
39
    const feedPosts = posts.filter((post) => post.feedId === feed.id);
40
    const feedId = feed.id;
41
    getData(feed.link)
42
      .then((rss) => parserRss(rss))
43
      .then((data) => {
44
        const newPosts = getPosts(feedId, data);
45
        const isNewPost = (newPost, oldPosts) => !oldPosts.some((old) => old.link === newPost.link);
46
        const resultPost = newPosts.filter((newPost) => isNewPost(newPost, feedPosts));
47
        watchedState.data.posts.unshift(...resultPost);
48
      })
49
      .catch((error) => { console.error(error); });
50
  });
51
  setTimeout(() => updateRss(watchedState), refreshTiming);
52
};
53

54
const processRssData = (watchedState) => {
55
  watchedState.state = 'processing';
56
  watchedState.formState.isValid = 'waiting';
57
  const url = watchedState.currentUrl;
58
  return getData(url)
59
    .then((rss) => parserRss(rss))
60
    .then((data) => {
61
      const feedId = uniqueId();
62
      watchedState.data.feeds.push({ id: feedId, ...data.feeds, link: url });
63
      const currentPosts = getPosts(feedId, data);
64
      watchedState.data.posts = [...currentPosts, ...watchedState.data.posts];
65
      watchedState.formState.isValid = 'valid';
66
      watchedState.state = 'processed';
67
    });
68
};
69

70
export default (state, i18next) => {
71
  const elements = {
72
    rssForm: document.querySelector('.rss-form'),
73
    input: document.querySelector('input[id="url-input"]'),
74
    button: document.querySelector('button[aria-label="add"]'),
75
    modal: document.querySelector('div[id="modal"]'),
76
    feeds: document.querySelector('.feeds'),
77
    posts: document.querySelector('.posts'),
78
  };
79
  const watchedState = watcher(state, i18next, elements);
80
  const handleSubmit = (event) => {
81
    event.preventDefault();
82
    const formData = new FormData(elements.rssForm);
83
    const inputUrl = formData.get('url');
84
    watchedState.currentUrl = inputUrl;
85
    urlValidator(watchedState.data.feeds, inputUrl)
86
      .then(() => processRssData(watchedState))
87
      .catch((error) => {
88
        watchedState.formState.errors.push(errorMessage(error));
89
        watchedState.formState.isValid = 'invalid';
90
        watchedState.state = 'failed';
91
        console.error(error);
92
      });
93
  };
94
  const handlePostClick = (event) => {
95
    const element = event.target;
96
    const postId = event.target.dataset.id;
97
    if (element.type === 'button') {
98
      const newViewedPost = state.data.posts.find((obj) => obj.id === postId);
99
      watchedState.uiState.vievedPost = newViewedPost;
100
    }
101
    watchedState.uiState.viewedPostsId.add(postId);
102
  };
103
  elements.rssForm.addEventListener('submit', handleSubmit);
104
  elements.posts.addEventListener('click', handlePostClick);
105
  updateRss(watchedState);
106
};
107

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.