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