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;
 |