87 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
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;
 |