@office-iss/react-native-win32 0.72.6 → 0.73.0-preview.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.flowconfig +15 -4
- package/CHANGELOG.json +531 -87
- package/CHANGELOG.md +213 -48
- package/IntegrationTests/PromiseTest.js +1 -0
- package/IntegrationTests/websocket_integration_test_server.js +1 -1
- package/Libraries/Animated/Animated.js +1 -1
- package/Libraries/Animated/AnimatedImplementation.js +1 -1
- package/Libraries/Animated/NativeAnimatedHelper.js +14 -10
- package/Libraries/Animated/NativeAnimatedHelper.win32.js +16 -12
- package/Libraries/Animated/NativeAnimatedModule.js +6 -2
- package/Libraries/Animated/NativeAnimatedTurboModule.js +7 -4
- package/Libraries/Animated/animations/Animation.js +57 -3
- package/Libraries/Animated/animations/DecayAnimation.js +9 -0
- package/Libraries/Animated/animations/SpringAnimation.js +8 -0
- package/Libraries/Animated/animations/TimingAnimation.js +8 -0
- package/Libraries/Animated/components/AnimatedFlatList.js +2 -1
- package/Libraries/Animated/components/AnimatedScrollView.js +2 -0
- package/Libraries/Animated/components/AnimatedSectionList.js +2 -1
- package/Libraries/Animated/createAnimatedComponent.js +1 -0
- package/Libraries/Animated/nodes/AnimatedColor.js +1 -1
- package/Libraries/Animated/nodes/AnimatedObject.js +146 -0
- package/Libraries/Animated/nodes/AnimatedProps.js +19 -7
- package/Libraries/Animated/nodes/AnimatedStyle.js +29 -55
- package/Libraries/Animated/nodes/AnimatedValueXY.js +3 -17
- package/Libraries/Animated/shouldUseTurboAnimatedModule.js +17 -0
- package/Libraries/Animated/useAnimatedProps.js +9 -10
- package/Libraries/AppState/AppState.d.ts +1 -1
- package/Libraries/AppState/NativeAppState.js +8 -4
- package/Libraries/BatchedBridge/MessageQueue.js +45 -36
- package/Libraries/Blob/Blob.js +6 -2
- package/Libraries/Blob/BlobManager.js +9 -10
- package/Libraries/Blob/BlobRegistry.js +14 -9
- package/Libraries/Blob/File.js +1 -1
- package/Libraries/Blob/FileReader.js +1 -2
- package/Libraries/Components/Button/ButtonWin32.Props.d.ts +1 -1
- package/Libraries/Components/Button/ButtonWin32.Props.js.map +1 -1
- package/Libraries/Components/Button/ButtonWin32.d.ts +1 -1
- package/Libraries/Components/Button/ButtonWin32.js +1 -4
- package/Libraries/Components/Button/ButtonWin32.js.map +1 -1
- package/Libraries/Components/Clipboard/Clipboard.d.ts +4 -4
- package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.android.js +3 -1
- package/Libraries/Components/EnterString.win32.d.ts +1 -1
- package/Libraries/Components/Keyboard/KeyboardAvoidingView.js +26 -6
- package/Libraries/Components/Pressable/Pressable.js +3 -2
- package/Libraries/Components/Pressable/Pressable.win32.js +4 -3
- package/Libraries/Components/Pressable/useAndroidRippleForView.js +1 -1
- package/Libraries/Components/SafeAreaView/SafeAreaView.js +7 -7
- package/Libraries/Components/SafeAreaView/SafeAreaView.win32.js +7 -8
- package/Libraries/Components/ScrollView/ScrollView.js +3 -1
- package/Libraries/Components/ScrollView/ScrollView.win32.js +3 -1
- package/Libraries/Components/ScrollView/ScrollViewStickyHeader.js +39 -46
- package/Libraries/Components/Switch/Switch.js +1 -0
- package/Libraries/Components/Text/TextWin32.d.ts +1 -1
- package/Libraries/Components/TextInput/RCTTextInputViewConfig.js +1 -0
- package/Libraries/Components/TextInput/TextInput.d.ts +49 -7
- package/Libraries/Components/TextInput/TextInput.flow.js +43 -10
- package/Libraries/Components/TextInput/TextInput.js +62 -10
- package/Libraries/Components/TextInput/TextInput.win32.js +953 -206
- package/Libraries/Components/TextInput/Win32TextInputNativeComponent.js +23 -0
- package/Libraries/Components/ToastAndroid/{ToastAndroid.ios.js → ToastAndroid.js} +9 -1
- package/Libraries/Components/ToastAndroid/ToastAndroid.win32.js +9 -1
- package/Libraries/Components/Touchable/Tests/TouchableWin32Test.js +2 -2
- package/Libraries/Components/Touchable/Tests/TouchableWin32Test.js.map +1 -1
- package/Libraries/Components/Touchable/TouchableBounce.js +1 -1
- package/Libraries/Components/Touchable/TouchableHighlight.js +1 -1
- package/Libraries/Components/Touchable/TouchableNativeFeedback.js +1 -1
- package/Libraries/Components/Touchable/TouchableOpacity.js +4 -1
- package/Libraries/Components/Touchable/TouchableWin32.d.ts +1 -1
- package/Libraries/Components/Touchable/TouchableWin32.js.map +1 -1
- package/Libraries/Components/Touchable/TouchableWithoutFeedback.js +1 -0
- package/Libraries/Components/TraceUpdateOverlay/TraceUpdateOverlay.js +16 -6
- package/Libraries/Components/View/ReactNativeStyleAttributes.js +9 -0
- package/Libraries/Components/View/ReactNativeViewAttributes.js +1 -0
- package/Libraries/Components/View/ReactNativeViewAttributes.win32.js +1 -0
- package/Libraries/Components/View/View.js +46 -32
- package/Libraries/Components/View/View.win32.js +37 -6
- package/Libraries/Components/View/ViewAccessibility.d.ts +8 -2
- package/Libraries/Components/View/ViewNativeComponent.js +1 -0
- package/Libraries/Components/View/ViewPropTypes.js +18 -3
- package/Libraries/Components/View/ViewPropTypes.win32.js +30 -4
- package/Libraries/Components/View/ViewWin32.js +3 -2
- package/Libraries/Core/Devtools/loadBundleFromServer.js +152 -0
- package/Libraries/Core/Devtools/symbolicateStackTrace.js +2 -1
- package/Libraries/Core/ExceptionsManager.js +16 -7
- package/Libraries/Core/ExtendedError.js +12 -0
- package/Libraries/Core/ReactNativeVersion.js +3 -3
- package/Libraries/Core/ReactNativeVersionCheck.js +0 -2
- package/Libraries/Core/ReactNativeVersionCheck.win32.js +0 -2
- package/Libraries/Core/__mocks__/NativeExceptionsManager.js +20 -0
- package/Libraries/Core/setUpDeveloperTools.js +5 -1
- package/Libraries/Core/setUpIntersectionObserver.js +16 -0
- package/Libraries/{Components/ProgressBarAndroid/ProgressBarAndroid.ios.js → Core/setUpMutationObserver.js} +6 -2
- package/Libraries/Core/setUpPerformance.js +6 -13
- package/Libraries/Core/setUpPerformanceObserver.js +16 -0
- package/Libraries/Core/setUpRegeneratorRuntime.js +4 -2
- package/Libraries/DOM/Nodes/ReactNativeElement.js +135 -18
- package/Libraries/DOM/Nodes/ReadOnlyCharacterData.js +72 -0
- package/Libraries/DOM/Nodes/ReadOnlyElement.js +209 -21
- package/Libraries/DOM/Nodes/ReadOnlyNode.js +206 -17
- package/Libraries/DOM/Nodes/ReadOnlyText.js +30 -0
- package/Libraries/DOM/Nodes/Utilities/Traversal.js +54 -0
- package/Libraries/EventEmitter/NativeEventEmitter.d.ts +0 -6
- package/Libraries/EventEmitter/RCTDeviceEventEmitter.js +15 -4
- package/Libraries/Image/Image.android.js +8 -2
- package/Libraries/Image/Image.d.ts +1 -1
- package/Libraries/Image/Image.ios.js +4 -1
- package/Libraries/Image/Image.win32.js +6 -3
- package/Libraries/Image/ImageBackground.js +3 -0
- package/Libraries/Image/resolveAssetSource.win32.js +1 -1
- package/Libraries/Inspector/DevtoolsOverlay.js +6 -3
- package/Libraries/Inspector/NetworkOverlay.js +2 -2
- package/Libraries/Interaction/JSEventLoopWatchdog.js +1 -5
- package/Libraries/Interaction/PanResponder.js +1 -4
- package/Libraries/IntersectionObserver/IntersectionObserver.js +252 -0
- package/Libraries/IntersectionObserver/IntersectionObserverEntry.js +140 -0
- package/Libraries/IntersectionObserver/IntersectionObserverManager.js +221 -0
- package/Libraries/IntersectionObserver/NativeIntersectionObserver.js +41 -0
- package/Libraries/IntersectionObserver/__mocks__/NativeIntersectionObserver.js +162 -0
- package/Libraries/LayoutAnimation/LayoutAnimation.js +1 -1
- package/Libraries/Lists/FlatList.d.ts +2 -1
- package/Libraries/Lists/FlatList.js +15 -5
- package/Libraries/Lists/SectionList.js +4 -0
- package/Libraries/LogBox/Data/LogBoxLog.js +4 -1
- package/Libraries/LogBox/Data/LogBoxSymbolication.js +5 -2
- package/Libraries/LogBox/Data/parseLogBoxLog.js +57 -20
- package/Libraries/LogBox/UI/AnsiHighlight.js +1 -1
- package/Libraries/LogBox/UI/LogBoxInspectorFooter.js +24 -31
- package/Libraries/LogBox/UI/LogBoxInspectorHeader.js +1 -1
- package/Libraries/LogBox/UI/LogBoxMessage.js +4 -7
- package/Libraries/MutationObserver/MutationObserver.js +184 -0
- package/Libraries/MutationObserver/MutationObserverManager.js +218 -0
- package/Libraries/MutationObserver/MutationRecord.js +82 -0
- package/Libraries/MutationObserver/NativeMutationObserver.js +58 -0
- package/Libraries/MutationObserver/__mocks__/NativeMutationObserver.js +327 -0
- package/Libraries/NativeComponent/BaseViewConfig.android.js +18 -3
- package/Libraries/NativeComponent/BaseViewConfig.ios.js +33 -0
- package/Libraries/NativeComponent/BaseViewConfig.win32.js +33 -0
- package/Libraries/NativeComponent/NativeComponentRegistry.js +3 -5
- package/Libraries/NativeModules/specs/NativeSourceCode.js +6 -6
- package/Libraries/Network/RCTNetworking.android.js +2 -1
- package/Libraries/Network/XMLHttpRequest.js +1 -1
- package/Libraries/NewAppScreen/components/DebugInstructions.js +4 -4
- package/Libraries/NewAppScreen/components/LearnMoreLinks.js +9 -2
- package/Libraries/Performance/QuickPerformanceLogger.js +1 -1
- package/Libraries/PermissionsAndroid/NativePermissionsAndroid.js +1 -0
- package/Libraries/PermissionsAndroid/PermissionsAndroid.d.ts +1 -0
- package/Libraries/PermissionsAndroid/PermissionsAndroid.js +3 -1
- package/Libraries/Pressability/Pressability.js +28 -3
- package/Libraries/Pressability/Pressability.win32.js +30 -5
- package/Libraries/ReactNative/AppContainer.js +2 -3
- package/Libraries/ReactNative/AppRegistry.d.ts +0 -5
- package/Libraries/ReactNative/AppRegistry.js +66 -53
- package/Libraries/ReactNative/BridgelessUIManager.js +38 -9
- package/Libraries/ReactNative/FabricUIManager.js +143 -34
- package/Libraries/ReactNative/I18nManager.js +5 -11
- package/Libraries/ReactNative/NativeI18nManager.js +7 -5
- package/Libraries/ReactNative/PaperUIManager.win32.js +2 -2
- package/Libraries/ReactNative/ReactFabricPublicInstance/ReactFabricHostComponent.js +151 -0
- package/Libraries/ReactNative/ReactFabricPublicInstance/ReactFabricPublicInstance.js +81 -0
- package/Libraries/ReactNative/ReactFabricPublicInstance/ReactNativeAttributePayload.js +492 -0
- package/Libraries/ReactNative/ReactFabricPublicInstance/warnForStyleProps.js +32 -0
- package/Libraries/ReactNative/ReactNativeFeatureFlags.js +19 -3
- package/Libraries/ReactNative/UIManager.js +8 -0
- package/Libraries/ReactNative/__mocks__/FabricUIManager.js +648 -0
- package/Libraries/ReactPrivate/ReactNativePrivateInterface.js +38 -2
- package/Libraries/Renderer/implementations/ReactFabric-dev.js +27 -27
- package/Libraries/Renderer/implementations/ReactFabric-prod.js +3 -3
- package/Libraries/Renderer/implementations/ReactFabric-profiling.js +3 -3
- package/Libraries/Renderer/implementations/ReactNativeRenderer-dev.js +27 -27
- package/Libraries/Renderer/implementations/ReactNativeRenderer-prod.js +3 -3
- package/Libraries/Renderer/implementations/ReactNativeRenderer-profiling.js +3 -3
- package/Libraries/Renderer/shims/ReactFabric.js +5 -6
- package/Libraries/Renderer/shims/ReactFeatureFlags.js +2 -3
- package/Libraries/Renderer/shims/ReactNative.js +2 -3
- package/Libraries/Renderer/shims/ReactNativeTypes.js +35 -17
- package/Libraries/Renderer/shims/ReactNativeViewConfigRegistry.js +3 -3
- package/Libraries/Renderer/shims/createReactNativeComponentClass.js +2 -3
- package/Libraries/Settings/{Settings.android.js → Settings.js} +4 -4
- package/Libraries/Share/Share.d.ts +3 -9
- package/Libraries/StyleSheet/PlatformColorValueTypes.android.js +9 -4
- package/Libraries/StyleSheet/PlatformColorValueTypes.ios.js +28 -13
- package/Libraries/StyleSheet/PlatformColorValueTypes.win32.js +14 -4
- package/Libraries/StyleSheet/PlatformColorValueTypesIOS.ios.js +1 -1
- package/Libraries/StyleSheet/PlatformColorValueTypesWin32.d.ts +1 -1
- package/Libraries/StyleSheet/StyleSheet.d.ts +10 -1
- package/Libraries/StyleSheet/StyleSheet.js +3 -0
- package/Libraries/StyleSheet/StyleSheet.win32.js +3 -0
- package/Libraries/StyleSheet/StyleSheetTypes.d.ts +31 -17
- package/Libraries/StyleSheet/StyleSheetTypes.js +90 -6
- package/Libraries/StyleSheet/flattenStyle.js +4 -0
- package/Libraries/StyleSheet/private/_TransformStyle.js +16 -2
- package/Libraries/StyleSheet/processColor.js +1 -2
- package/Libraries/StyleSheet/processTransformOrigin.js +136 -0
- package/Libraries/StyleSheet/splitLayoutProps.js +1 -0
- package/Libraries/Text/Text.d.ts +5 -5
- package/Libraries/Text/Text.js +17 -10
- package/Libraries/Text/Text.win32.js +354 -0
- package/Libraries/Text/TextProps.win32.js +281 -0
- package/Libraries/TurboModule/TurboModuleRegistry.js +47 -7
- package/Libraries/TurboModule/samples/NativeSampleTurboModule.js +6 -0
- package/Libraries/Types/CoreEventTypes.d.ts +5 -2
- package/Libraries/Utilities/GlobalPerformanceLogger.js +2 -12
- package/Libraries/Utilities/NativeDeviceInfo.js +8 -9
- package/Libraries/Utilities/NativePlatformConstantsAndroid.js +23 -18
- package/Libraries/Utilities/NativePlatformConstantsIOS.js +16 -13
- package/Libraries/Utilities/NativePlatformConstantsWin.js +13 -10
- package/Libraries/Utilities/PerformanceLoggerContext.js +1 -1
- package/Libraries/Utilities/Platform.android.js +12 -8
- package/Libraries/Utilities/Platform.d.ts +1 -0
- package/Libraries/Utilities/Platform.flow.js +84 -0
- package/Libraries/Utilities/Platform.flow.win32.js +111 -0
- package/Libraries/Utilities/Platform.ios.js +12 -8
- package/Libraries/Utilities/Platform.win32.js +12 -8
- package/Libraries/Utilities/PolyfillFunctions.js +1 -1
- package/Libraries/Utilities/ReactNativeTestTools.js +1 -2
- package/Libraries/Utilities/SceneTracker.js +1 -1
- package/Libraries/Utilities/createPerformanceLogger.js +63 -32
- package/Libraries/Utilities/useColorScheme.js +7 -8
- package/Libraries/WebPerformance/MemoryInfo.js +1 -1
- package/Libraries/WebPerformance/NativePerformance.js +3 -8
- package/Libraries/WebPerformance/NativePerformanceObserver.js +4 -0
- package/Libraries/WebPerformance/Performance.js +42 -15
- package/Libraries/WebPerformance/PerformanceEntry.js +14 -6
- package/Libraries/WebPerformance/PerformanceEventTiming.js +18 -1
- package/Libraries/WebPerformance/ReactNativeStartupTiming.js +40 -14
- package/Libraries/WebPerformance/__mocks__/NativePerformance.js +4 -2
- package/Libraries/WebPerformance/__mocks__/NativePerformanceObserver.js +21 -3
- package/Libraries/promiseRejectionTrackingOptions.js +1 -3
- package/Libraries/vendor/emitter/EventEmitter.js +20 -18
- package/flow/global.js +1 -3
- package/flow/jest.js +5 -1
- package/{Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.ios.js → jest/ReactNativeInternalFeatureFlagsMock.js} +2 -1
- package/jest/__tests__/setup-test.js +18 -0
- package/jest/mockModal.js +6 -4
- package/jest/setup.js +61 -30
- package/jest.config.js +1 -1
- package/just-task.js +1 -0
- package/overrides.json +51 -46
- package/package.json +35 -33
- package/src/Libraries/Components/Button/ButtonWin32.Props.ts +1 -1
- package/src/Libraries/Components/Button/ButtonWin32.tsx +0 -2
- package/src/Libraries/Components/Touchable/Tests/TouchableWin32Test.tsx +2 -2
- package/src/Libraries/Components/Touchable/TouchableWin32.tsx +1 -1
- package/src/Libraries/Components/View/ViewAccessibility.d.ts +8 -2
- package/src/Libraries/StyleSheet/PlatformColorValueTypesWin32.d.ts +1 -1
- package/types/experimental.d.ts +44 -0
- package/types/index.d.ts +2 -1
- package/types/modules/Devtools.d.ts +1 -0
- package/types/modules/globals.d.ts +16 -1
- package/IntegrationTests/BUCK +0 -32
- package/IntegrationTests/PropertiesUpdateTest.js +0 -29
- package/IntegrationTests/RCTRootViewIntegrationTestApp.js +0 -86
- package/IntegrationTests/ReactContentSizeUpdateTest.js +0 -89
- package/IntegrationTests/SizeFlexibilityUpdateTest.js +0 -106
- package/Libraries/Components/TextInput/TextInput.Types.win32.d.ts +0 -51
- package/Libraries/Components/TextInput/TextInput.Types.win32.js +0 -3
- package/Libraries/Components/TextInput/TextInput.Types.win32.js.map +0 -1
- package/Libraries/Utilities/AcessibilityMapping.js +0 -154
- package/Libraries/Utilities/AcessibilityMapping.win32.js +0 -156
- package/Libraries/Utilities/NativeDevSplitBundleLoader.js +0 -19
- package/Libraries/Utilities/useColorScheme.win32.js +0 -26
- package/flow/use-sync-external-store.js +0 -20
- package/flow-typed/npm/base64-js_v1.x.x.js +0 -12
- package/flow-typed/npm/glob_v7.x.x.js +0 -79
- package/flow-typed/npm/pretty-format_v26.x.x.js +0 -49
- package/flow-typed/npm/promise_v8.x.x.js +0 -30
- package/flow-typed/npm/react-dom_v17.x.x.js +0 -139
- package/flow-typed/npm/react-test-renderer_v16.x.x.js +0 -79
- package/flow-typed/npm/stacktrace-parser_v0.1.x.js +0 -17
- package/flow-typed/npm/yargs_v17.x.x.js +0 -341
- package/src/Libraries/Components/TextInput/TextInput.Types.win32.ts +0 -68
- /package/Libraries/{Renderer/public → ReactNative/ReactFabricPublicInstance}/ReactFabricPublicInstanceUtils.js +0 -0
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
import type {IEventEmitter} from '../vendor/emitter/EventEmitter';
|
|
12
12
|
|
|
13
|
+
import {beginEvent, endEvent} from '../Performance/Systrace';
|
|
13
14
|
import EventEmitter from '../vendor/emitter/EventEmitter';
|
|
14
15
|
|
|
15
16
|
// FIXME: use typed events
|
|
@@ -21,12 +22,22 @@ type RCTDeviceEventDefinitions = $FlowFixMe;
|
|
|
21
22
|
*
|
|
22
23
|
* NativeModules that emit events should instead subclass `NativeEventEmitter`.
|
|
23
24
|
*/
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
class RCTDeviceEventEmitter extends EventEmitter<RCTDeviceEventDefinitions> {
|
|
26
|
+
// Add systrace to RCTDeviceEventEmitter.emit method for debugging
|
|
27
|
+
emit<TEvent: $Keys<RCTDeviceEventDefinitions>>(
|
|
28
|
+
eventType: TEvent,
|
|
29
|
+
...args: RCTDeviceEventDefinitions[TEvent]
|
|
30
|
+
): void {
|
|
31
|
+
beginEvent(() => `RCTDeviceEventEmitter.emit#${eventType}`);
|
|
32
|
+
super.emit(eventType, ...args);
|
|
33
|
+
endEvent();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const instance = new RCTDeviceEventEmitter();
|
|
26
37
|
|
|
27
38
|
Object.defineProperty(global, '__rctDeviceEventEmitter', {
|
|
28
39
|
configurable: true,
|
|
29
|
-
value:
|
|
40
|
+
value: instance,
|
|
30
41
|
});
|
|
31
42
|
|
|
32
|
-
export default (
|
|
43
|
+
export default (instance: IEventEmitter<RCTDeviceEventDefinitions>);
|
|
@@ -112,7 +112,7 @@ export type ImageComponentStatics = $ReadOnly<{|
|
|
|
112
112
|
getSizeWithHeaders: typeof getSizeWithHeaders,
|
|
113
113
|
prefetch: typeof prefetch,
|
|
114
114
|
prefetchWithMetadata: typeof prefetchWithMetadata,
|
|
115
|
-
abortPrefetch
|
|
115
|
+
abortPrefetch?: typeof abortPrefetch,
|
|
116
116
|
queryCache: typeof queryCache,
|
|
117
117
|
resolveAssetSource: typeof resolveAssetSource,
|
|
118
118
|
|}>;
|
|
@@ -197,11 +197,14 @@ const BaseImage = (props: ImagePropsType, forwardedRef) => {
|
|
|
197
197
|
};
|
|
198
198
|
|
|
199
199
|
const objectFit =
|
|
200
|
+
// $FlowFixMe[prop-missing]
|
|
200
201
|
style && style.objectFit
|
|
201
|
-
?
|
|
202
|
+
? // $FlowFixMe[incompatible-call]
|
|
203
|
+
convertObjectFitToResizeMode(style.objectFit)
|
|
202
204
|
: null;
|
|
203
205
|
// $FlowFixMe[prop-missing]
|
|
204
206
|
const resizeMode =
|
|
207
|
+
// $FlowFixMe[prop-missing]
|
|
205
208
|
objectFit || props.resizeMode || (style && style.resizeMode) || 'cover';
|
|
206
209
|
|
|
207
210
|
return (
|
|
@@ -220,7 +223,9 @@ const BaseImage = (props: ImagePropsType, forwardedRef) => {
|
|
|
220
223
|
if (hasTextAncestor) {
|
|
221
224
|
return (
|
|
222
225
|
<TextInlineImageNativeComponent
|
|
226
|
+
// $FlowFixMe[incompatible-type]
|
|
223
227
|
style={style}
|
|
228
|
+
// $FlowFixMe[incompatible-type]
|
|
224
229
|
resizeMode={resizeMode}
|
|
225
230
|
headers={nativeProps.headers}
|
|
226
231
|
src={sources}
|
|
@@ -232,6 +237,7 @@ const BaseImage = (props: ImagePropsType, forwardedRef) => {
|
|
|
232
237
|
return (
|
|
233
238
|
<ImageViewNativeComponent
|
|
234
239
|
{...nativePropsWithAnalytics}
|
|
240
|
+
// $FlowFixMe[incompatible-type]
|
|
235
241
|
resizeMode={resizeMode}
|
|
236
242
|
/>
|
|
237
243
|
);
|
|
@@ -223,7 +223,7 @@ export interface ImagePropsBase
|
|
|
223
223
|
*
|
|
224
224
|
* The currently supported formats are png, jpg, jpeg, bmp, gif, webp (Android only), psd (iOS only).
|
|
225
225
|
*/
|
|
226
|
-
source
|
|
226
|
+
source?: ImageSourcePropType | undefined;
|
|
227
227
|
|
|
228
228
|
/**
|
|
229
229
|
* A string representing the resource identifier for the image. Similar to
|
|
@@ -91,6 +91,7 @@ export type ImageComponentStatics = $ReadOnly<{|
|
|
|
91
91
|
getSizeWithHeaders: typeof getSizeWithHeaders,
|
|
92
92
|
prefetch: typeof prefetch,
|
|
93
93
|
prefetchWithMetadata: typeof prefetchWithMetadata,
|
|
94
|
+
abortPrefetch?: number => void,
|
|
94
95
|
queryCache: typeof queryCache,
|
|
95
96
|
resolveAssetSource: typeof resolveAssetSource,
|
|
96
97
|
|}>;
|
|
@@ -132,7 +133,8 @@ const BaseImage = (props: ImagePropsType, forwardedRef) => {
|
|
|
132
133
|
const objectFit =
|
|
133
134
|
// $FlowFixMe[prop-missing]
|
|
134
135
|
style && style.objectFit
|
|
135
|
-
?
|
|
136
|
+
? // $FlowFixMe[incompatible-call]
|
|
137
|
+
convertObjectFitToResizeMode(style.objectFit)
|
|
136
138
|
: null;
|
|
137
139
|
const resizeMode =
|
|
138
140
|
// $FlowFixMe[prop-missing]
|
|
@@ -177,6 +179,7 @@ const BaseImage = (props: ImagePropsType, forwardedRef) => {
|
|
|
177
179
|
accessibilityLabel={accessibilityLabel ?? props.alt}
|
|
178
180
|
ref={forwardedRef}
|
|
179
181
|
style={style}
|
|
182
|
+
// $FlowFixMe[incompatible-type]
|
|
180
183
|
resizeMode={resizeMode}
|
|
181
184
|
tintColor={tintColor}
|
|
182
185
|
source={sources}
|
|
@@ -114,6 +114,7 @@ export type ImageComponentStatics = $ReadOnly<{|
|
|
|
114
114
|
getSizeWithHeaders: typeof getSizeWithHeaders,
|
|
115
115
|
prefetch: typeof prefetch,
|
|
116
116
|
prefetchWithMetadata: typeof prefetchWithMetadata,
|
|
117
|
+
abortPrefetch?: number => void,
|
|
117
118
|
queryCache: typeof queryCache,
|
|
118
119
|
resolveAssetSource: typeof resolveAssetSource,
|
|
119
120
|
|}>;
|
|
@@ -155,7 +156,8 @@ const BaseImage = (props: ImagePropsType, forwardedRef) => {
|
|
|
155
156
|
const objectFit =
|
|
156
157
|
// $FlowFixMe[prop-missing]
|
|
157
158
|
style && style.objectFit
|
|
158
|
-
?
|
|
159
|
+
? // $FlowFixMe[incompatible-call]
|
|
160
|
+
convertObjectFitToResizeMode(style.objectFit)
|
|
159
161
|
: null;
|
|
160
162
|
const resizeMode =
|
|
161
163
|
// $FlowFixMe[prop-missing]
|
|
@@ -209,12 +211,13 @@ const BaseImage = (props: ImagePropsType, forwardedRef) => {
|
|
|
209
211
|
{analyticTag => {
|
|
210
212
|
return (
|
|
211
213
|
<ImageViewNativeComponent
|
|
212
|
-
{...restProps}
|
|
213
214
|
accessibilityState={_accessibilityState}
|
|
215
|
+
{...restProps}
|
|
214
216
|
accessible={props.alt !== undefined ? true : props.accessible}
|
|
215
|
-
accessibilityLabel={accessibilityLabel}
|
|
217
|
+
accessibilityLabel={accessibilityLabel ?? props.alt}
|
|
216
218
|
ref={forwardedRef}
|
|
217
219
|
style={style}
|
|
220
|
+
// $FlowFixMe[incompatible-type]
|
|
218
221
|
resizeMode={resizeMode}
|
|
219
222
|
tintColor={tintColor}
|
|
220
223
|
source={sources}
|
|
@@ -84,6 +84,7 @@ class ImageBackground extends React.Component<ImageBackgroundProps> {
|
|
|
84
84
|
importantForAccessibility={importantForAccessibility}
|
|
85
85
|
style={style}
|
|
86
86
|
ref={this._captureRef}>
|
|
87
|
+
{/* $FlowFixMe[incompatible-use] */}
|
|
87
88
|
<Image
|
|
88
89
|
{...props}
|
|
89
90
|
importantForAccessibility={importantForAccessibility}
|
|
@@ -97,7 +98,9 @@ class ImageBackground extends React.Component<ImageBackgroundProps> {
|
|
|
97
98
|
// So, we have to proxy/reapply these styles explicitly for actual <Image> component.
|
|
98
99
|
// This workaround should be removed after implementing proper support of
|
|
99
100
|
// intrinsic content size of the <Image>.
|
|
101
|
+
// $FlowFixMe[prop-missing]
|
|
100
102
|
width: flattenedStyle?.width,
|
|
103
|
+
// $FlowFixMe[prop-missing]
|
|
101
104
|
height: flattenedStyle?.height,
|
|
102
105
|
},
|
|
103
106
|
imageStyle,
|
|
@@ -115,7 +115,7 @@ class AssetResolverLateScaleResolution {
|
|
|
115
115
|
height: this._resolver.asset.height,
|
|
116
116
|
uri: source,
|
|
117
117
|
// Include scales info in returned object
|
|
118
|
-
// This may make it easier to do scale lookups on native side if we
|
|
118
|
+
// This may make it easier to do scale lookups on native side if we don't have that information from any kind of manifest
|
|
119
119
|
scales: this._resolver.asset.scales,
|
|
120
120
|
};
|
|
121
121
|
}
|
|
@@ -52,11 +52,14 @@ export default function DevtoolsOverlay({
|
|
|
52
52
|
function onAgentShowNativeHighlight(node: any) {
|
|
53
53
|
clearTimeout(hideTimeoutId);
|
|
54
54
|
|
|
55
|
-
// `publicInstance` => Fabric
|
|
56
|
-
// TODO: remove this check when syncing the new version of the renderer from React to React Native.
|
|
55
|
+
// `canonical.publicInstance` => Fabric
|
|
57
56
|
// `canonical` => Legacy Fabric
|
|
58
57
|
// `node` => Legacy renderer
|
|
59
|
-
const component =
|
|
58
|
+
const component =
|
|
59
|
+
(node.canonical && node.canonical.publicInstance) ??
|
|
60
|
+
// TODO: remove this check when syncing the new version of the renderer from React to React Native.
|
|
61
|
+
node.canonical ??
|
|
62
|
+
node;
|
|
60
63
|
if (!component || !component.measure) {
|
|
61
64
|
return;
|
|
62
65
|
}
|
|
@@ -64,7 +64,7 @@ function getStringByValue(value: any): string {
|
|
|
64
64
|
}
|
|
65
65
|
if (typeof value === 'string' && value.length > 500) {
|
|
66
66
|
return String(value)
|
|
67
|
-
.
|
|
67
|
+
.slice(0, 500)
|
|
68
68
|
.concat('\n***TRUNCATED TO 500 CHARACTERS***');
|
|
69
69
|
}
|
|
70
70
|
return value;
|
|
@@ -88,7 +88,7 @@ function keyExtractor(request: NetworkRequestInfo): string {
|
|
|
88
88
|
* Show all the intercepted network requests over the InspectorPanel.
|
|
89
89
|
*/
|
|
90
90
|
class NetworkOverlay extends React.Component<Props, State> {
|
|
91
|
-
_requestsListView: ?React.ElementRef<
|
|
91
|
+
_requestsListView: ?React.ElementRef<Class<FlatList<NetworkRequestInfo>>>;
|
|
92
92
|
_detailScrollView: ?React.ElementRef<typeof ScrollView>;
|
|
93
93
|
|
|
94
94
|
// Metrics are used to decide when if the request list should be sticky, and
|
|
@@ -14,11 +14,7 @@ const infoLog = require('../Utilities/infoLog');
|
|
|
14
14
|
|
|
15
15
|
type Handler = {
|
|
16
16
|
onIterate?: () => void,
|
|
17
|
-
onStall: (params: {
|
|
18
|
-
lastInterval: number,
|
|
19
|
-
busyTime: number,
|
|
20
|
-
...
|
|
21
|
-
}) => ?string,
|
|
17
|
+
onStall: (params: {lastInterval: number, busyTime: number, ...}) => ?string,
|
|
22
18
|
...
|
|
23
19
|
};
|
|
24
20
|
|
|
@@ -574,9 +574,6 @@ function clearInteractionHandle(
|
|
|
574
574
|
}
|
|
575
575
|
}
|
|
576
576
|
|
|
577
|
-
export type PanResponderInstance =
|
|
578
|
-
$PropertyType<typeof PanResponder, 'create'>,
|
|
579
|
-
PanResponderConfig,
|
|
580
|
-
>;
|
|
577
|
+
export type PanResponderInstance = ReturnType<(typeof PanResponder)['create']>;
|
|
581
578
|
|
|
582
579
|
export default PanResponder;
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @flow strict-local
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
// flowlint unsafe-getters-setters:off
|
|
12
|
+
|
|
13
|
+
import type IntersectionObserverEntry from './IntersectionObserverEntry';
|
|
14
|
+
import type {IntersectionObserverId} from './IntersectionObserverManager';
|
|
15
|
+
|
|
16
|
+
import ReactNativeElement from '../DOM/Nodes/ReactNativeElement';
|
|
17
|
+
import * as IntersectionObserverManager from './IntersectionObserverManager';
|
|
18
|
+
|
|
19
|
+
export type IntersectionObserverCallback = (
|
|
20
|
+
entries: Array<IntersectionObserverEntry>,
|
|
21
|
+
observer: IntersectionObserver,
|
|
22
|
+
) => mixed;
|
|
23
|
+
|
|
24
|
+
type IntersectionObserverInit = {
|
|
25
|
+
// root?: ReactNativeElement, // This option exists on the Web but it's not currently supported in React Native.
|
|
26
|
+
// rootMargin?: string, // This option exists on the Web but it's not currently supported in React Native.
|
|
27
|
+
threshold?: number | $ReadOnlyArray<number>,
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The [Intersection Observer API](https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API)
|
|
32
|
+
* provides a way to asynchronously observe changes in the intersection of a
|
|
33
|
+
* target element with an ancestor element or with a top-level document's
|
|
34
|
+
* viewport.
|
|
35
|
+
*
|
|
36
|
+
* The ancestor element or viewport is referred to as the root.
|
|
37
|
+
*
|
|
38
|
+
* When an `IntersectionObserver` is created, it's configured to watch for given
|
|
39
|
+
* ratios of visibility within the root.
|
|
40
|
+
*
|
|
41
|
+
* The configuration cannot be changed once the `IntersectionObserver` is
|
|
42
|
+
* created, so a given observer object is only useful for watching for specific
|
|
43
|
+
* changes in degree of visibility; however, you can watch multiple target
|
|
44
|
+
* elements with the same observer.
|
|
45
|
+
*
|
|
46
|
+
* This implementation only supports the `threshold` option at the moment
|
|
47
|
+
* (`root` and `rootMargin` are not supported).
|
|
48
|
+
*/
|
|
49
|
+
export default class IntersectionObserver {
|
|
50
|
+
_callback: IntersectionObserverCallback;
|
|
51
|
+
_thresholds: $ReadOnlyArray<number>;
|
|
52
|
+
_observationTargets: Set<ReactNativeElement> = new Set();
|
|
53
|
+
_intersectionObserverId: ?IntersectionObserverId;
|
|
54
|
+
|
|
55
|
+
constructor(
|
|
56
|
+
callback: IntersectionObserverCallback,
|
|
57
|
+
options?: IntersectionObserverInit,
|
|
58
|
+
): void {
|
|
59
|
+
if (callback == null) {
|
|
60
|
+
throw new TypeError(
|
|
61
|
+
"Failed to construct 'IntersectionObserver': 1 argument required, but only 0 present.",
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (typeof callback !== 'function') {
|
|
66
|
+
throw new TypeError(
|
|
67
|
+
"Failed to construct 'IntersectionObserver': parameter 1 is not of type 'Function'.",
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// $FlowExpectedError[prop-missing] it's not typed in React Native but exists on Web.
|
|
72
|
+
if (options?.root != null) {
|
|
73
|
+
throw new TypeError(
|
|
74
|
+
"Failed to construct 'IntersectionObserver': root is not supported",
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// $FlowExpectedError[prop-missing] it's not typed in React Native but exists on Web.
|
|
79
|
+
if (options?.rootMargin != null) {
|
|
80
|
+
throw new TypeError(
|
|
81
|
+
"Failed to construct 'IntersectionObserver': rootMargin is not supported",
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
this._callback = callback;
|
|
86
|
+
this._thresholds = normalizeThresholds(options?.threshold);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* The `ReactNativeElement` whose bounds are used as the bounding box when
|
|
91
|
+
* testing for intersection.
|
|
92
|
+
* If no `root` value was passed to the constructor or its value is `null`,
|
|
93
|
+
* the root view is used.
|
|
94
|
+
*
|
|
95
|
+
* NOTE: This cannot currently be configured and `root` is always `null`.
|
|
96
|
+
*/
|
|
97
|
+
get root(): ReactNativeElement | null {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* String with syntax similar to that of the CSS `margin` property.
|
|
103
|
+
* Each side of the rectangle represented by `rootMargin` is added to the
|
|
104
|
+
* corresponding side in the root element's bounding box before the
|
|
105
|
+
* intersection test is performed.
|
|
106
|
+
*
|
|
107
|
+
* NOTE: This cannot currently be configured and `rootMargin` is always
|
|
108
|
+
* `null`.
|
|
109
|
+
*/
|
|
110
|
+
get rootMargin(): string {
|
|
111
|
+
return '0px 0px 0px 0px';
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* A list of thresholds, sorted in increasing numeric order, where each
|
|
116
|
+
* threshold is a ratio of intersection area to bounding box area of an
|
|
117
|
+
* observed target.
|
|
118
|
+
* Notifications for a target are generated when any of the thresholds are
|
|
119
|
+
* crossed for that target.
|
|
120
|
+
* If no value was passed to the constructor, `0` is used.
|
|
121
|
+
*/
|
|
122
|
+
get thresholds(): $ReadOnlyArray<number> {
|
|
123
|
+
return this._thresholds;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Adds an element to the set of target elements being watched by the
|
|
128
|
+
* `IntersectionObserver`.
|
|
129
|
+
* One observer has one set of thresholds and one root, but can watch multiple
|
|
130
|
+
* target elements for visibility changes.
|
|
131
|
+
* To stop observing the element, call `IntersectionObserver.unobserve()`.
|
|
132
|
+
*/
|
|
133
|
+
observe(target: ReactNativeElement): void {
|
|
134
|
+
if (!(target instanceof ReactNativeElement)) {
|
|
135
|
+
throw new TypeError(
|
|
136
|
+
"Failed to execute 'observe' on 'IntersectionObserver': parameter 1 is not of type 'ReactNativeElement'.",
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (this._observationTargets.has(target)) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
IntersectionObserverManager.observe({
|
|
145
|
+
intersectionObserverId: this._getOrCreateIntersectionObserverId(),
|
|
146
|
+
target,
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
this._observationTargets.add(target);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Instructs the `IntersectionObserver` to stop observing the specified target
|
|
154
|
+
* element.
|
|
155
|
+
*/
|
|
156
|
+
unobserve(target: ReactNativeElement): void {
|
|
157
|
+
if (!(target instanceof ReactNativeElement)) {
|
|
158
|
+
throw new TypeError(
|
|
159
|
+
"Failed to execute 'unobserve' on 'IntersectionObserver': parameter 1 is not of type 'ReactNativeElement'.",
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (!this._observationTargets.has(target)) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const intersectionObserverId = this._intersectionObserverId;
|
|
168
|
+
if (intersectionObserverId == null) {
|
|
169
|
+
// This is unexpected if the target is in `_observationTargets`.
|
|
170
|
+
console.error(
|
|
171
|
+
"Unexpected state in 'IntersectionObserver': could not find observer ID to unobserve target.",
|
|
172
|
+
);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
IntersectionObserverManager.unobserve(intersectionObserverId, target);
|
|
177
|
+
this._observationTargets.delete(target);
|
|
178
|
+
|
|
179
|
+
if (this._observationTargets.size === 0) {
|
|
180
|
+
IntersectionObserverManager.unregisterObserver(intersectionObserverId);
|
|
181
|
+
this._intersectionObserverId = null;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Stops watching all of its target elements for visibility changes.
|
|
187
|
+
*/
|
|
188
|
+
disconnect(): void {
|
|
189
|
+
for (const target of this._observationTargets.keys()) {
|
|
190
|
+
this.unobserve(target);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
_getOrCreateIntersectionObserverId(): IntersectionObserverId {
|
|
195
|
+
let intersectionObserverId = this._intersectionObserverId;
|
|
196
|
+
if (intersectionObserverId == null) {
|
|
197
|
+
intersectionObserverId = IntersectionObserverManager.registerObserver(
|
|
198
|
+
this,
|
|
199
|
+
this._callback,
|
|
200
|
+
);
|
|
201
|
+
this._intersectionObserverId = intersectionObserverId;
|
|
202
|
+
}
|
|
203
|
+
return intersectionObserverId;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Only for tests
|
|
207
|
+
__getObserverID(): ?IntersectionObserverId {
|
|
208
|
+
return this._intersectionObserverId;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Converts the user defined `threshold` value into an array of sorted valid
|
|
214
|
+
* threshold options for `IntersectionObserver` (double ∈ [0, 1]).
|
|
215
|
+
*
|
|
216
|
+
* @example
|
|
217
|
+
* normalizeThresholds(0.5); // → [0.5]
|
|
218
|
+
* normalizeThresholds([1, 0.5, 0]); // → [0, 0.5, 1]
|
|
219
|
+
* normalizeThresholds(['1', '0.5', '0']); // → [0, 0.5, 1]
|
|
220
|
+
*/
|
|
221
|
+
function normalizeThresholds(threshold: mixed): $ReadOnlyArray<number> {
|
|
222
|
+
if (Array.isArray(threshold)) {
|
|
223
|
+
if (threshold.length > 0) {
|
|
224
|
+
return threshold.map(normalizeThresholdValue).sort();
|
|
225
|
+
} else {
|
|
226
|
+
return [0];
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return [normalizeThresholdValue(threshold)];
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function normalizeThresholdValue(threshold: mixed): number {
|
|
234
|
+
if (threshold == null) {
|
|
235
|
+
return 0;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
const thresholdAsNumber = Number(threshold);
|
|
239
|
+
if (!Number.isFinite(thresholdAsNumber)) {
|
|
240
|
+
throw new TypeError(
|
|
241
|
+
"Failed to read the 'threshold' property from 'IntersectionObserverInit': The provided double value is non-finite.",
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
if (thresholdAsNumber < 0 || thresholdAsNumber > 1) {
|
|
246
|
+
throw new RangeError(
|
|
247
|
+
"Failed to construct 'IntersectionObserver': Threshold values must be numbers between 0 and 1",
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
return thresholdAsNumber;
|
|
252
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @flow strict-local
|
|
8
|
+
* @format
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
// flowlint unsafe-getters-setters:off
|
|
12
|
+
|
|
13
|
+
import type ReactNativeElement from '../DOM/Nodes/ReactNativeElement';
|
|
14
|
+
import type {InternalInstanceHandle} from '../Renderer/shims/ReactNativeTypes';
|
|
15
|
+
import type {NativeIntersectionObserverEntry} from './NativeIntersectionObserver';
|
|
16
|
+
|
|
17
|
+
import DOMRectReadOnly from '../DOM/Geometry/DOMRectReadOnly';
|
|
18
|
+
import {getPublicInstanceFromInternalInstanceHandle} from '../DOM/Nodes/ReadOnlyNode';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* The [`IntersectionObserverEntry`](https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserverEntry)
|
|
22
|
+
* interface of the Intersection Observer API describes the intersection between
|
|
23
|
+
* the target element and its root container at a specific moment of transition.
|
|
24
|
+
*
|
|
25
|
+
* An array of `IntersectionObserverEntry` is delivered to
|
|
26
|
+
* `IntersectionObserver` callbacks as the first argument.
|
|
27
|
+
*/
|
|
28
|
+
export default class IntersectionObserverEntry {
|
|
29
|
+
// We lazily compute all the properties from the raw entry provided by the
|
|
30
|
+
// native module, so we avoid unnecessary work.
|
|
31
|
+
_nativeEntry: NativeIntersectionObserverEntry;
|
|
32
|
+
|
|
33
|
+
constructor(nativeEntry: NativeIntersectionObserverEntry) {
|
|
34
|
+
this._nativeEntry = nativeEntry;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Returns the bounds rectangle of the target element as a `DOMRectReadOnly`.
|
|
39
|
+
* The bounds are computed as described in the documentation for
|
|
40
|
+
* [`Element.getBoundingClientRect()`](https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect).
|
|
41
|
+
*/
|
|
42
|
+
get boundingClientRect(): DOMRectReadOnly {
|
|
43
|
+
const targetRect = this._nativeEntry.targetRect;
|
|
44
|
+
return new DOMRectReadOnly(
|
|
45
|
+
targetRect[0],
|
|
46
|
+
targetRect[1],
|
|
47
|
+
targetRect[2],
|
|
48
|
+
targetRect[3],
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Returns the ratio of the `intersectionRect` to the `boundingClientRect`.
|
|
54
|
+
*/
|
|
55
|
+
get intersectionRatio(): number {
|
|
56
|
+
const intersectionRect = this.intersectionRect;
|
|
57
|
+
const boundingClientRect = this.boundingClientRect;
|
|
58
|
+
|
|
59
|
+
if (boundingClientRect.width === 0 || boundingClientRect.height === 0) {
|
|
60
|
+
return 0;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
(intersectionRect.width * intersectionRect.height) /
|
|
65
|
+
(boundingClientRect.width * boundingClientRect.height)
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Returns a `DOMRectReadOnly` representing the target's visible area.
|
|
71
|
+
*/
|
|
72
|
+
get intersectionRect(): DOMRectReadOnly {
|
|
73
|
+
const intersectionRect = this._nativeEntry.intersectionRect;
|
|
74
|
+
|
|
75
|
+
if (intersectionRect == null) {
|
|
76
|
+
return new DOMRectReadOnly();
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return new DOMRectReadOnly(
|
|
80
|
+
intersectionRect[0],
|
|
81
|
+
intersectionRect[1],
|
|
82
|
+
intersectionRect[2],
|
|
83
|
+
intersectionRect[3],
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* A `Boolean` value which is `true` if the target element intersects with the
|
|
89
|
+
* intersection observer's root.
|
|
90
|
+
* * If this is `true`, then, the `IntersectionObserverEntry` describes a
|
|
91
|
+
* transition into a state of intersection.
|
|
92
|
+
* * If it's `false`, then you know the transition is from intersecting to
|
|
93
|
+
* not-intersecting.
|
|
94
|
+
*/
|
|
95
|
+
get isIntersecting(): boolean {
|
|
96
|
+
return this._nativeEntry.isIntersectingAboveThresholds;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Returns a `DOMRectReadOnly` for the intersection observer's root.
|
|
101
|
+
*/
|
|
102
|
+
get rootBounds(): DOMRectReadOnly {
|
|
103
|
+
const rootRect = this._nativeEntry.rootRect;
|
|
104
|
+
return new DOMRectReadOnly(
|
|
105
|
+
rootRect[0],
|
|
106
|
+
rootRect[1],
|
|
107
|
+
rootRect[2],
|
|
108
|
+
rootRect[3],
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* The `ReactNativeElement` whose intersection with the root changed.
|
|
114
|
+
*/
|
|
115
|
+
get target(): ReactNativeElement {
|
|
116
|
+
const targetInstanceHandle: InternalInstanceHandle =
|
|
117
|
+
// $FlowExpectedError[incompatible-type] native modules don't support using InternalInstanceHandle as a type
|
|
118
|
+
this._nativeEntry.targetInstanceHandle;
|
|
119
|
+
|
|
120
|
+
const targetElement =
|
|
121
|
+
getPublicInstanceFromInternalInstanceHandle(targetInstanceHandle);
|
|
122
|
+
|
|
123
|
+
// $FlowExpectedError[incompatible-cast] we know targetElement is a ReactNativeElement, not just a ReadOnlyNode
|
|
124
|
+
return (targetElement: ReactNativeElement);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* A `DOMHighResTimeStamp` indicating the time at which the intersection was
|
|
129
|
+
* recorded, relative to the `IntersectionObserver`'s time origin.
|
|
130
|
+
*/
|
|
131
|
+
get time(): DOMHighResTimeStamp {
|
|
132
|
+
return this._nativeEntry.time;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export function createIntersectionObserverEntry(
|
|
137
|
+
entry: NativeIntersectionObserverEntry,
|
|
138
|
+
): IntersectionObserverEntry {
|
|
139
|
+
return new IntersectionObserverEntry(entry);
|
|
140
|
+
}
|