mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
92b7b172cc
* Convert EventPlugin{Hub,Registry} to named exports
* Convert EventPluginUtils to named exports
* Convert EventPropagators to named exports
* Convert ReactControlledComponent to named exports
* Convert ReactGenericBatching to named exports
* Convert ReactDOMComponentTree to named exports
* Convert ReactNativeComponentTree to named exports
* Convert ReactNativeRTComponentTree to named exports
* Convert FallbackCompositionState to named exports
* Convert ReactEventEmitterMixin to named exports
* Convert ReactBrowserEventEmitter to named exports
* Convert ReactNativeEventEmitter to named exports
* Convert ReactDOMEventListener to named exports
* Convert DOMMarkupOperations to named exports
* Convert DOMProperty to named exports
* Add suppression for existing Flow violation
Flow didn't see it before.
* Update sizes
82 lines
2.1 KiB
JavaScript
82 lines
2.1 KiB
JavaScript
/**
|
|
* Copyright (c) 2013-present, Facebook, Inc.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
import invariant from 'fbjs/lib/invariant';
|
|
|
|
import {
|
|
getInstanceFromNode,
|
|
getFiberCurrentPropsFromNode,
|
|
} from './EventPluginUtils';
|
|
|
|
// Use to restore controlled state after a change event has fired.
|
|
|
|
var fiberHostComponent = null;
|
|
|
|
var ReactControlledComponentInjection = {
|
|
injectFiberControlledHostComponent: function(hostComponentImpl) {
|
|
// The fiber implementation doesn't use dynamic dispatch so we need to
|
|
// inject the implementation.
|
|
fiberHostComponent = hostComponentImpl;
|
|
},
|
|
};
|
|
|
|
var restoreTarget = null;
|
|
var restoreQueue = null;
|
|
|
|
function restoreStateOfTarget(target) {
|
|
// We perform this translation at the end of the event loop so that we
|
|
// always receive the correct fiber here
|
|
var internalInstance = getInstanceFromNode(target);
|
|
if (!internalInstance) {
|
|
// Unmounted
|
|
return;
|
|
}
|
|
invariant(
|
|
fiberHostComponent &&
|
|
typeof fiberHostComponent.restoreControlledState === 'function',
|
|
'Fiber needs to be injected to handle a fiber target for controlled ' +
|
|
'events. This error is likely caused by a bug in React. Please file an issue.',
|
|
);
|
|
const props = getFiberCurrentPropsFromNode(internalInstance.stateNode);
|
|
fiberHostComponent.restoreControlledState(
|
|
internalInstance.stateNode,
|
|
internalInstance.type,
|
|
props,
|
|
);
|
|
}
|
|
|
|
export const injection = ReactControlledComponentInjection;
|
|
|
|
export function enqueueStateRestore(target) {
|
|
if (restoreTarget) {
|
|
if (restoreQueue) {
|
|
restoreQueue.push(target);
|
|
} else {
|
|
restoreQueue = [target];
|
|
}
|
|
} else {
|
|
restoreTarget = target;
|
|
}
|
|
}
|
|
|
|
export function restoreStateIfNeeded() {
|
|
if (!restoreTarget) {
|
|
return;
|
|
}
|
|
var target = restoreTarget;
|
|
var queuedTargets = restoreQueue;
|
|
restoreTarget = null;
|
|
restoreQueue = null;
|
|
|
|
restoreStateOfTarget(target);
|
|
if (queuedTargets) {
|
|
for (var i = 0; i < queuedTargets.length; i++) {
|
|
restoreStateOfTarget(queuedTargets[i]);
|
|
}
|
|
}
|
|
}
|