summaryrefslogtreecommitdiffstats
path: root/packages/gitbook-core/src/components/UnsafeComponent.js
diff options
context:
space:
mode:
Diffstat (limited to 'packages/gitbook-core/src/components/UnsafeComponent.js')
-rw-r--r--packages/gitbook-core/src/components/UnsafeComponent.js29
1 files changed, 22 insertions, 7 deletions
diff --git a/packages/gitbook-core/src/components/UnsafeComponent.js b/packages/gitbook-core/src/components/UnsafeComponent.js
index e9d2895..81ec239 100644
--- a/packages/gitbook-core/src/components/UnsafeComponent.js
+++ b/packages/gitbook-core/src/components/UnsafeComponent.js
@@ -3,6 +3,8 @@ const React = require('react');
const ReactDOM = require('react-dom');
const ReactRedux = require('react-redux');
+const isServerSide = typeof window === 'undefined';
+
/*
Public: Renders a component provided via the `component` prop, and ensures that
failures in the component's code do not cause state inconsistencies elsewhere in
@@ -22,6 +24,9 @@ const UnsafeComponent = React.createClass({
Component: React.PropTypes.func.isRequired,
props: React.PropTypes.object
},
+ contextTypes: {
+ store: React.PropTypes.object
+ },
componentDidMount() {
return this.renderInjected();
@@ -35,18 +40,22 @@ const UnsafeComponent = React.createClass({
return this.unmountInjected();
},
- renderInjected() {
+ getInjected() {
const { Component, props } = this.props;
const { store } = this.context;
+ return (
+ <ReactRedux.Provider store={store}>
+ <Component {...props}/>
+ </ReactRedux.Provider>
+ );
+ },
+
+ renderInjected() {
const node = ReactDOM.findDOMNode(this);
try {
- this.injected = (
- <ReactRedux.Provider store={store}>
- <Component {...props}/>
- </ReactRedux.Provider>
- );
+ this.injected = this.getInjected();
ReactDOM.render(this.injected, node);
} catch (err) {
@@ -76,7 +85,13 @@ const UnsafeComponent = React.createClass({
},
render() {
- return <div name="unsafe-component-wrapper" />;
+ let inner;
+
+ if (isServerSide) {
+ inner = this.getInjected();
+ }
+
+ return <div name="unsafe-component-wrapper">{inner}</div>;
}
});