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.
		
		
		
		
		
			
		
			
				
					166 lines
				
				5.6 KiB
			
		
		
			
		
	
	
					166 lines
				
				5.6 KiB
			| 
											3 years ago
										 | /** | ||
|  |  * @license React | ||
|  |  * use-sync-external-store-shim/with-selector.development.js | ||
|  |  * | ||
|  |  * Copyright (c) Facebook, Inc. and its affiliates. | ||
|  |  * | ||
|  |  * This source code is licensed under the MIT license found in the | ||
|  |  * LICENSE file in the root directory of this source tree. | ||
|  |  */ | ||
|  | 
 | ||
|  | 'use strict'; | ||
|  | 
 | ||
|  | if (process.env.NODE_ENV !== "production") { | ||
|  |   (function() { | ||
|  | 
 | ||
|  |           'use strict'; | ||
|  | 
 | ||
|  | /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ | ||
|  | if ( | ||
|  |   typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && | ||
|  |   typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart === | ||
|  |     'function' | ||
|  | ) { | ||
|  |   __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error()); | ||
|  | } | ||
|  |           var React = require('react'); | ||
|  | var shim = require('use-sync-external-store/shim'); | ||
|  | 
 | ||
|  | /** | ||
|  |  * inlined Object.is polyfill to avoid requiring consumers ship their own | ||
|  |  * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
 | ||
|  |  */ | ||
|  | function is(x, y) { | ||
|  |   return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
 | ||
|  |   ; | ||
|  | } | ||
|  | 
 | ||
|  | var objectIs = typeof Object.is === 'function' ? Object.is : is; | ||
|  | 
 | ||
|  | var useSyncExternalStore = shim.useSyncExternalStore; | ||
|  | 
 | ||
|  | // for CommonJS interop.
 | ||
|  | 
 | ||
|  | var useRef = React.useRef, | ||
|  |     useEffect = React.useEffect, | ||
|  |     useMemo = React.useMemo, | ||
|  |     useDebugValue = React.useDebugValue; // Same as useSyncExternalStore, but supports selector and isEqual arguments.
 | ||
|  | 
 | ||
|  | function useSyncExternalStoreWithSelector(subscribe, getSnapshot, getServerSnapshot, selector, isEqual) { | ||
|  |   // Use this to track the rendered snapshot.
 | ||
|  |   var instRef = useRef(null); | ||
|  |   var inst; | ||
|  | 
 | ||
|  |   if (instRef.current === null) { | ||
|  |     inst = { | ||
|  |       hasValue: false, | ||
|  |       value: null | ||
|  |     }; | ||
|  |     instRef.current = inst; | ||
|  |   } else { | ||
|  |     inst = instRef.current; | ||
|  |   } | ||
|  | 
 | ||
|  |   var _useMemo = useMemo(function () { | ||
|  |     // Track the memoized state using closure variables that are local to this
 | ||
|  |     // memoized instance of a getSnapshot function. Intentionally not using a
 | ||
|  |     // useRef hook, because that state would be shared across all concurrent
 | ||
|  |     // copies of the hook/component.
 | ||
|  |     var hasMemo = false; | ||
|  |     var memoizedSnapshot; | ||
|  |     var memoizedSelection; | ||
|  | 
 | ||
|  |     var memoizedSelector = function (nextSnapshot) { | ||
|  |       if (!hasMemo) { | ||
|  |         // The first time the hook is called, there is no memoized result.
 | ||
|  |         hasMemo = true; | ||
|  |         memoizedSnapshot = nextSnapshot; | ||
|  | 
 | ||
|  |         var _nextSelection = selector(nextSnapshot); | ||
|  | 
 | ||
|  |         if (isEqual !== undefined) { | ||
|  |           // Even if the selector has changed, the currently rendered selection
 | ||
|  |           // may be equal to the new selection. We should attempt to reuse the
 | ||
|  |           // current value if possible, to preserve downstream memoizations.
 | ||
|  |           if (inst.hasValue) { | ||
|  |             var currentSelection = inst.value; | ||
|  | 
 | ||
|  |             if (isEqual(currentSelection, _nextSelection)) { | ||
|  |               memoizedSelection = currentSelection; | ||
|  |               return currentSelection; | ||
|  |             } | ||
|  |           } | ||
|  |         } | ||
|  | 
 | ||
|  |         memoizedSelection = _nextSelection; | ||
|  |         return _nextSelection; | ||
|  |       } // We may be able to reuse the previous invocation's result.
 | ||
|  | 
 | ||
|  | 
 | ||
|  |       // We may be able to reuse the previous invocation's result.
 | ||
|  |       var prevSnapshot = memoizedSnapshot; | ||
|  |       var prevSelection = memoizedSelection; | ||
|  | 
 | ||
|  |       if (objectIs(prevSnapshot, nextSnapshot)) { | ||
|  |         // The snapshot is the same as last time. Reuse the previous selection.
 | ||
|  |         return prevSelection; | ||
|  |       } // The snapshot has changed, so we need to compute a new selection.
 | ||
|  | 
 | ||
|  | 
 | ||
|  |       // The snapshot has changed, so we need to compute a new selection.
 | ||
|  |       var nextSelection = selector(nextSnapshot); // If a custom isEqual function is provided, use that to check if the data
 | ||
|  |       // has changed. If it hasn't, return the previous selection. That signals
 | ||
|  |       // to React that the selections are conceptually equal, and we can bail
 | ||
|  |       // out of rendering.
 | ||
|  | 
 | ||
|  |       // If a custom isEqual function is provided, use that to check if the data
 | ||
|  |       // has changed. If it hasn't, return the previous selection. That signals
 | ||
|  |       // to React that the selections are conceptually equal, and we can bail
 | ||
|  |       // out of rendering.
 | ||
|  |       if (isEqual !== undefined && isEqual(prevSelection, nextSelection)) { | ||
|  |         return prevSelection; | ||
|  |       } | ||
|  | 
 | ||
|  |       memoizedSnapshot = nextSnapshot; | ||
|  |       memoizedSelection = nextSelection; | ||
|  |       return nextSelection; | ||
|  |     }; // Assigning this to a constant so that Flow knows it can't change.
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     // Assigning this to a constant so that Flow knows it can't change.
 | ||
|  |     var maybeGetServerSnapshot = getServerSnapshot === undefined ? null : getServerSnapshot; | ||
|  | 
 | ||
|  |     var getSnapshotWithSelector = function () { | ||
|  |       return memoizedSelector(getSnapshot()); | ||
|  |     }; | ||
|  | 
 | ||
|  |     var getServerSnapshotWithSelector = maybeGetServerSnapshot === null ? undefined : function () { | ||
|  |       return memoizedSelector(maybeGetServerSnapshot()); | ||
|  |     }; | ||
|  |     return [getSnapshotWithSelector, getServerSnapshotWithSelector]; | ||
|  |   }, [getSnapshot, getServerSnapshot, selector, isEqual]), | ||
|  |       getSelection = _useMemo[0], | ||
|  |       getServerSelection = _useMemo[1]; | ||
|  | 
 | ||
|  |   var value = useSyncExternalStore(subscribe, getSelection, getServerSelection); | ||
|  |   useEffect(function () { | ||
|  |     inst.hasValue = true; | ||
|  |     inst.value = value; | ||
|  |   }, [value]); | ||
|  |   useDebugValue(value); | ||
|  |   return value; | ||
|  | } | ||
|  | 
 | ||
|  | exports.useSyncExternalStoreWithSelector = useSyncExternalStoreWithSelector; | ||
|  |           /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */ | ||
|  | if ( | ||
|  |   typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined' && | ||
|  |   typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop === | ||
|  |     'function' | ||
|  | ) { | ||
|  |   __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(new Error()); | ||
|  | } | ||
|  |          | ||
|  |   })(); | ||
|  | } |