export default function IsomorphicRouterRenderer(alt, routes) {
  let renderedMarkup;
  if (typeof window === 'undefined') {
    renderedMarkup = (state, url) => {
      // FIXME: Retaining variable markup outside of Handler function is bad.
      //        Should be a return value.
      let markup;
      Router.run(routes, url, (Handler) => {
        alt.bootstrap(state);
        let content = React.renderToString(React.createElement(Handler));
        markup = Iso.render(content, alt.flush());
      });
      return markup;
    };
  } else {
    renderedMarkup = Iso.bootstrap((state, _, container) => {
      alt.bootstrap(state);
      Router.run(routes, Router.HistoryLocation, (Handler) => {
        let node = React.createElement(Handler);
        React.render(node, container);
      });
    });
  }

  return renderedMarkup;
}
function run() {
  // Make taps on links and buttons work fast on mobiles
  FastClick.attach(document.body);

  // Setup the client-side stores with the same data the server had
  Iso.bootstrap((state) => {
    alt.bootstrap(state);
  });

  // Re-render the app when window.location changes
  Location.listen(() => {
    window.scrollTo(0, 0);

    render(
      <ContextHolder context={context}>
        <Router
          history={browserHistory}
          routes={routes}
        />
      </ContextHolder>,
      appContainer
    );
  });

  // Remove the pre-rendered CSS because it's no longer used
  if (cssContainer) {
    cssContainer.parentNode.removeChild(cssContainer);
    cssContainer = null;
  }
}
/*
 * @param {AltObject} an instance of the Alt object
 * @param {ReactObject} routes specified in react-router
 * @param {String} HTML template passed in
 * @return render function which can be executed on server/client side
 */
export default function UniversalRenderer(alt, routes, html) {
  let render;
  // if it is not a browser
  if (typeof window === 'undefined') {
    // if there is a html string passed in
    // render the markup and inject it into the html string
    if (html) {
      render = (state, url) => {
        const markup = renderToMarkup(alt, routes, state, url);
        return html.replace('CONTENT', markup);
      };
    } else {
      render = (state, url) => {
        return renderToMarkup(alt, routes, state, url);
      };
    }
  } else {
    render = Iso.bootstrap((state, _, container) => {
      alt.bootstrap(state);
      Router.run(routes, Router.HistoryLocation, (Handler) => {
        let node = React.createElement(Handler);
        React.render(node, container);
      });
    });
  }

  return render;
}
Example #4
0
 window.onload = () => {
 	/*eslint-disable no-unused-vars*/
   Iso.bootstrap((state, _, container) => {
     alt.bootstrap(state);
     render(<Router history={history}>{routes}</Router>, container);
   });
   /*eslint-enable no-unused-vars*/
 };
function IsomorphicRouterRenderer(alt) {
  if (typeof window === 'undefined') {
    return function (state, url) {
      var markup;
      Router.run(routes, url, function (Handler) {
        alt.bootstrap(state);
        var content = React.renderToString(React.createElement(Handler));
        markup = Iso.render(content, alt.takeSnapshot());
        alt.flush();
      });
      return markup;
    };
  } else {
    Iso.bootstrap(function (state, _, container) {
      alt.bootstrap(state);
      Router.run(routes, Router.HistoryLocation, function (Handler) {
        var node = React.createElement(Handler);
        React.render(node, container);
      });
    });
  }
}
import React from 'react';

import ReactDom from 'react-dom';
import {createHistory} from 'history';
import Iso from 'iso';
/*Routes*/
import Router from 'react-router';
import routes from './routes';
/*Components*/
import altInstance from './components/alt';
/*Styles*/
import './styles/app.css';

/*createHistory component allows to emulate routing with html5 (without #)  */
let history = createHistory();

Iso.bootstrap((state, _, container) => {
    var elem = document.getElementById('app');
    altInstance.bootstrap(state);
    ReactDom.render(<Router history={history} children={routes}/>, elem);
});
Example #7
0
 return new Promise((resolve) => {
   Iso.bootstrap((initialState, __, container) => {
     resolve({initialState, __, container});
   });
 });
Example #8
0
import Router from 'react-router';
import React from 'react';
import routes from 'routes.jsx';
import Iso  from 'iso';
import alt from './alt';

Iso.bootstrap(function(state, _, container){
  alt.bootstrap(state);

  Router.run(routes, Router.HistoryLocation, function (Handler) {
    React.render(<Handler/>, document.getElementById('app'));
  });
});

import React from 'react';
import Router from 'react-router';
import ReactDOM from 'react-dom';
import Iso from 'iso';
import alt from './src/js/alt';
import createBrowserHistory from 'history/lib/createBrowserHistory';
import routes from './src/routes';

let history = createBrowserHistory();

// bootstrap reads the state passed down from server.js
Iso.bootstrap(function (state, container) {
  
  // Seed state into client side alt stores
  alt.bootstrap(state);

  // Render Router/App into div#app
  ReactDOM.render(<Router history={history}>{routes}</Router>, document.getElementById('app'));
})

Example #10
0
File: AltIso.js Project: af7/alt
import Iso from 'iso'
import * as Render from './Render'

export default {
  define: Render.withData,

  render(alt, Component, props) {
    if (typeof window === 'undefined') {
      return Render.toString(alt, Component, props).then((obj) => {
        return {
          html: Iso.render(obj.html, obj.state, { iso: 1 })
        }
      }).catch((err) => {
        // return the empty markup in html when there's an error
        return {
          err,
          html: Iso.render()
        }
      })
    } else {
      Iso.bootstrap((state, meta, node) => {
        alt.bootstrap(state)
        Render.toDOM(Component, props, node, meta.iso)
      })
      return Promise.resolve()
    }
  }
}
Example #11
0
import React from 'react';
import Router from 'react-router';
import ReactDOM from 'react-dom';
import createBrowserHistory from 'history/lib/createBrowserHistory';
import routes from './routes';
import Navbar from './components/Navbar';

let history = createBrowserHistory();

import Iso from 'iso';
import alt from './alt';

// ReactDOM.render(<Router history={history}>{routes}</Router>, document.getElementById('app'));

Iso.bootstrap(function (state, meta) {
    alt.bootstrap(state);
    ReactDOM.render(<Router history={history}>{routes}</Router>, document.getElementById('app'));
});
Example #12
0
import ConsoleExports from './utils/ConsoleExports';
import {serverApiRecordEvent} from 'app/utils/ServerApiClient';

window.onerror = error => {
    serverApiRecordEvent('client_error', error);
};

Iso.bootstrap(initial_state => {
    console.log('Initial state', initial_state);
    window.$STM_Config = initial_state.offchain.config;
    if (initial_state.offchain.serverBusy) {
        window.$STM_ServerBusy = true;
    }
    if (initial_state.offchain.csrf) {
        window.$STM_csrf = initial_state.offchain.csrf;
        delete initial_state.offchain.csrf;
    }
    const location = `${window.location.pathname}${window.location.search}${window.location.hash}`;
    universalRender({history, location, initial_state})
    .catch(error => {
        console.error(error);
        serverApiRecordEvent('client_error', error);
    });
});

try {
    if(process.env.NODE_ENV === 'development') {
        // Adds some object refs to the global window object
        ConsoleExports.init(window)
    }
} catch (e) {
Example #13
0
import RouterActions from './actions/RouterActions';
import Iso from 'iso';
import alt from './alt';

let router = Router.create({
	routes: routes,
	location: Router.HistoryLocation
});

RouterContainer.set(router);

Iso.bootstrap((state, meta, container) => {

	alt.bootstrap(state);

	let token = localStorage.getItem('token');

	if (token) {
		LoginActions.loginUser(token);
	}

	router.run((Handler, state) => {

		RouterActions.changeRoute(state);

		let node = <Handler />;
		React.render(node, container);
	});

});
Example #14
0
import Iso from 'iso'
import * as Render from './Render'

export default {
  define: Render.withData,

  render(alt, Component, props) {
    // recycle state
    alt.recycle()

    if (typeof window === 'undefined') {
      return Render.toString(Component, props).then((markup) => {
        return Iso.render(markup, alt.takeSnapshot())
      })
    } else {
      return Promise.resolve(
        Iso.bootstrap((state, _, node) => {
          alt.bootstrap(state)
          Render.toDOM(Component, props, node)
        })
      )
    }
  }
}
'use strict';

require('es5-shim');
require('es5-shim/es5-sham');

var React = require('react');
var App = require('./components/App.jsx');

var Iso = require('iso');
var Flux = require('./flux');
var flux = new Flux();

// 這是 client app 負責將 server encode 好的資料還還並灌入 store 中
Iso.bootstrap(function (state, meta, container) {

	flux.bootstrap(state);

	// 注意這裏將 flux instance 做為參數傳入 react app 內了
	React.render( React.createElement(App, {flux: flux}), container);
});

// 示範如果不需 isomorphic 時,此手法仍可當作一般 flux 來啟動程式
// flux.bootstrap(state);
// React.render( React.createElement(App, {flux: flux}), document.querySelector('#container') );
Example #16
0
import {render} from 'react-dom';
import routes from '../routes';
import iso from 'iso';

function renderRoute(serverState) {
  routes.dispatch(serverState, (state, component) => {
    render(component, document.getElementById('app'));
  });
}

iso.bootstrap(state => {
  renderRoute(state);
});