You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							85 lines
						
					
					
						
							2.8 KiB
						
					
					
				
			
		
		
	
	
							85 lines
						
					
					
						
							2.8 KiB
						
					
					
				| "use strict";
 | |
| 
 | |
| exports.__esModule = true;
 | |
| exports.createSelectorHook = createSelectorHook;
 | |
| exports.useSelector = exports.initializeUseSelector = void 0;
 | |
| 
 | |
| var _react = require("react");
 | |
| 
 | |
| var _useReduxContext = require("./useReduxContext");
 | |
| 
 | |
| var _Context = require("../components/Context");
 | |
| 
 | |
| var _useSyncExternalStore = require("../utils/useSyncExternalStore");
 | |
| 
 | |
| let useSyncExternalStoreWithSelector = _useSyncExternalStore.notInitialized;
 | |
| 
 | |
| const initializeUseSelector = fn => {
 | |
|   useSyncExternalStoreWithSelector = fn;
 | |
| };
 | |
| 
 | |
| exports.initializeUseSelector = initializeUseSelector;
 | |
| 
 | |
| const refEquality = (a, b) => a === b;
 | |
| /**
 | |
|  * Hook factory, which creates a `useSelector` hook bound to a given context.
 | |
|  *
 | |
|  * @param {React.Context} [context=ReactReduxContext] Context passed to your `<Provider>`.
 | |
|  * @returns {Function} A `useSelector` hook bound to the specified context.
 | |
|  */
 | |
| 
 | |
| 
 | |
| function createSelectorHook(context = _Context.ReactReduxContext) {
 | |
|   const useReduxContext = context === _Context.ReactReduxContext ? _useReduxContext.useReduxContext : () => (0, _react.useContext)(context);
 | |
|   return function useSelector(selector, equalityFn = refEquality) {
 | |
|     if (process.env.NODE_ENV !== 'production') {
 | |
|       if (!selector) {
 | |
|         throw new Error(`You must pass a selector to useSelector`);
 | |
|       }
 | |
| 
 | |
|       if (typeof selector !== 'function') {
 | |
|         throw new Error(`You must pass a function as a selector to useSelector`);
 | |
|       }
 | |
| 
 | |
|       if (typeof equalityFn !== 'function') {
 | |
|         throw new Error(`You must pass a function as an equality function to useSelector`);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     const {
 | |
|       store,
 | |
|       subscription,
 | |
|       getServerState
 | |
|     } = useReduxContext();
 | |
|     const selectedState = useSyncExternalStoreWithSelector(subscription.addNestedSub, store.getState, getServerState || store.getState, selector, equalityFn);
 | |
|     (0, _react.useDebugValue)(selectedState);
 | |
|     return selectedState;
 | |
|   };
 | |
| }
 | |
| /**
 | |
|  * A hook to access the redux store's state. This hook takes a selector function
 | |
|  * as an argument. The selector is called with the store state.
 | |
|  *
 | |
|  * This hook takes an optional equality comparison function as the second parameter
 | |
|  * that allows you to customize the way the selected state is compared to determine
 | |
|  * whether the component needs to be re-rendered.
 | |
|  *
 | |
|  * @param {Function} selector the selector function
 | |
|  * @param {Function=} equalityFn the function that will be used to determine equality
 | |
|  *
 | |
|  * @returns {any} the selected state
 | |
|  *
 | |
|  * @example
 | |
|  *
 | |
|  * import React from 'react'
 | |
|  * import { useSelector } from 'react-redux'
 | |
|  *
 | |
|  * export const CounterComponent = () => {
 | |
|  *   const counter = useSelector(state => state.counter)
 | |
|  *   return <div>{counter}</div>
 | |
|  * }
 | |
|  */
 | |
| 
 | |
| 
 | |
| const useSelector = /*#__PURE__*/createSelectorHook();
 | |
| exports.useSelector = useSelector; |