summaryrefslogtreecommitdiffstats
path: root/packages/gitbook-core/src
diff options
context:
space:
mode:
Diffstat (limited to 'packages/gitbook-core/src')
-rw-r--r--packages/gitbook-core/src/components/ContextProvider.js32
-rw-r--r--packages/gitbook-core/src/lib/connect.js42
-rw-r--r--packages/gitbook-core/src/lib/renderWithContext.js6
3 files changed, 74 insertions, 6 deletions
diff --git a/packages/gitbook-core/src/components/ContextProvider.js b/packages/gitbook-core/src/components/ContextProvider.js
new file mode 100644
index 0000000..47ed35e
--- /dev/null
+++ b/packages/gitbook-core/src/components/ContextProvider.js
@@ -0,0 +1,32 @@
+const React = require('react');
+const { Provider } = require('react-redux');
+
+/**
+ * React component to provide a GitBook context to children components.
+ */
+
+const ContextProvider = React.createClass({
+ propTypes: {
+ context: React.PropTypes.object.isRequired,
+ children: React.PropTypes.node
+ },
+
+ childContextTypes: {
+ gitbookContext: React.PropTypes.object.isRequired
+ },
+
+ getChildContext() {
+ const { context } = this.props;
+
+ return {
+ gitbookContext: context
+ };
+ },
+
+ render() {
+ const { context, children } = this.props;
+ return <Provider store={context}>{children}</Provider>;
+ }
+});
+
+module.exports = ContextProvider;
diff --git a/packages/gitbook-core/src/lib/connect.js b/packages/gitbook-core/src/lib/connect.js
index e18158e..a2f1f46 100644
--- a/packages/gitbook-core/src/lib/connect.js
+++ b/packages/gitbook-core/src/lib/connect.js
@@ -1,13 +1,49 @@
+const React = require('react');
const ReactRedux = require('react-redux');
/**
- * Connect a component to the GitBook store
+ * Use the GitBook context provided by ContextProvider to map actions to props
+ * @param {ReactComponent} Component
+ * @param {Function} mapActionsToProps
+ * @return {ReactComponent}
+ */
+function connectToActions(Component, mapActionsToProps) {
+ if (!mapActionsToProps) {
+ return Component;
+ }
+
+ return React.createClass({
+ displayName: `ConnectActions(${Component.displayName})`,
+ propTypes: {
+ children: React.PropTypes.node
+ },
+
+ contextTypes: {
+ gitbookContext: React.PropTypes.object.isRequired
+ },
+
+ render() {
+ const { gitbookContext } = this.context;
+ const { children, ...props } = this.props;
+ const { actions, store } = gitbookContext;
+
+ const actionsProps = mapActionsToProps(actions, store.dispatch);
+
+ return <Component {...props} {...actionsProps}>{children}</Component>;
+ }
+ });
+}
+
+/**
+ * Connect a component to the GitBook context (store and actions).
+ *
* @param {ReactComponent} Component
* @param {Function} mapStateToProps
* @return {ReactComponent}
*/
-function connect(Component, mapStateToProps, mapDispatchToProps) {
- return ReactRedux.connect(mapStateToProps, mapDispatchToProps)(Component);
+function connect(Component, mapStateToProps, mapActionsToProps) {
+ const connectToStore = ReactRedux.connect(mapStateToProps);
+ return connectToActions(connectToStore(Component), mapActionsToProps);
}
module.exports = connect;
diff --git a/packages/gitbook-core/src/lib/renderWithContext.js b/packages/gitbook-core/src/lib/renderWithContext.js
index b9e2cfd..20ec25f 100644
--- a/packages/gitbook-core/src/lib/renderWithContext.js
+++ b/packages/gitbook-core/src/lib/renderWithContext.js
@@ -1,9 +1,9 @@
const React = require('react');
-const { Provider } = require('react-redux');
const { InjectedComponent } = require('../components/InjectedComponent');
const PJAXWrapper = require('../components/PJAXWrapper');
const IntlProvider = require('../components/IntlProvider');
+const ContextProvider = require('../components/IntlProvider');
/**
* Render the application for a store
@@ -12,13 +12,13 @@ const IntlProvider = require('../components/IntlProvider');
*/
function renderWithContext(context) {
return (
- <Provider store={context.store}>
+ <ContextProvider context={context}>
<PJAXWrapper>
<IntlProvider>
<InjectedComponent matching={{ role: 'Body' }} />
</IntlProvider>
</PJAXWrapper>
- </Provider>
+ </ContextProvider>
);
}