All checks were successful
Publish To Prod / deploy_and_publish (push) Successful in 35s
50 lines
1.4 KiB
JavaScript
50 lines
1.4 KiB
JavaScript
import React, { useMemo } from 'react'
|
|
import PropTypes from 'prop-types'
|
|
import { ReactReduxContext } from './Context'
|
|
import { createSubscription } from '../utils/Subscription'
|
|
import { useIsomorphicLayoutEffect } from '../utils/useIsomorphicLayoutEffect'
|
|
|
|
function Provider({ store, context, children }) {
|
|
const contextValue = useMemo(() => {
|
|
const subscription = createSubscription(store)
|
|
return {
|
|
store,
|
|
subscription,
|
|
}
|
|
}, [store])
|
|
|
|
const previousState = useMemo(() => store.getState(), [store])
|
|
|
|
useIsomorphicLayoutEffect(() => {
|
|
const { subscription } = contextValue
|
|
subscription.onStateChange = subscription.notifyNestedSubs
|
|
subscription.trySubscribe()
|
|
|
|
if (previousState !== store.getState()) {
|
|
subscription.notifyNestedSubs()
|
|
}
|
|
return () => {
|
|
subscription.tryUnsubscribe()
|
|
subscription.onStateChange = null
|
|
}
|
|
}, [contextValue, previousState])
|
|
|
|
const Context = context || ReactReduxContext
|
|
|
|
return <Context.Provider value={contextValue}>{children}</Context.Provider>
|
|
}
|
|
|
|
if (process.env.NODE_ENV !== 'production') {
|
|
Provider.propTypes = {
|
|
store: PropTypes.shape({
|
|
subscribe: PropTypes.func.isRequired,
|
|
dispatch: PropTypes.func.isRequired,
|
|
getState: PropTypes.func.isRequired,
|
|
}),
|
|
context: PropTypes.object,
|
|
children: PropTypes.any,
|
|
}
|
|
}
|
|
|
|
export default Provider
|