@office-iss/react-native-win32 0.76.2 → 0.77.0-preview.2

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.
Files changed (249) hide show
  1. package/.eslintignore +1 -1
  2. package/.flowconfig +5 -1
  3. package/CHANGELOG.json +179 -53
  4. package/CHANGELOG.md +82 -28
  5. package/Libraries/ActionSheetIOS/ActionSheetIOS.d.ts +1 -0
  6. package/Libraries/ActionSheetIOS/ActionSheetIOS.js +13 -0
  7. package/Libraries/Animated/AnimatedEvent.js +1 -1
  8. package/Libraries/Animated/AnimatedImplementation.js +2 -2
  9. package/Libraries/Animated/NativeAnimatedAllowlist.js +20 -9
  10. package/Libraries/Animated/animations/Animation.js +60 -25
  11. package/Libraries/Animated/animations/DecayAnimation.js +26 -38
  12. package/Libraries/Animated/animations/SpringAnimation.js +33 -39
  13. package/Libraries/Animated/animations/TimingAnimation.js +34 -42
  14. package/Libraries/Animated/components/AnimatedFlatList.js +1 -1
  15. package/Libraries/Animated/components/AnimatedSectionList.js +3 -1
  16. package/Libraries/Animated/createAnimatedComponent.js +60 -33
  17. package/Libraries/Animated/nodes/AnimatedColor.js +1 -1
  18. package/Libraries/Animated/nodes/AnimatedInterpolation.js +1 -1
  19. package/Libraries/Animated/nodes/AnimatedNode.js +39 -45
  20. package/Libraries/Animated/nodes/AnimatedObject.js +13 -3
  21. package/Libraries/Animated/nodes/AnimatedProps.js +104 -46
  22. package/Libraries/Animated/nodes/AnimatedStyle.js +116 -39
  23. package/Libraries/Animated/nodes/AnimatedTransform.js +56 -23
  24. package/Libraries/Animated/nodes/AnimatedValue.js +1 -1
  25. package/Libraries/Animated/nodes/AnimatedWithChildren.js +1 -3
  26. package/Libraries/Animated/useAnimatedProps.js +41 -35
  27. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts +19 -3
  28. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.js +77 -5
  29. package/Libraries/Components/AccessibilityInfo/AccessibilityInfo.win32.js +82 -5
  30. package/Libraries/Components/ActivityIndicator/ActivityIndicator.js +4 -4
  31. package/Libraries/Components/Button.js +9 -4
  32. package/Libraries/Components/Button.win32.js +12 -4
  33. package/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.js +3 -1
  34. package/Libraries/Components/Keyboard/KeyboardAvoidingView.js +7 -0
  35. package/Libraries/Components/Pressable/Pressable.js +4 -4
  36. package/Libraries/Components/Pressable/Pressable.win32.js +4 -4
  37. package/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.android.js +13 -7
  38. package/Libraries/Components/RefreshControl/__mocks__/RefreshControlMock.js +3 -2
  39. package/Libraries/Components/SafeAreaView/SafeAreaView.js +4 -4
  40. package/Libraries/Components/SafeAreaView/SafeAreaView.win32.js +4 -4
  41. package/Libraries/Components/ScrollView/AndroidHorizontalScrollViewNativeComponent.js +0 -1
  42. package/Libraries/Components/ScrollView/ScrollView.js +49 -88
  43. package/Libraries/Components/ScrollView/ScrollViewCommands.js +1 -1
  44. package/Libraries/Components/ScrollView/ScrollViewContext.js +2 -0
  45. package/Libraries/Components/ScrollView/ScrollViewNativeComponent.js +0 -2
  46. package/Libraries/Components/ScrollView/ScrollViewStickyHeader.js +8 -9
  47. package/Libraries/Components/Switch/Switch.js +8 -6
  48. package/Libraries/Components/TextInput/InputAccessoryView.js +1 -1
  49. package/Libraries/Components/TextInput/RCTMultilineTextInputNativeComponent.js +4 -4
  50. package/Libraries/Components/TextInput/RCTSingelineTextInputNativeComponent.js +6 -4
  51. package/Libraries/Components/TextInput/RCTTextInputViewConfig.js +2 -1
  52. package/Libraries/Components/TextInput/TextInput.d.ts +27 -4
  53. package/Libraries/Components/TextInput/TextInput.flow.js +36 -19
  54. package/Libraries/Components/TextInput/TextInput.js +37 -13
  55. package/Libraries/Components/TextInput/TextInput.win32.js +40 -15
  56. package/Libraries/Components/TextInput/TextInputState.js +11 -13
  57. package/Libraries/Components/TextInput/TextInputState.win32.js +13 -16
  58. package/Libraries/Components/TextInput/Win32TextInputNativeComponent.js +3 -0
  59. package/Libraries/Components/Touchable/BoundingDimensions.js +11 -3
  60. package/Libraries/Components/Touchable/Position.js +7 -2
  61. package/Libraries/Components/Touchable/Touchable.js +4 -0
  62. package/Libraries/Components/Touchable/Touchable.win32.js +4 -0
  63. package/Libraries/Components/Touchable/TouchableBounce.js +6 -2
  64. package/Libraries/Components/Touchable/TouchableHighlight.js +5 -5
  65. package/Libraries/Components/Touchable/TouchableOpacity.js +6 -5
  66. package/Libraries/Components/Touchable/TouchableWithoutFeedback.js +1 -2
  67. package/Libraries/Components/View/ReactNativeStyleAttributes.js +6 -1
  68. package/Libraries/Components/View/View.js +4 -4
  69. package/Libraries/Components/View/View.win32.js +4 -4
  70. package/Libraries/Components/View/ViewNativeComponent.js +6 -98
  71. package/Libraries/Components/View/ViewPropTypes.d.ts +7 -0
  72. package/Libraries/Components/View/ViewPropTypes.js +0 -3
  73. package/Libraries/Components/View/ViewPropTypes.win32.js +0 -3
  74. package/Libraries/Components/View/ViewWin32.js +1 -0
  75. package/Libraries/Core/ExceptionsManager.js +50 -29
  76. package/Libraries/Core/ReactNativeVersion.js +3 -3
  77. package/Libraries/Core/__mocks__/NativeExceptionsManager.js +0 -1
  78. package/Libraries/Core/setUpBatchedBridge.js +1 -10
  79. package/Libraries/Core/setUpDeveloperTools.js +1 -5
  80. package/Libraries/Core/setUpErrorHandling.js +20 -18
  81. package/Libraries/Core/setUpReactDevTools.js +107 -8
  82. package/Libraries/Core/setUpSegmentFetcher.js +1 -0
  83. package/Libraries/Core/setUpTimers.js +21 -18
  84. package/Libraries/Debugging/DebuggingOverlay.js +4 -5
  85. package/Libraries/Image/AssetSourceResolver.js +12 -1
  86. package/Libraries/Image/Image.android.js +1 -5
  87. package/Libraries/Image/Image.d.ts +20 -29
  88. package/Libraries/Image/Image.ios.js +0 -2
  89. package/Libraries/Image/Image.win32.js +0 -2
  90. package/Libraries/Image/ImageBackground.js +2 -5
  91. package/Libraries/Image/ImageProps.js +7 -6
  92. package/Libraries/Image/ImageResizeMode.d.ts +8 -1
  93. package/Libraries/Image/ImageResizeMode.js +4 -1
  94. package/Libraries/Image/ImageSource.d.ts +0 -2
  95. package/Libraries/Image/ImageSource.js +0 -2
  96. package/Libraries/Image/ImageTypes.flow.js +11 -9
  97. package/Libraries/Image/ImageUtils.js +6 -3
  98. package/Libraries/Image/ImageViewNativeComponent.js +5 -3
  99. package/Libraries/Inspector/Inspector.js +1 -0
  100. package/Libraries/Inspector/Inspector.win32.js +2 -1
  101. package/Libraries/Inspector/NetworkOverlay.js +4 -0
  102. package/Libraries/Inspector/ReactDevToolsOverlay.js +8 -14
  103. package/Libraries/Inspector/getInspectorDataForViewAtPoint.js +3 -5
  104. package/Libraries/Interaction/InteractionManager.js +6 -1
  105. package/Libraries/Interaction/InteractionManagerStub.js +176 -0
  106. package/Libraries/Interaction/TouchHistoryMath.js +22 -19
  107. package/Libraries/JSInspector/NetworkAgent.js +1 -1
  108. package/Libraries/Lists/FlatList.d.ts +1 -2
  109. package/Libraries/Lists/FlatList.js +2 -2
  110. package/Libraries/Lists/SectionListModern.js +7 -7
  111. package/Libraries/Lists/__flowtests__/FlatList-flowtest.js +2 -2
  112. package/Libraries/Lists/__flowtests__/SectionList-flowtest.js +1 -1
  113. package/Libraries/LogBox/Data/LogBoxData.js +3 -3
  114. package/Libraries/LogBox/LogBox.js +18 -5
  115. package/Libraries/LogBox/LogBoxInspectorContainer.js +1 -1
  116. package/Libraries/LogBox/LogBoxNotificationContainer.js +2 -2
  117. package/Libraries/LogBox/UI/AnsiHighlight.js +26 -17
  118. package/Libraries/LogBox/UI/LogBoxInspectorCodeFrame.js +6 -1
  119. package/Libraries/LogBox/UI/LogBoxInspectorCodeFrame.win32.js +6 -1
  120. package/Libraries/LogBox/UI/LogBoxInspectorHeader.js +1 -1
  121. package/Libraries/LogBox/UI/LogBoxInspectorHeader.win32.js +1 -1
  122. package/Libraries/LogBox/UI/LogBoxInspectorStackFrames.js +1 -1
  123. package/Libraries/LogBox/UI/LogBoxMessage.js +2 -2
  124. package/Libraries/Modal/Modal.d.ts +12 -0
  125. package/Libraries/Modal/Modal.js +31 -4
  126. package/Libraries/NativeComponent/BaseViewConfig.android.js +72 -1
  127. package/Libraries/NativeComponent/BaseViewConfig.ios.js +2 -1
  128. package/Libraries/NativeComponent/BaseViewConfig.win32.js +3 -11
  129. package/Libraries/NativeComponent/NativeComponentRegistry.js +3 -3
  130. package/Libraries/NativeComponent/StaticViewConfigValidator.js +0 -1
  131. package/Libraries/Network/FormData.js +11 -3
  132. package/Libraries/Network/XHRInterceptor.js +63 -14
  133. package/Libraries/Network/XMLHttpRequest.js +26 -1
  134. package/Libraries/NewAppScreen/components/HermesBadge.js +1 -1
  135. package/Libraries/PermissionsAndroid/PermissionsAndroid.d.ts +49 -2
  136. package/Libraries/PermissionsAndroid/PermissionsAndroid.js +4 -4
  137. package/Libraries/Pressability/HoverState.js +2 -0
  138. package/Libraries/Pressability/HoverState.win32.js +2 -0
  139. package/Libraries/Pressability/Pressability.js +2 -3
  140. package/Libraries/Pressability/Pressability.win32.js +2 -3
  141. package/Libraries/Pressability/usePressability.js +4 -1
  142. package/Libraries/ReactNative/AppContainer.js +1 -1
  143. package/Libraries/ReactNative/AppRegistry.js +1 -11
  144. package/Libraries/ReactNative/DisplayMode.js +1 -1
  145. package/Libraries/ReactNative/ReactFabricPublicInstance/ReactFabricHostComponent.js +2 -3
  146. package/Libraries/ReactNative/RendererImplementation.js +18 -17
  147. package/Libraries/ReactNative/getCachedComponentWithDebugName.js +1 -3
  148. package/Libraries/ReactNative/renderApplication.js +9 -8
  149. package/Libraries/ReactNative/requireNativeComponent.js +5 -2
  150. package/Libraries/Renderer/shims/ReactFabric.js +3 -3
  151. package/Libraries/Renderer/shims/ReactFeatureFlags.js +2 -2
  152. package/Libraries/Renderer/shims/ReactNative.js +3 -3
  153. package/Libraries/Renderer/shims/ReactNativeTypes.js +22 -35
  154. package/Libraries/Renderer/shims/ReactNativeViewConfigRegistry.js +5 -6
  155. package/Libraries/Renderer/shims/createReactNativeComponentClass.js +2 -2
  156. package/Libraries/StyleSheet/StyleSheet.js +7 -1
  157. package/Libraries/StyleSheet/StyleSheet.win32.js +7 -1
  158. package/Libraries/StyleSheet/StyleSheetTypes.d.ts +13 -2
  159. package/Libraries/StyleSheet/StyleSheetTypes.js +24 -6
  160. package/Libraries/StyleSheet/processBackgroundImage.js +87 -110
  161. package/Libraries/StyleSheet/processTransform.js +3 -34
  162. package/Libraries/Text/Text.js +248 -249
  163. package/Libraries/Text/Text.win32.js +282 -295
  164. package/Libraries/Text/TextNativeComponent.js +0 -1
  165. package/Libraries/TurboModule/TurboModuleRegistry.js +5 -5
  166. package/Libraries/Types/CoreEventTypes.d.ts +3 -10
  167. package/Libraries/Types/CoreEventTypes.js +4 -6
  168. package/Libraries/Types/CoreEventTypes.win32.js +4 -6
  169. package/Libraries/Utilities/Appearance.js +3 -1
  170. package/Libraries/Utilities/BackHandler.android.js +6 -18
  171. package/Libraries/Utilities/BackHandler.d.ts +0 -4
  172. package/Libraries/Utilities/BackHandler.ios.js +0 -7
  173. package/Libraries/Utilities/BackHandler.win32.js +6 -18
  174. package/Libraries/Utilities/FocusManager.win32.js +1 -1
  175. package/Libraries/Utilities/HMRClient.js +3 -4
  176. package/Libraries/Utilities/Platform.flow.js +2 -2
  177. package/Libraries/Utilities/Platform.flow.win32.js +3 -2
  178. package/Libraries/Utilities/__mocks__/BackHandler.js +3 -8
  179. package/Libraries/Utilities/codegenNativeComponent.js +1 -1
  180. package/Libraries/Utilities/useMergeRefs.js +26 -7
  181. package/Libraries/WebSocket/WebSocketEvent.js +4 -1
  182. package/Libraries/WebSocket/WebSocketInterceptor.js +31 -13
  183. package/Libraries/__flowtests__/ReactNativeTypes-flowtest.js +6 -5
  184. package/Libraries/promiseRejectionTrackingOptions.js +1 -1
  185. package/index.js +10 -3
  186. package/index.win32.js +10 -3
  187. package/jest/setup.js +36 -1
  188. package/overrides.json +37 -37
  189. package/package.json +20 -20
  190. package/src/private/animated/NativeAnimatedHelper.js +18 -16
  191. package/src/private/animated/NativeAnimatedHelper.win32.js +18 -15
  192. package/src/private/animated/useAnimatedPropsMemo.js +356 -0
  193. package/src/private/components/HScrollViewNativeComponents.js +1 -27
  194. package/src/private/components/SafeAreaView_INTERNAL_DO_NOT_USE.js +11 -8
  195. package/src/private/components/VScrollViewNativeComponents.js +2 -25
  196. package/src/private/debugging/ReactDevToolsSettingsManager.android.js +20 -0
  197. package/src/private/debugging/ReactDevToolsSettingsManager.ios.js +30 -0
  198. package/src/private/debugging/ReactDevToolsSettingsManager.win32.js +20 -0
  199. package/src/private/{fusebox → debugging}/setUpFuseboxReactDevToolsDispatcher.js +6 -0
  200. package/src/private/devmenu/DevMenu.d.ts +20 -0
  201. package/src/private/devmenu/DevMenu.js +31 -0
  202. package/src/private/featureflags/ReactNativeFeatureFlags.js +95 -86
  203. package/src/private/featureflags/ReactNativeFeatureFlagsBase.js +8 -2
  204. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +17 -19
  205. package/src/private/fusebox/specs/NativeReactDevToolsRuntimeSettingsModule.js +34 -0
  206. package/src/private/setup/setUpDOM.js +14 -6
  207. package/src/private/setup/setUpMutationObserver.js +5 -0
  208. package/src/private/specs/components/AndroidHorizontalScrollContentViewNativeComponent.js +1 -0
  209. package/src/private/specs/components/RCTModalHostViewNativeComponent.js +8 -0
  210. package/src/private/specs/modules/NativeAccessibilityInfo.js +9 -0
  211. package/src/private/specs/modules/NativeAccessibilityInfoWin32.js +9 -0
  212. package/src/private/specs/modules/NativeAccessibilityManager.js +4 -0
  213. package/src/private/specs/modules/NativeActionSheetManager.js +2 -0
  214. package/src/private/specs/modules/NativeAppearance.js +4 -10
  215. package/src/private/specs/modules/NativeExceptionsManager.js +0 -12
  216. package/src/private/specs/modules/{NativeDevToolsSettingsManager.js → NativeReactDevToolsSettingsManager.js} +3 -5
  217. package/src/private/webapis/dom/geometry/DOMRect.js +2 -2
  218. package/src/private/webapis/dom/geometry/DOMRectReadOnly.js +2 -2
  219. package/src/private/webapis/dom/nodes/ReactNativeElement.js +2 -3
  220. package/src/private/webapis/intersectionobserver/IntersectionObserver.js +102 -11
  221. package/src/private/webapis/intersectionobserver/IntersectionObserverEntry.js +26 -0
  222. package/src/private/webapis/intersectionobserver/IntersectionObserverManager.js +1 -0
  223. package/src/private/webapis/intersectionobserver/specs/NativeIntersectionObserver.js +1 -0
  224. package/src/private/webapis/intersectionobserver/specs/__mocks__/NativeIntersectionObserver.js +9 -0
  225. package/src/private/webapis/performance/EventTiming.js +13 -8
  226. package/src/private/webapis/performance/Performance.js +66 -73
  227. package/src/private/webapis/performance/PerformanceEntry.js +2 -5
  228. package/src/private/webapis/performance/PerformanceObserver.js +65 -164
  229. package/src/private/webapis/performance/RawPerformanceEntry.js +1 -1
  230. package/src/private/webapis/performance/UserTiming.js +11 -7
  231. package/src/private/webapis/performance/Utilities.js +18 -0
  232. package/src/private/webapis/performance/specs/NativePerformance.js +71 -2
  233. package/src/private/webapis/performance/specs/__mocks__/NativePerformanceMock.js +267 -0
  234. package/src-win/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts +19 -3
  235. package/src-win/Libraries/Components/View/ViewPropTypes.d.ts +7 -0
  236. package/types/index.d.ts +1 -1
  237. package/types/public/ReactNativeTypes.d.ts +4 -8
  238. package/Libraries/DevToolsSettings/DevToolsSettingsManager.android.js +0 -35
  239. package/Libraries/DevToolsSettings/DevToolsSettingsManager.d.ts +0 -20
  240. package/Libraries/DevToolsSettings/DevToolsSettingsManager.ios.js +0 -49
  241. package/Libraries/DevToolsSettings/DevToolsSettingsManager.win32.js +0 -35
  242. package/Libraries/DevToolsSettings/NativeDevToolsSettingsManager.js +0 -13
  243. package/Libraries/ReactNative/ReactFabricInternals.js +0 -17
  244. package/src/private/components/useSyncOnScroll.js +0 -48
  245. package/src/private/webapis/performance/specs/NativePerformanceObserver.js +0 -61
  246. package/src/private/webapis/performance/specs/__mocks__/NativePerformance.js +0 -67
  247. package/src/private/webapis/performance/specs/__mocks__/NativePerformanceObserver.js +0 -127
  248. package/types/experimental.d.ts +0 -59
  249. /package/src/private/{fusebox → debugging}/FuseboxSessionObserver.js +0 -0
@@ -16,6 +16,12 @@ export interface Spec extends TurboModule {
16
16
  +isReduceMotionEnabled: (
17
17
  onSuccess: (isReduceMotionEnabled: boolean) => void,
18
18
  ) => void;
19
+ +isInvertColorsEnabled?: (
20
+ onSuccess: (isInvertColorsEnabled: boolean) => void,
21
+ ) => void;
22
+ +isHighTextContrastEnabled?: (
23
+ onSuccess: (isHighTextContrastEnabled: boolean) => void,
24
+ ) => void;
19
25
  +isTouchExplorationEnabled: (
20
26
  onSuccess: (isScreenReaderEnabled: boolean) => void,
21
27
  ) => void;
@@ -34,6 +40,9 @@ export interface Spec extends TurboModule {
34
40
  mSec: number,
35
41
  onSuccess: (recommendedTimeoutMillis: number) => void,
36
42
  ) => void;
43
+ +isGrayscaleEnabled?: (
44
+ onSuccess: (isGrayscaleEnabled: boolean) => void,
45
+ ) => void;
37
46
  }
38
47
 
39
48
  export default (TurboModuleRegistry.get<Spec>('AccessibilityInfo'): ?Spec);
@@ -29,6 +29,10 @@ export interface Spec extends TurboModule {
29
29
  onSuccess: (isReduceMotionEnabled: boolean) => void,
30
30
  onError: (error: Object) => void,
31
31
  ) => void;
32
+ +getCurrentDarkerSystemColorsState?: (
33
+ onSuccess: (isDarkerSystemColorsEnabled: boolean) => void,
34
+ onError: (error: Object) => void,
35
+ ) => void;
32
36
  +getCurrentPrefersCrossFadeTransitionsState?: (
33
37
  onSuccess: (prefersCrossFadeTransitions: boolean) => void,
34
38
  onError: (error: Object) => void,
@@ -24,6 +24,7 @@ export interface Spec extends TurboModule {
24
24
  +anchor?: ?number,
25
25
  +tintColor?: ?number,
26
26
  +cancelButtonTintColor?: ?number,
27
+ +disabledButtonTintColor?: ?number,
27
28
  +userInterfaceStyle?: ?string,
28
29
  +disabledButtonIndices?: Array<number>,
29
30
  |},
@@ -37,6 +38,7 @@ export interface Spec extends TurboModule {
37
38
  +anchor?: ?number,
38
39
  +tintColor?: ?number,
39
40
  +cancelButtonTintColor?: ?number,
41
+ +disabledButtonTintColor?: ?number,
40
42
  +excludedActivityTypes?: ?Array<string>,
41
43
  +userInterfaceStyle?: ?string,
42
44
  |},
@@ -12,21 +12,15 @@ import type {TurboModule} from '../../../../Libraries/TurboModule/RCTExport';
12
12
 
13
13
  import * as TurboModuleRegistry from '../../../../Libraries/TurboModule/TurboModuleRegistry';
14
14
 
15
- export type ColorSchemeName = 'light' | 'dark';
15
+ export type ColorSchemeName = 'light' | 'dark' | 'unspecified';
16
16
 
17
17
  export type AppearancePreferences = {
18
- // TODO: (hramos) T52919652 Use ?ColorSchemeName once codegen supports union
19
- // types.
20
- /* 'light' | 'dark' */
21
- colorScheme?: ?string,
18
+ colorScheme?: ?ColorSchemeName,
22
19
  };
23
20
 
24
21
  export interface Spec extends TurboModule {
25
- // TODO: (hramos) T52919652 Use ?ColorSchemeName once codegen supports union
26
- // types.
27
- /* 'light' | 'dark' */
28
- +getColorScheme: () => ?string;
29
- +setColorScheme: (colorScheme: string) => void;
22
+ +getColorScheme: () => ?ColorSchemeName;
23
+ +setColorScheme: (colorScheme: ColorSchemeName) => void;
30
24
 
31
25
  // RCTEventEmitter
32
26
  +addListener: (eventName: string) => void;
@@ -47,11 +47,6 @@ export interface Spec extends TurboModule {
47
47
  exceptionId: number,
48
48
  ) => void;
49
49
  +reportException?: (data: ExceptionData) => void;
50
- +updateExceptionMessage: (
51
- message: string,
52
- stack: Array<StackFrame>,
53
- exceptionId: number,
54
- ) => void;
55
50
  // TODO(T53311281): This is a noop on iOS now. Implement it.
56
51
  +dismissRedbox?: () => void;
57
52
  }
@@ -74,13 +69,6 @@ const ExceptionsManager = {
74
69
  ) {
75
70
  NativeModule.reportSoftException(message, stack, exceptionId);
76
71
  },
77
- updateExceptionMessage(
78
- message: string,
79
- stack: Array<StackFrame>,
80
- exceptionId: number,
81
- ) {
82
- NativeModule.updateExceptionMessage(message, stack, exceptionId);
83
- },
84
72
  dismissRedbox(): void {
85
73
  if (Platform.OS !== 'ios' && NativeModule.dismissRedbox) {
86
74
  // TODO(T53311281): This is a noop on iOS now. Implement it.
@@ -13,12 +13,10 @@ import type {TurboModule} from '../../../../Libraries/TurboModule/RCTExport';
13
13
  import * as TurboModuleRegistry from '../../../../Libraries/TurboModule/TurboModuleRegistry';
14
14
 
15
15
  export interface Spec extends TurboModule {
16
- +setConsolePatchSettings: (newConsolePatchSettings: string) => void;
17
- +getConsolePatchSettings: () => ?string;
18
- +setProfilingSettings?: (newProfilingSettings: string) => void;
19
- +getProfilingSettings?: () => ?string;
16
+ +setGlobalHookSettings: (settings: string) => void;
17
+ +getGlobalHookSettings: () => ?string;
20
18
  }
21
19
 
22
20
  export default (TurboModuleRegistry.get<Spec>(
23
- 'DevToolsSettingsManager',
21
+ 'ReactDevToolsSettingsManager',
24
22
  ): ?Spec);
@@ -14,7 +14,7 @@
14
14
  * licensed under [CC-BY-SA 2.5](https://creativecommons.org/licenses/by-sa/2.5/).
15
15
  */
16
16
 
17
- import DOMRectReadOnly, {type DOMRectLike} from './DOMRectReadOnly';
17
+ import DOMRectReadOnly, {type DOMRectInit} from './DOMRectReadOnly';
18
18
 
19
19
  // flowlint unsafe-getters-setters:off
20
20
 
@@ -72,7 +72,7 @@ export default class DOMRect extends DOMRectReadOnly {
72
72
  /**
73
73
  * Creates a new `DOMRect` object with a given location and dimensions.
74
74
  */
75
- static fromRect(rect?: ?DOMRectLike): DOMRect {
75
+ static fromRect(rect?: ?DOMRectInit): DOMRect {
76
76
  if (!rect) {
77
77
  return new DOMRect();
78
78
  }
@@ -16,7 +16,7 @@
16
16
 
17
17
  // flowlint sketchy-null:off, unsafe-getters-setters:off
18
18
 
19
- export interface DOMRectLike {
19
+ export interface DOMRectInit {
20
20
  x?: ?number;
21
21
  y?: ?number;
22
22
  width?: ?number;
@@ -146,7 +146,7 @@ export default class DOMRectReadOnly {
146
146
  /**
147
147
  * Creates a new `DOMRectReadOnly` object with a given location and dimensions.
148
148
  */
149
- static fromRect(rect?: ?DOMRectLike): DOMRectReadOnly {
149
+ static fromRect(rect?: ?DOMRectInit): DOMRectReadOnly {
150
150
  if (!rect) {
151
151
  return new DOMRectReadOnly();
152
152
  }
@@ -11,7 +11,7 @@
11
11
  // flowlint unsafe-getters-setters:off
12
12
 
13
13
  import type {
14
- HostComponent,
14
+ HostInstance,
15
15
  INativeMethods,
16
16
  InternalInstanceHandle,
17
17
  MeasureInWindowOnSuccessCallback,
@@ -19,7 +19,6 @@ import type {
19
19
  MeasureOnSuccessCallback,
20
20
  ViewConfig,
21
21
  } from '../../../../../Libraries/Renderer/shims/ReactNativeTypes';
22
- import type {ElementRef} from 'react';
23
22
 
24
23
  import TextInputState from '../../../../../Libraries/Components/TextInput/TextInputState';
25
24
  import {getFabricUIManager} from '../../../../../Libraries/ReactNative/FabricUIManager';
@@ -143,7 +142,7 @@ export default class ReactNativeElement
143
142
  }
144
143
 
145
144
  measureLayout(
146
- relativeToNativeNode: number | ElementRef<HostComponent<mixed>>,
145
+ relativeToNativeNode: number | HostInstance,
147
146
  onSuccess: MeasureLayoutOnSuccessCallback,
148
147
  onFail?: () => void /* currently unused */,
149
148
  ) {
@@ -25,6 +25,18 @@ type IntersectionObserverInit = {
25
25
  // root?: ReactNativeElement, // This option exists on the Web but it's not currently supported in React Native.
26
26
  // rootMargin?: string, // This option exists on the Web but it's not currently supported in React Native.
27
27
  threshold?: number | $ReadOnlyArray<number>,
28
+
29
+ /**
30
+ * This is a React Native specific option (not spec compliant) that specifies
31
+ * ratio threshold(s) of the intersection area to the total `root` area.
32
+ *
33
+ * If set, it will either be a singular ratio value between 0-1 (inclusive)
34
+ * or an array of such ratios.
35
+ *
36
+ * Note: If `rn_rootThreshold` is set, and `threshold` is not set,
37
+ * `threshold` will not default to [0] (as per spec)
38
+ */
39
+ rn_rootThreshold?: number | $ReadOnlyArray<number>,
28
40
  };
29
41
 
30
42
  /**
@@ -44,13 +56,16 @@ type IntersectionObserverInit = {
44
56
  * elements with the same observer.
45
57
  *
46
58
  * This implementation only supports the `threshold` option at the moment
47
- * (`root` and `rootMargin` are not supported).
59
+ * (`root` and `rootMargin` are not supported) and provides a React Native specific
60
+ * option `rn_rootThreshold`.
61
+ *
48
62
  */
49
63
  export default class IntersectionObserver {
50
64
  _callback: IntersectionObserverCallback;
51
65
  _thresholds: $ReadOnlyArray<number>;
52
66
  _observationTargets: Set<ReactNativeElement> = new Set();
53
67
  _intersectionObserverId: ?IntersectionObserverId;
68
+ _rootThresholds: $ReadOnlyArray<number> | null;
54
69
 
55
70
  constructor(
56
71
  callback: IntersectionObserverCallback,
@@ -83,7 +98,12 @@ export default class IntersectionObserver {
83
98
  }
84
99
 
85
100
  this._callback = callback;
86
- this._thresholds = normalizeThresholds(options?.threshold);
101
+
102
+ this._rootThresholds = normalizeRootThreshold(options?.rn_rootThreshold);
103
+ this._thresholds = normalizeThreshold(
104
+ options?.threshold,
105
+ this._rootThresholds != null, // only provide default if no rootThreshold
106
+ );
87
107
  }
88
108
 
89
109
  /**
@@ -115,14 +135,27 @@ export default class IntersectionObserver {
115
135
  * A list of thresholds, sorted in increasing numeric order, where each
116
136
  * threshold is a ratio of intersection area to bounding box area of an
117
137
  * 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.
138
+ * Notifications for a target are generated when any of the thresholds specified
139
+ * in `rn_rootThreshold` or `threshold` are crossed for that target.
140
+ *
141
+ * If no value was passed to the constructor, and no `rn_rootThreshold`
142
+ * is set, `0` is used.
121
143
  */
122
144
  get thresholds(): $ReadOnlyArray<number> {
123
145
  return this._thresholds;
124
146
  }
125
147
 
148
+ /**
149
+ * A list of root thresholds, sorted in increasing numeric order, where each
150
+ * threshold is a ratio of intersection area to bounding box area of the specified
151
+ * root view, which defaults to the viewport.
152
+ * Notifications for a target are generated when any of the thresholds specified
153
+ * in `rn_rootThreshold` or `threshold` are crossed for that target.
154
+ */
155
+ get rootThresholds(): $ReadOnlyArray<number> | null {
156
+ return this._rootThresholds;
157
+ }
158
+
126
159
  /**
127
160
  * Adds an element to the set of target elements being watched by the
128
161
  * `IntersectionObserver`.
@@ -131,6 +164,12 @@ export default class IntersectionObserver {
131
164
  * To stop observing the element, call `IntersectionObserver.unobserve()`.
132
165
  */
133
166
  observe(target: ReactNativeElement): void {
167
+ if (target == null) {
168
+ throw new TypeError(
169
+ "Failed to execute 'observe' on 'IntersectionObserver': parameter 1 is null or undefined.",
170
+ );
171
+ }
172
+
134
173
  if (!(target instanceof ReactNativeElement)) {
135
174
  throw new TypeError(
136
175
  "Failed to execute 'observe' on 'IntersectionObserver': parameter 1 is not of type 'ReactNativeElement'.",
@@ -215,32 +254,84 @@ export default class IntersectionObserver {
215
254
  * Converts the user defined `threshold` value into an array of sorted valid
216
255
  * threshold options for `IntersectionObserver` (double ∈ [0, 1]).
217
256
  *
257
+ * If `defaultEmpty` is true, then defaults to empty array, otherwise [0].
258
+ *
218
259
  * @example
219
260
  * normalizeThresholds(0.5); // → [0.5]
220
261
  * normalizeThresholds([1, 0.5, 0]); // → [0, 0.5, 1]
221
262
  * normalizeThresholds(['1', '0.5', '0']); // → [0, 0.5, 1]
263
+ * normalizeThresholds(null); // → [0]
264
+ * normalizeThresholds([null, null]); // → [0, 0]
265
+ *
266
+ * normalizeThresholds([null], true); // → [0]
267
+ * normalizeThresholds(null, true); // → []
268
+ * normalizeThresholds([], true); // → []
222
269
  */
223
- function normalizeThresholds(threshold: mixed): $ReadOnlyArray<number> {
270
+ function normalizeThreshold(
271
+ threshold: mixed,
272
+ defaultEmpty: boolean = false,
273
+ ): $ReadOnlyArray<number> {
224
274
  if (Array.isArray(threshold)) {
225
275
  if (threshold.length > 0) {
226
- return threshold.map(normalizeThresholdValue).sort();
276
+ return threshold
277
+ .map(t => normalizeThresholdValue(t, 'threshold'))
278
+ .map(t => t ?? 0)
279
+ .sort();
280
+ } else if (defaultEmpty) {
281
+ return [];
227
282
  } else {
228
283
  return [0];
229
284
  }
230
285
  }
231
286
 
232
- return [normalizeThresholdValue(threshold)];
287
+ const normalized = normalizeThresholdValue(threshold, 'threshold');
288
+ if (normalized == null) {
289
+ return defaultEmpty ? [] : [0];
290
+ }
291
+
292
+ return [normalized];
293
+ }
294
+
295
+ /**
296
+ * Converts the user defined `rn_rootThreshold` value into an array of sorted valid
297
+ * threshold options for `IntersectionObserver` (double ∈ [0, 1]).
298
+ *
299
+ * If invalid array or null, returns null.
300
+ *
301
+ * @example
302
+ * normalizeRootThreshold(0.5); // → [0.5]
303
+ * normalizeRootThresholds([1, 0.5, 0]); // → [0, 0.5, 1]
304
+ * normalizeRootThresholds([null, '0.5', '0']); // → [0, 0.5]
305
+ * normalizeRootThresholds(null); // → null
306
+ * normalizeRootThresholds([null, null]); // → null
307
+ */
308
+ function normalizeRootThreshold(
309
+ rootThreshold: mixed,
310
+ ): null | $ReadOnlyArray<number> {
311
+ if (Array.isArray(rootThreshold)) {
312
+ const normalizedArr = rootThreshold
313
+ .map(rt => normalizeThresholdValue(rt, 'rn_rootThreshold'))
314
+ .filter((rt): rt is number => rt != null)
315
+ .sort();
316
+ return normalizedArr.length === 0 ? null : normalizedArr;
317
+ }
318
+
319
+ const normalized = normalizeThresholdValue(rootThreshold, 'rn_rootThreshold');
320
+ return normalized == null ? null : [normalized];
233
321
  }
234
322
 
235
- function normalizeThresholdValue(threshold: mixed): number {
323
+ function normalizeThresholdValue(
324
+ threshold: mixed,
325
+ property: string,
326
+ ): null | number {
236
327
  if (threshold == null) {
237
- return 0;
328
+ return null;
238
329
  }
239
330
 
240
331
  const thresholdAsNumber = Number(threshold);
241
332
  if (!Number.isFinite(thresholdAsNumber)) {
242
333
  throw new TypeError(
243
- "Failed to read the 'threshold' property from 'IntersectionObserverInit': The provided double value is non-finite.",
334
+ `Failed to read the '${property}' property from 'IntersectionObserverInit': The provided double value is non-finite.`,
244
335
  );
245
336
  }
246
337
 
@@ -74,6 +74,32 @@ export default class IntersectionObserverEntry {
74
74
  return Math.min(ratio, 1);
75
75
  }
76
76
 
77
+ /**
78
+ * Returns the ratio of the `intersectionRect` to the `boundingRootRect`.
79
+ */
80
+ get rn_intersectionRootRatio(): number {
81
+ const intersectionRect = this.intersectionRect;
82
+
83
+ const rootRect = this._nativeEntry.rootRect;
84
+ const boundingRootRect = new DOMRectReadOnly(
85
+ rootRect[0],
86
+ rootRect[1],
87
+ rootRect[2],
88
+ rootRect[3],
89
+ );
90
+
91
+ if (boundingRootRect.width === 0 || boundingRootRect.height === 0) {
92
+ return 0;
93
+ }
94
+
95
+ const ratio =
96
+ (intersectionRect.width * intersectionRect.height) /
97
+ (boundingRootRect.width * boundingRootRect.height);
98
+
99
+ // Prevent rounding errors from making this value greater than 1.
100
+ return Math.min(ratio, 1);
101
+ }
102
+
77
103
  /**
78
104
  * Returns a `DOMRectReadOnly` representing the target's visible area.
79
105
  */
@@ -162,6 +162,7 @@ export function observe({
162
162
  intersectionObserverId,
163
163
  targetShadowNode,
164
164
  thresholds: registeredObserver.observer.thresholds,
165
+ rootThresholds: registeredObserver.observer.rootThresholds,
165
166
  });
166
167
 
167
168
  return true;
@@ -26,6 +26,7 @@ export type NativeIntersectionObserverObserveOptions = {
26
26
  intersectionObserverId: number,
27
27
  targetShadowNode: mixed,
28
28
  thresholds: $ReadOnlyArray<number>,
29
+ rootThresholds?: ?$ReadOnlyArray<number>,
29
30
  };
30
31
 
31
32
  export interface Spec extends TurboModule {
@@ -23,8 +23,10 @@ import nullthrows from 'nullthrows';
23
23
 
24
24
  type ObserverState = {
25
25
  thresholds: $ReadOnlyArray<number>,
26
+ rootThresholds?: ?$ReadOnlyArray<number>,
26
27
  intersecting: boolean,
27
28
  currentThreshold: ?number,
29
+ currentRootThreshold: ?number,
28
30
  };
29
31
 
30
32
  type Observation = {
@@ -74,8 +76,10 @@ const NativeIntersectionObserverMock = {
74
76
  ...options,
75
77
  state: {
76
78
  thresholds: options.thresholds,
79
+ rootThresholds: options.rootThresholds,
77
80
  intersecting: false,
78
81
  currentThreshold: null,
82
+ currentRootThreshold: null,
79
83
  },
80
84
  };
81
85
  observations.push(observation);
@@ -141,9 +145,14 @@ const NativeIntersectionObserverMock = {
141
145
  if (observation.state.intersecting) {
142
146
  observation.state.intersecting = false;
143
147
  observation.state.currentThreshold = null;
148
+ observation.state.currentRootThreshold = null;
144
149
  } else {
145
150
  observation.state.intersecting = true;
146
151
  observation.state.currentThreshold = observation.thresholds[0];
152
+ observation.state.currentRootThreshold =
153
+ observation.rootThresholds != null
154
+ ? observation.rootThresholds[0]
155
+ : null;
147
156
  }
148
157
  pendingRecords.push(createRecordFromObservation(observation));
149
158
  setImmediate(notifyIntersectionObservers);
@@ -16,8 +16,8 @@ import type {
16
16
  } from './PerformanceEntry';
17
17
 
18
18
  import {PerformanceEntry} from './PerformanceEntry';
19
- import {warnNoNativePerformanceObserver} from './PerformanceObserver';
20
- import NativePerformanceObserver from './specs/NativePerformanceObserver';
19
+ import NativePerformance from './specs/NativePerformance';
20
+ import {warnNoNativePerformance} from './Utilities';
21
21
 
22
22
  export type PerformanceEventTimingJSON = {
23
23
  ...PerformanceEntryJSON,
@@ -85,14 +85,18 @@ function getCachedEventCounts(): Map<string, number> {
85
85
  if (cachedEventCounts) {
86
86
  return cachedEventCounts;
87
87
  }
88
- if (!NativePerformanceObserver) {
89
- warnNoNativePerformanceObserver();
90
- return new Map();
88
+
89
+ if (!NativePerformance || !NativePerformance?.getEventCounts) {
90
+ warnNoNativePerformance();
91
+ cachedEventCounts = new Map();
92
+ return cachedEventCounts;
91
93
  }
92
94
 
93
- cachedEventCounts = new Map<string, number>(
94
- NativePerformanceObserver.getEventCounts(),
95
+ const eventCounts = new Map<string, number>(
96
+ NativePerformance.getEventCounts?.() ?? [],
95
97
  );
98
+ cachedEventCounts = eventCounts;
99
+
96
100
  // $FlowFixMe[incompatible-call]
97
101
  global.queueMicrotask(() => {
98
102
  // To be consistent with the calls to the API from the same task,
@@ -101,7 +105,8 @@ function getCachedEventCounts(): Map<string, number> {
101
105
  // after the current task is guaranteed to have finished.
102
106
  cachedEventCounts = null;
103
107
  });
104
- return cachedEventCounts ?? new Map();
108
+
109
+ return eventCounts;
105
110
  }
106
111
 
107
112
  /**