79 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import _ from 'lodash';
 | |
| import compareDesc from 'date-fns/compare_desc';
 | |
| import debug from 'debug';
 | |
| 
 | |
| import { getLybsynFeed } from './lybsyn';
 | |
| 
 | |
| const log = debug('fcc:rss:news-feed');
 | |
| 
 | |
| const fiveMinutes = 1000 * 60 * 5;
 | |
| 
 | |
| class NewsFeed {
 | |
|   constructor() {
 | |
|     this.state = {
 | |
|       readyState: false,
 | |
|       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([getLybsynFeed()])
 | |
|       .then(([lybsynFeed]) =>
 | |
|         this.setState(state => ({
 | |
|           ...state,
 | |
|           lybsynFeed
 | |
|         }))
 | |
|       )
 | |
|       .then(() => {
 | |
|         log('crossing the streams');
 | |
|         const { lybsynFeed } = this.state;
 | |
|         const combinedFeed = [...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;
 |