92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
import unused from './es6-shims'; // eslint-disable-line
 | 
						|
import Rx from 'rx';
 | 
						|
import React from 'react';
 | 
						|
import Fetchr from 'fetchr';
 | 
						|
import debugFactory from 'debug';
 | 
						|
import { Router } from 'react-router';
 | 
						|
import { createLocation, createHistory } from 'history';
 | 
						|
import { hydrate } from 'thundercats';
 | 
						|
import { Render } from 'thundercats-react';
 | 
						|
 | 
						|
import { app$ } from '../common/app';
 | 
						|
 | 
						|
const debug = debugFactory('fcc:client');
 | 
						|
const DOMContianer = document.getElementById('fcc');
 | 
						|
const catState = window.__fcc__.data || {};
 | 
						|
const services = new Fetchr({
 | 
						|
  xhrPath: '/services'
 | 
						|
});
 | 
						|
 | 
						|
Rx.config.longStackSupport = !!debug.enabled;
 | 
						|
const history = createHistory();
 | 
						|
const appLocation = createLocation(
 | 
						|
  location.pathname + location.search
 | 
						|
);
 | 
						|
 | 
						|
function location$(history) {
 | 
						|
  return Rx.Observable.create(function(observer) {
 | 
						|
    const dispose = history.listen(function(location) {
 | 
						|
      observer.onNext(location.pathname);
 | 
						|
    });
 | 
						|
 | 
						|
    return Rx.Disposable.create(() => {
 | 
						|
      dispose();
 | 
						|
    });
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
// returns an observable
 | 
						|
app$({ history, location: appLocation })
 | 
						|
  .flatMap(
 | 
						|
    ({ AppCat }) => {
 | 
						|
      // instantiate the cat with service
 | 
						|
      const appCat = AppCat(null, services);
 | 
						|
      // hydrate the stores
 | 
						|
      return hydrate(appCat, catState)
 | 
						|
        .map(() => appCat);
 | 
						|
    },
 | 
						|
    // not using nextLocation at the moment but will be used for
 | 
						|
    // redirects in the future
 | 
						|
    ({ nextLocation, props }, appCat) => ({ nextLocation, props, appCat })
 | 
						|
  )
 | 
						|
  .doOnNext(({ appCat }) => {
 | 
						|
    const appActions = appCat.getActions('appActions');
 | 
						|
 | 
						|
    location$(history)
 | 
						|
      .pluck('pathname')
 | 
						|
      .distinctUntilChanged()
 | 
						|
      .doOnNext(route => debug('route change', route))
 | 
						|
      .subscribe(route => appActions.updateRoute(route));
 | 
						|
 | 
						|
    appActions.goBack.subscribe(function() {
 | 
						|
      history.goBack();
 | 
						|
    });
 | 
						|
 | 
						|
    appActions
 | 
						|
      .updateRoute
 | 
						|
      .pluck('route')
 | 
						|
      .doOnNext(route => debug('update route', route))
 | 
						|
      .subscribe(function(route) {
 | 
						|
        history.pushState(null, route);
 | 
						|
      });
 | 
						|
  })
 | 
						|
  .flatMap(({ props, appCat }) => {
 | 
						|
    props.history = history;
 | 
						|
    return Render(
 | 
						|
      appCat,
 | 
						|
      React.createElement(Router, props),
 | 
						|
      DOMContianer
 | 
						|
    );
 | 
						|
  })
 | 
						|
  .subscribe(
 | 
						|
    () => {
 | 
						|
      debug('react rendered');
 | 
						|
    },
 | 
						|
    err => {
 | 
						|
      throw err;
 | 
						|
    },
 | 
						|
    () => {
 | 
						|
      debug('react closed subscription');
 | 
						|
    }
 | 
						|
  );
 |