Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a LegacyProvider component #1085

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
29 changes: 29 additions & 0 deletions 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 <Provider store={store} {...props} />
}
}

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
3 changes: 2 additions & 1 deletion 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 }
74 changes: 74 additions & 0 deletions test/components/LegacyProvider.spec.js
@@ -0,0 +1,74 @@
import React, { Component } from 'react'
import PropTypes from 'prop-types'
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() {
const store = this.context.store

let text = ''

if (store) {
text = store.getState().toString()
}

return <div data-testid="store">{text}</div>
}
}

LegacyChild.contextTypes = {
store: PropTypes.object.isRequired
}

const store = createStore(createExampleTextReducer())

const spy = jest.spyOn(console, 'error').mockImplementation(() => {})
const tester = rtl.render(
<LegacyProvider store={store}>
<LegacyChild />
</LegacyProvider>
)
expect(spy).toHaveBeenCalledTimes(0)
spy.mockRestore()

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 (
<ReactReduxContext.Consumer>
{({ storeState }) => {
return <div data-testid="store">{storeState}</div>
}}
</ReactReduxContext.Consumer>
)
}
}

const store = createStore(createExampleTextReducer())

const spy = jest.spyOn(console, 'error').mockImplementation(() => {})
const tester = rtl.render(
<LegacyProvider store={store}>
<Child />
</LegacyProvider>
)
expect(spy).toHaveBeenCalledTimes(0)
spy.mockRestore()

expect(tester.getByTestId('store')).toHaveTextContent('example text')
})
})