Esempio n. 1
0
onready(() => {
  var store = configureStore(window.REDUX_INITIAL_STATE || {});

  window.REDUX_INITIAL_STATE = null;

  /**
   *  Watch location changes
   */
  browserHistory.listen(location => {
    var state = store.getState();

    location = location.pathname + location.search;

    location = location.replace(/[?]$/, '');
    if (!location.match(/^\/(en|ru)/)) {
      location = location.replace(/^\/(en|ru)/, '');
      location = '/' + state.lang + location;
    }

    if (state.location == location) {
      return;
    }
    
    store.dispatch(setLocation(location));
  });

  ReactDOM.render(
    <Provider store={store}>
      <Router history={browserHistory}>
        {routes(store)}
      </Router>
    </Provider>,
    document.getElementById('react-root')
  );
});
Esempio n. 2
0
app.use((req, res) => {
  // make store
  var store = configureStore();

  var user_ip      = false;
  var user_session = false;
  var old_browser  = false;

  if (req.headers) {
    if (req.headers['x-real-ip']) {
      user_ip = req.headers['x-real-ip'];
    }

    if (req.headers['user-agent']) {
      old_browser = old_browser || !!req.headers['user-agent'].match(
        /MSIE\s*\d+/i
      );

      old_browser = old_browser || !!req.headers['user-agent'].match(
        /Trident\/\s*\d+/i
      );

      old_browser = old_browser || !!req.headers['user-agent'].match(
        /Opera Mini\/\s*\d+/i
      );

      old_browser = old_browser || !!req.headers['user-agent'].match(
        /UCWEB\/\s*\d+/i
      );
    }
  }

  if (req.headers && req.headers.cookie) {
    var session = req.headers.cookie.match(/__session_id=([^;:\s\n\r\t]+)/);
    if (session) user_session = session[1]
  }

  store.dispatch(setIp(user_ip));
  store.dispatch(setSession(user_session));

  var promise = [];

  if (session) {
    promise.push(
      new Promise(function(resolve, reject) {
        Request.fetch(
          '/api/user/getInfo', {

          success: user => {
            resolve(user);
          },

          error: error => {
            reject(error);
          },

          cache:     false,
          remote_ip: user_ip,
          session:   user_session,
        });
      })
    );
  }

  Promise.all(promise)
  .then(user => {
    if (typeof user != 'undefined' && user.length && user[0].id) {
      store.dispatch(userLogin(user[0]));
    }

    match({routes: routes(store), location: req.url}, (error, redirect, render_props) => {
      if (redirect) {
        store = null;
        return res.redirect(301, redirect.pathname + redirect.search);
      }

      if (error) {
        store = null;
        return res.status(500).end('Internal server error');
      }

      if (!render_props) {
        store = null;
        return res.status(404).end('Not found')
      }

      // parse lang
      var lang = getUserLang(req);

      // dispatch lang into store
      store.dispatch(setLang(lang));

      // Set lang (if components needed)
      Lang.setLang(lang);

      // get current location
      var loc = getLocation(req)

      // dispatch location info store
      store.dispatch(setLocation(loc));

      // make fetch params
      var fetch_params = makeFetchParams(
        req,
        loc,
        render_props.params
      );

      // fetch components data (if needed)
      fetchComponentsData(
        store,
        render_props.components,
        fetch_params
      )
      .then(() => {
        // set lang
        Lang.setLang(lang);

        // make component
        return ReactDOM.renderToString(
          <Provider store={store}>
            <RouterContext {...render_props} />
          </Provider>
        )
      })
      .then(html => {
        // make HTML response
        return renderHTML(html, store.getState(), !old_browser);
      })
      .then(html => {
        // send HTML response
        // console.log('done', store.getState());
        store = null;

        res.set({
          'Content-Type': 'text/html; charset=utf-8',
          'Content-Length': html.length,
          'ETag': ''
        });

        res.status(200).end(html);
      })
      .catch(err => {
        // catch error
        store = null;
        console.log(err);
        res.status(500).end('Internal server error');
      })
    });
  })
  .catch(err => {
    store = null;
    console.log(err);
    res.status(500).end('Internal server error');
  });
});