From 3a45c905f0adfaf512f409cd8d52123a265d1998 Mon Sep 17 00:00:00 2001 From: Tim Dorr Date: Mon, 19 Nov 2018 11:02:36 -0500 Subject: [PATCH 1/2] Add a LegacyProvider component This avoids polluting Provider with StrictMode-incompatible stuff. Hopefully, this makes working with outdated libraries easier. --- src/components/LegacyProvider.js | 29 +++++++++++++++++ src/index.js | 3 +- test/components/LegacyProvider.spec.js | 43 ++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 src/components/LegacyProvider.js create mode 100644 test/components/LegacyProvider.spec.js diff --git a/src/components/LegacyProvider.js b/src/components/LegacyProvider.js new file mode 100644 index 000000000..6a77a0636 --- /dev/null +++ b/src/components/LegacyProvider.js @@ -0,0 +1,29 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' + +import Provider from './Provider' + +class LegacyProvider extends Component { + getChildContext() { + return { store: this.props.store } + } + + render() { + const { store, ...props } = this.props + return + } +} + +LegacyProvider.propTypes = { + store: PropTypes.shape({ + subscribe: PropTypes.func.isRequired, + dispatch: PropTypes.func.isRequired, + getState: PropTypes.func.isRequired + }) +} + +LegacyProvider.childContextTypes = { + store: PropTypes.object.isRequired +} + +export default LegacyProvider diff --git a/src/index.js b/src/index.js index 22b1bd9e5..b75f77dcd 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,7 @@ import Provider from './components/Provider' +import LegacyProvider from './components/LegacyProvider' import connectAdvanced from './components/connectAdvanced' import { ReactReduxContext } from './components/Context' import connect from './connect/connect' -export { Provider, connectAdvanced, ReactReduxContext, connect } +export { Provider, LegacyProvider, connectAdvanced, ReactReduxContext, connect } diff --git a/test/components/LegacyProvider.spec.js b/test/components/LegacyProvider.spec.js new file mode 100644 index 000000000..871d3f29e --- /dev/null +++ b/test/components/LegacyProvider.spec.js @@ -0,0 +1,43 @@ +import React, { Component } from 'react' +import PropTypes from 'prop-types' +import { LegacyProvider } from '../../src/index.js' +import { createStore } from 'redux' +import * as rtl from 'react-testing-library' +import 'jest-dom/extend-expect' + +const createExampleTextReducer = () => (state = 'example text') => state + +describe('LegacyProvider', () => { + it('provides a legacy context', () => { + class LegacyChild extends Component { + render() { + const store = this.context.store + + let text = '' + + if (store) { + text = store.getState().toString() + } + + return
{text}
+ } + } + + LegacyChild.contextTypes = { + store: PropTypes.object.isRequired + } + + const store = createStore(createExampleTextReducer()) + + const spy = jest.spyOn(console, 'error').mockImplementation(() => {}) + const tester = rtl.render( + + + + ) + expect(spy).toHaveBeenCalledTimes(0) + spy.mockRestore() + + expect(tester.getByTestId('store')).toHaveTextContent('example text') + }) +}) From 8a56e418ecd76db6eaa524c137a7d85e3d16026e Mon Sep 17 00:00:00 2001 From: Tim Dorr Date: Mon, 19 Nov 2018 11:07:40 -0500 Subject: [PATCH 2/2] Add a test for the new context API too. --- test/components/LegacyProvider.spec.js | 35 ++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/test/components/LegacyProvider.spec.js b/test/components/LegacyProvider.spec.js index 871d3f29e..bea7dcf4f 100644 --- a/test/components/LegacyProvider.spec.js +++ b/test/components/LegacyProvider.spec.js @@ -1,13 +1,17 @@ import React, { Component } from 'react' import PropTypes from 'prop-types' -import { LegacyProvider } from '../../src/index.js' -import { createStore } from 'redux' import * as rtl from 'react-testing-library' import 'jest-dom/extend-expect' +import { createStore } from 'redux' +import { LegacyProvider } from '../../src/index.js' +import { ReactReduxContext } from '../../src/components/Context' + const createExampleTextReducer = () => (state = 'example text') => state describe('LegacyProvider', () => { + afterEach(() => rtl.cleanup()) + it('provides a legacy context', () => { class LegacyChild extends Component { render() { @@ -40,4 +44,31 @@ describe('LegacyProvider', () => { expect(tester.getByTestId('store')).toHaveTextContent('example text') }) + + it('passes through everything to the new Provider and provides the new Context as well', () => { + class Child extends Component { + render() { + return ( + + {({ storeState }) => { + return
{storeState}
+ }} +
+ ) + } + } + + const store = createStore(createExampleTextReducer()) + + const spy = jest.spyOn(console, 'error').mockImplementation(() => {}) + const tester = rtl.render( + + + + ) + expect(spy).toHaveBeenCalledTimes(0) + spy.mockRestore() + + expect(tester.getByTestId('store')).toHaveTextContent('example text') + }) })