Permalink
Cannot retrieve contributors at this time
Fetching contributors…

import { Observable, Scheduler } from 'rx'; | |
import ReactDOM from 'react-dom/server'; | |
import debug from 'debug'; | |
import ProfessorContext from './Professor-Context'; | |
const log = debug('fcc:professor'); | |
export function fetch({ fetchContext = [] }) { | |
if (fetchContext.length === 0) { | |
log('empty fetch context found'); | |
return Observable.just(fetchContext); | |
} | |
return Observable.from(fetchContext, null, null, Scheduler.default) | |
.doOnNext(({ name }) => log(`calling ${name} action creator`)) | |
.map(({ action, actionArgs }) => action.apply(null, actionArgs)) | |
.doOnNext(fetch$ => { | |
if (!Observable.isObservable(fetch$)) { | |
throw new Error( | |
'action creator should return an observable' | |
); | |
} | |
}) | |
.map(fetch$ => fetch$.doOnNext(action => log('action', action.type))) | |
.mergeAll() | |
.doOnCompleted(() => log('all fetch observables completed')); | |
} | |
export default function renderToString(Component) { | |
const fetchContext = []; | |
const professor = { fetchContext }; | |
let ContextedComponent; | |
try { | |
ContextedComponent = ProfessorContext.wrap(Component, professor); | |
log('initiating fetcher registration'); | |
ReactDOM.renderToStaticMarkup(ContextedComponent); | |
log('fetcher registration completed'); | |
} catch (e) { | |
return Observable.throw(e); | |
} | |
return fetch(professor) | |
.last() | |
.delay(0) | |
.map(() => { | |
const markup = ReactDOM.renderToString(Component); | |
return { | |
markup, | |
fetchContext | |
}; | |
}); | |
} |