mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
b55d319559
part of https://github.com/facebook/react/pull/26571 merging separately to improve tracking of files renames in git Rename HostConfig files to FiberConfig to clarify they are configs for Fiber and not Fizz/Flight. This better conforms to the naming used in Flight and now Fizz of `ReactFlightServerConfig` and `ReactFizzConfig`
147 lines
4.7 KiB
JavaScript
147 lines
4.7 KiB
JavaScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @flow
|
|
*/
|
|
|
|
import type {ReactPortal, ReactNodeList} from 'shared/ReactTypes';
|
|
import type {ElementRef, Element, ElementType} from 'react';
|
|
import type {FiberRoot} from 'react-reconciler/src/ReactInternalTypes';
|
|
|
|
import './ReactFabricInjection';
|
|
|
|
import {
|
|
batchedUpdates as batchedUpdatesImpl,
|
|
discreteUpdates,
|
|
createContainer,
|
|
updateContainer,
|
|
injectIntoDevTools,
|
|
getPublicRootInstance,
|
|
} from 'react-reconciler/src/ReactFiberReconciler';
|
|
|
|
import {createPortal as createPortalImpl} from 'react-reconciler/src/ReactPortal';
|
|
import {setBatchingImplementation} from './legacy-events/ReactGenericBatching';
|
|
import ReactVersion from 'shared/ReactVersion';
|
|
|
|
import {getClosestInstanceFromNode} from './ReactFabricComponentTree';
|
|
import {
|
|
getInspectorDataForViewTag,
|
|
getInspectorDataForViewAtPoint,
|
|
getInspectorDataForInstance,
|
|
} from './ReactNativeFiberInspector';
|
|
import {LegacyRoot, ConcurrentRoot} from 'react-reconciler/src/ReactRootTags';
|
|
import {
|
|
findHostInstance_DEPRECATED,
|
|
findNodeHandle,
|
|
dispatchCommand,
|
|
sendAccessibilityEvent,
|
|
getNodeFromInternalInstanceHandle,
|
|
} from './ReactNativePublicCompat';
|
|
import {getPublicInstanceFromInternalInstanceHandle} from './ReactFiberConfigFabric';
|
|
|
|
// $FlowFixMe[missing-local-annot]
|
|
function onRecoverableError(error) {
|
|
// TODO: Expose onRecoverableError option to userspace
|
|
// eslint-disable-next-line react-internal/no-production-logging, react-internal/warning-args
|
|
console.error(error);
|
|
}
|
|
|
|
function render(
|
|
element: Element<ElementType>,
|
|
containerTag: number,
|
|
callback: ?() => void,
|
|
concurrentRoot: ?boolean,
|
|
): ?ElementRef<ElementType> {
|
|
let root = roots.get(containerTag);
|
|
|
|
if (!root) {
|
|
// TODO (bvaughn): If we decide to keep the wrapper component,
|
|
// We could create a wrapper for containerTag as well to reduce special casing.
|
|
root = createContainer(
|
|
containerTag,
|
|
concurrentRoot ? ConcurrentRoot : LegacyRoot,
|
|
null,
|
|
false,
|
|
null,
|
|
'',
|
|
onRecoverableError,
|
|
null,
|
|
);
|
|
roots.set(containerTag, root);
|
|
}
|
|
updateContainer(element, root, null, callback);
|
|
|
|
return getPublicRootInstance(root);
|
|
}
|
|
|
|
// $FlowFixMe[missing-this-annot]
|
|
function unmountComponentAtNode(containerTag: number) {
|
|
this.stopSurface(containerTag);
|
|
}
|
|
|
|
function stopSurface(containerTag: number) {
|
|
const root = roots.get(containerTag);
|
|
if (root) {
|
|
// TODO: Is it safe to reset this now or should I wait since this unmount could be deferred?
|
|
updateContainer(null, root, null, () => {
|
|
roots.delete(containerTag);
|
|
});
|
|
}
|
|
}
|
|
|
|
function createPortal(
|
|
children: ReactNodeList,
|
|
containerTag: number,
|
|
key: ?string = null,
|
|
): ReactPortal {
|
|
return createPortalImpl(children, containerTag, null, key);
|
|
}
|
|
|
|
setBatchingImplementation(batchedUpdatesImpl, discreteUpdates);
|
|
|
|
const roots = new Map<number, FiberRoot>();
|
|
|
|
export {
|
|
// This is needed for implementation details of TouchableNativeFeedback
|
|
// Remove this once TouchableNativeFeedback doesn't use cloneElement
|
|
findHostInstance_DEPRECATED,
|
|
findNodeHandle,
|
|
dispatchCommand,
|
|
sendAccessibilityEvent,
|
|
render,
|
|
// Deprecated - this function is being renamed to stopSurface, use that instead.
|
|
// TODO (T47576999): Delete this once it's no longer called from native code.
|
|
unmountComponentAtNode,
|
|
stopSurface,
|
|
createPortal,
|
|
// This export is typically undefined in production builds.
|
|
// See the "enableGetInspectorDataForInstanceInProduction" flag.
|
|
getInspectorDataForInstance,
|
|
// The public instance has a reference to the internal instance handle.
|
|
// This method allows it to acess the most recent shadow node for
|
|
// the instance (it's only accessible through it).
|
|
getNodeFromInternalInstanceHandle,
|
|
// Fabric native methods to traverse the host tree return the same internal
|
|
// instance handles we use to dispatch events. This provides a way to access
|
|
// the public instances we created from them (potentially created lazily).
|
|
getPublicInstanceFromInternalInstanceHandle,
|
|
};
|
|
|
|
injectIntoDevTools({
|
|
// $FlowExpectedError[incompatible-call] The type of `Instance` in `getClosestInstanceFromNode` does not match in Fabric and the legacy renderer, so it fails to typecheck here.
|
|
findFiberByHostInstance: getClosestInstanceFromNode,
|
|
bundleType: __DEV__ ? 1 : 0,
|
|
version: ReactVersion,
|
|
rendererPackageName: 'react-native-renderer',
|
|
rendererConfig: {
|
|
getInspectorDataForViewTag: getInspectorDataForViewTag,
|
|
getInspectorDataForViewAtPoint: getInspectorDataForViewAtPoint.bind(
|
|
null,
|
|
findNodeHandle,
|
|
),
|
|
},
|
|
});
|