diff options
Diffstat (limited to 'packages/gitbook-core/src')
-rw-r--r-- | packages/gitbook-core/src/components/ContextProvider.js | 32 | ||||
-rw-r--r-- | packages/gitbook-core/src/lib/connect.js | 42 | ||||
-rw-r--r-- | packages/gitbook-core/src/lib/renderWithContext.js | 6 |
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> ); } |