import _ from 'lodash'; import compareDesc from 'date-fns/compare_desc'; import debug from 'debug'; import { getMediumFeed } from './medium'; import { getLybsynFeed } from './lybsyn'; const log = debug('fcc:rss:news-feed'); const fiveMinutes = 1000 * 60 * 5; class NewsFeed { constructor() { this.state = { readyState: false, mediumFeed: [], lybsynFeed: [], combinedFeed: [] }; this.refreshFeeds(); setInterval(this.refreshFeeds, fiveMinutes); } setState = stateUpdater => { const newState = stateUpdater(this.state); this.state = _.merge({}, this.state, newState); return; } refreshFeeds = () => { const currentFeed = this.state.combinedFeed.slice(0); log('grabbing feeds'); return Promise.all([ getMediumFeed(), getLybsynFeed() ]).then( ([mediumFeed, lybsynFeed]) => this.setState( state => ({ ...state, mediumFeed, lybsynFeed }) )) .then(() => { log('crossing the streams'); const { mediumFeed, lybsynFeed} = this.state; const combinedFeed = [ ...mediumFeed, ...lybsynFeed ].sort((a, b) => { return compareDesc(a.isoDate, b.isoDate); }); this.setState(state => ({ ...state, combinedFeed, readyState: true })); }) .catch(err => { console.log(err); this.setState(state => ({ ...state, combinedFeed: currentFeed })); }); } getFeed = () => new Promise((resolve) => { let notReadyCount = 0; function waitForReady() { log('notReadyCount', notReadyCount); notReadyCount++; return this.state.readyState || notReadyCount === 5 ? resolve(this.state.combinedFeed) : setTimeout(waitForReady, 100); } log('are we ready?', this.state.readyState); return this.state.readyState ? resolve(this.state.combinedFeed) : setTimeout(waitForReady, 100); }) } export default NewsFeed;