@office-iss/react-native-win32 0.76.2 → 0.77.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.
Files changed (248) hide show
  1. package/.eslintignore +1 -1
  2. package/.flowconfig +5 -1
  3. package/CHANGELOG.json +164 -53
  4. package/CHANGELOG.md +74 -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 +96 -46
  22. package/Libraries/Animated/nodes/AnimatedStyle.js +108 -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/XHRInterceptor.js +63 -14
  132. package/Libraries/Network/XMLHttpRequest.js +26 -1
  133. package/Libraries/NewAppScreen/components/HermesBadge.js +1 -1
  134. package/Libraries/PermissionsAndroid/PermissionsAndroid.d.ts +49 -2
  135. package/Libraries/PermissionsAndroid/PermissionsAndroid.js +4 -4
  136. package/Libraries/Pressability/HoverState.js +2 -0
  137. package/Libraries/Pressability/HoverState.win32.js +2 -0
  138. package/Libraries/Pressability/Pressability.js +2 -3
  139. package/Libraries/Pressability/Pressability.win32.js +2 -3
  140. package/Libraries/Pressability/usePressability.js +4 -1
  141. package/Libraries/ReactNative/AppContainer.js +1 -1
  142. package/Libraries/ReactNative/AppRegistry.js +1 -11
  143. package/Libraries/ReactNative/DisplayMode.js +1 -1
  144. package/Libraries/ReactNative/ReactFabricPublicInstance/ReactFabricHostComponent.js +2 -3
  145. package/Libraries/ReactNative/RendererImplementation.js +18 -17
  146. package/Libraries/ReactNative/getCachedComponentWithDebugName.js +1 -3
  147. package/Libraries/ReactNative/renderApplication.js +9 -8
  148. package/Libraries/ReactNative/requireNativeComponent.js +5 -2
  149. package/Libraries/Renderer/shims/ReactFabric.js +3 -3
  150. package/Libraries/Renderer/shims/ReactFeatureFlags.js +2 -2
  151. package/Libraries/Renderer/shims/ReactNative.js +3 -3
  152. package/Libraries/Renderer/shims/ReactNativeTypes.js +22 -35
  153. package/Libraries/Renderer/shims/ReactNativeViewConfigRegistry.js +5 -6
  154. package/Libraries/Renderer/shims/createReactNativeComponentClass.js +2 -2
  155. package/Libraries/StyleSheet/StyleSheet.js +7 -1
  156. package/Libraries/StyleSheet/StyleSheet.win32.js +7 -1
  157. package/Libraries/StyleSheet/StyleSheetTypes.d.ts +13 -2
  158. package/Libraries/StyleSheet/StyleSheetTypes.js +24 -6
  159. package/Libraries/StyleSheet/processBackgroundImage.js +87 -110
  160. package/Libraries/StyleSheet/processTransform.js +3 -34
  161. package/Libraries/Text/Text.js +248 -249
  162. package/Libraries/Text/Text.win32.js +282 -295
  163. package/Libraries/Text/TextNativeComponent.js +0 -1
  164. package/Libraries/TurboModule/TurboModuleRegistry.js +5 -5
  165. package/Libraries/Types/CoreEventTypes.d.ts +3 -10
  166. package/Libraries/Types/CoreEventTypes.js +4 -6
  167. package/Libraries/Types/CoreEventTypes.win32.js +4 -6
  168. package/Libraries/Utilities/Appearance.js +3 -1
  169. package/Libraries/Utilities/BackHandler.android.js +6 -18
  170. package/Libraries/Utilities/BackHandler.d.ts +0 -4
  171. package/Libraries/Utilities/BackHandler.ios.js +0 -7
  172. package/Libraries/Utilities/BackHandler.win32.js +6 -18
  173. package/Libraries/Utilities/FocusManager.win32.js +1 -1
  174. package/Libraries/Utilities/HMRClient.js +3 -4
  175. package/Libraries/Utilities/Platform.flow.js +2 -2
  176. package/Libraries/Utilities/Platform.flow.win32.js +3 -2
  177. package/Libraries/Utilities/__mocks__/BackHandler.js +3 -8
  178. package/Libraries/Utilities/codegenNativeComponent.js +1 -1
  179. package/Libraries/Utilities/useMergeRefs.js +26 -7
  180. package/Libraries/WebSocket/WebSocketEvent.js +4 -1
  181. package/Libraries/WebSocket/WebSocketInterceptor.js +31 -13
  182. package/Libraries/__flowtests__/ReactNativeTypes-flowtest.js +6 -5
  183. package/Libraries/promiseRejectionTrackingOptions.js +1 -1
  184. package/index.js +10 -3
  185. package/index.win32.js +10 -3
  186. package/jest/setup.js +36 -1
  187. package/overrides.json +37 -37
  188. package/package.json +20 -20
  189. package/src/private/animated/NativeAnimatedHelper.js +18 -16
  190. package/src/private/animated/NativeAnimatedHelper.win32.js +18 -15
  191. package/src/private/animated/useAnimatedPropsMemo.js +348 -0
  192. package/src/private/components/HScrollViewNativeComponents.js +1 -27
  193. package/src/private/components/SafeAreaView_INTERNAL_DO_NOT_USE.js +11 -8
  194. package/src/private/components/VScrollViewNativeComponents.js +2 -25
  195. package/src/private/debugging/ReactDevToolsSettingsManager.android.js +20 -0
  196. package/src/private/debugging/ReactDevToolsSettingsManager.ios.js +30 -0
  197. package/src/private/debugging/ReactDevToolsSettingsManager.win32.js +20 -0
  198. package/src/private/{fusebox → debugging}/setUpFuseboxReactDevToolsDispatcher.js +6 -0
  199. package/src/private/devmenu/DevMenu.d.ts +20 -0
  200. package/src/private/devmenu/DevMenu.js +31 -0
  201. package/src/private/featureflags/ReactNativeFeatureFlags.js +95 -86
  202. package/src/private/featureflags/ReactNativeFeatureFlagsBase.js +8 -2
  203. package/src/private/featureflags/specs/NativeReactNativeFeatureFlags.js +17 -19
  204. package/src/private/fusebox/specs/NativeReactDevToolsRuntimeSettingsModule.js +34 -0
  205. package/src/private/setup/setUpDOM.js +14 -6
  206. package/src/private/setup/setUpMutationObserver.js +5 -0
  207. package/src/private/specs/components/AndroidHorizontalScrollContentViewNativeComponent.js +1 -0
  208. package/src/private/specs/components/RCTModalHostViewNativeComponent.js +8 -0
  209. package/src/private/specs/modules/NativeAccessibilityInfo.js +9 -0
  210. package/src/private/specs/modules/NativeAccessibilityInfoWin32.js +9 -0
  211. package/src/private/specs/modules/NativeAccessibilityManager.js +4 -0
  212. package/src/private/specs/modules/NativeActionSheetManager.js +2 -0
  213. package/src/private/specs/modules/NativeAppearance.js +4 -10
  214. package/src/private/specs/modules/NativeExceptionsManager.js +0 -12
  215. package/src/private/specs/modules/{NativeDevToolsSettingsManager.js → NativeReactDevToolsSettingsManager.js} +3 -5
  216. package/src/private/webapis/dom/geometry/DOMRect.js +2 -2
  217. package/src/private/webapis/dom/geometry/DOMRectReadOnly.js +2 -2
  218. package/src/private/webapis/dom/nodes/ReactNativeElement.js +2 -3
  219. package/src/private/webapis/intersectionobserver/IntersectionObserver.js +102 -11
  220. package/src/private/webapis/intersectionobserver/IntersectionObserverEntry.js +26 -0
  221. package/src/private/webapis/intersectionobserver/IntersectionObserverManager.js +1 -0
  222. package/src/private/webapis/intersectionobserver/specs/NativeIntersectionObserver.js +1 -0
  223. package/src/private/webapis/intersectionobserver/specs/__mocks__/NativeIntersectionObserver.js +9 -0
  224. package/src/private/webapis/performance/EventTiming.js +13 -8
  225. package/src/private/webapis/performance/Performance.js +66 -73
  226. package/src/private/webapis/performance/PerformanceEntry.js +2 -5
  227. package/src/private/webapis/performance/PerformanceObserver.js +65 -164
  228. package/src/private/webapis/performance/RawPerformanceEntry.js +1 -1
  229. package/src/private/webapis/performance/UserTiming.js +11 -7
  230. package/src/private/webapis/performance/Utilities.js +18 -0
  231. package/src/private/webapis/performance/specs/NativePerformance.js +71 -2
  232. package/src/private/webapis/performance/specs/__mocks__/NativePerformanceMock.js +267 -0
  233. package/src-win/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts +19 -3
  234. package/src-win/Libraries/Components/View/ViewPropTypes.d.ts +7 -0
  235. package/types/index.d.ts +1 -1
  236. package/types/public/ReactNativeTypes.d.ts +4 -8
  237. package/Libraries/DevToolsSettings/DevToolsSettingsManager.android.js +0 -35
  238. package/Libraries/DevToolsSettings/DevToolsSettingsManager.d.ts +0 -20
  239. package/Libraries/DevToolsSettings/DevToolsSettingsManager.ios.js +0 -49
  240. package/Libraries/DevToolsSettings/DevToolsSettingsManager.win32.js +0 -35
  241. package/Libraries/DevToolsSettings/NativeDevToolsSettingsManager.js +0 -13
  242. package/Libraries/ReactNative/ReactFabricInternals.js +0 -17
  243. package/src/private/components/useSyncOnScroll.js +0 -48
  244. package/src/private/webapis/performance/specs/NativePerformanceObserver.js +0 -61
  245. package/src/private/webapis/performance/specs/__mocks__/NativePerformance.js +0 -67
  246. package/src/private/webapis/performance/specs/__mocks__/NativePerformanceObserver.js +0 -127
  247. package/types/experimental.d.ts +0 -59
  248. /package/src/private/{fusebox → debugging}/FuseboxSessionObserver.js +0 -0
@@ -8,8 +8,6 @@
8
8
  * @format
9
9
  */
10
10
 
11
- 'use strict';
12
-
13
11
  import type {PlatformConfig} from '../AnimatedPlatformConfig';
14
12
 
15
13
  import {validateStyles} from '../../../src/private/animated/NativeAnimatedValidation';
@@ -21,24 +19,34 @@ import AnimatedObject from './AnimatedObject';
21
19
  import AnimatedTransform from './AnimatedTransform';
22
20
  import AnimatedWithChildren from './AnimatedWithChildren';
23
21
 
22
+ export type AnimatedStyleAllowlist = $ReadOnly<{[string]: true}>;
23
+
24
24
  function createAnimatedStyle(
25
25
  inputStyle: {[string]: mixed},
26
+ allowlist: ?AnimatedStyleAllowlist,
26
27
  keepUnanimatedValues: boolean,
27
- ): [$ReadOnlyArray<string>, $ReadOnlyArray<AnimatedNode>, Object] {
28
+ ): [$ReadOnlyArray<string>, $ReadOnlyArray<AnimatedNode>, {[string]: mixed}] {
28
29
  const nodeKeys: Array<string> = [];
29
30
  const nodes: Array<AnimatedNode> = [];
30
- const style: {[string]: any} = {};
31
+ const style: {[string]: mixed} = {};
31
32
 
32
33
  const keys = Object.keys(inputStyle);
33
34
  for (let ii = 0, length = keys.length; ii < length; ii++) {
34
35
  const key = keys[ii];
35
36
  const value = inputStyle[key];
36
37
 
37
- if (value != null && key === 'transform') {
38
- const node = ReactNativeFeatureFlags.shouldUseAnimatedObjectForTransform()
39
- ? AnimatedObject.from(value)
40
- : // $FlowFixMe[incompatible-call] - `value` is mixed.
41
- new AnimatedTransform(value);
38
+ if (allowlist == null || Object.hasOwn(allowlist, key)) {
39
+ let node;
40
+ if (value != null && key === 'transform') {
41
+ node = ReactNativeFeatureFlags.shouldUseAnimatedObjectForTransform()
42
+ ? AnimatedObject.from(value)
43
+ : // $FlowFixMe[incompatible-call] - `value` is mixed.
44
+ AnimatedTransform.from(value);
45
+ } else if (value instanceof AnimatedNode) {
46
+ node = value;
47
+ } else {
48
+ node = AnimatedObject.from(value);
49
+ }
42
50
  if (node == null) {
43
51
  if (keepUnanimatedValues) {
44
52
  style[key] = value;
@@ -48,21 +56,21 @@ function createAnimatedStyle(
48
56
  nodes.push(node);
49
57
  style[key] = node;
50
58
  }
51
- } else if (value instanceof AnimatedNode) {
52
- const node = value;
53
- nodeKeys.push(key);
54
- nodes.push(node);
55
- style[key] = value;
56
59
  } else {
57
- const node = AnimatedObject.from(value);
58
- if (node == null) {
59
- if (keepUnanimatedValues) {
60
- style[key] = value;
60
+ if (__DEV__) {
61
+ // WARNING: This is a potentially expensive check that we should only
62
+ // do in development. Without this check in development, it might be
63
+ // difficult to identify which styles need to be allowlisted.
64
+ if (AnimatedObject.from(inputStyle[key]) != null) {
65
+ console.error(
66
+ `AnimatedStyle: ${key} is not allowlisted for animation, but it ` +
67
+ 'contains AnimatedNode values; styles allowing animation: ',
68
+ allowlist,
69
+ );
61
70
  }
62
- } else {
63
- nodeKeys.push(key);
64
- nodes.push(node);
65
- style[key] = node;
71
+ }
72
+ if (keepUnanimatedValues) {
73
+ style[key] = value;
66
74
  }
67
75
  }
68
76
  }
@@ -71,34 +79,54 @@ function createAnimatedStyle(
71
79
  }
72
80
 
73
81
  export default class AnimatedStyle extends AnimatedWithChildren {
82
+ #inputStyle: any;
74
83
  #nodeKeys: $ReadOnlyArray<string>;
75
84
  #nodes: $ReadOnlyArray<AnimatedNode>;
76
-
77
- _inputStyle: any;
78
- _style: {[string]: any};
79
-
80
- constructor(inputStyle: any) {
81
- super();
82
- this._inputStyle = inputStyle;
85
+ #style: {[string]: mixed};
86
+
87
+ /**
88
+ * Creates an `AnimatedStyle` if `value` contains `AnimatedNode` instances.
89
+ * Otherwise, returns `null`.
90
+ */
91
+ static from(
92
+ inputStyle: any,
93
+ allowlist: ?AnimatedStyleAllowlist,
94
+ ): ?AnimatedStyle {
95
+ const flatStyle = flattenStyle(inputStyle);
96
+ if (flatStyle == null) {
97
+ return null;
98
+ }
83
99
  const [nodeKeys, nodes, style] = createAnimatedStyle(
84
- // NOTE: This null check should not be necessary, but the types are not
85
- // strong nor enforced as of this writing. This check should be hoisted
86
- // to instantiation sites.
87
- flattenStyle(inputStyle) ?? {},
100
+ flatStyle,
101
+ allowlist,
88
102
  Platform.OS !== 'web',
89
103
  );
104
+ if (nodes.length === 0) {
105
+ return null;
106
+ }
107
+ return new AnimatedStyle(nodeKeys, nodes, style, inputStyle);
108
+ }
109
+
110
+ constructor(
111
+ nodeKeys: $ReadOnlyArray<string>,
112
+ nodes: $ReadOnlyArray<AnimatedNode>,
113
+ style: {[string]: mixed},
114
+ inputStyle: any,
115
+ ) {
116
+ super();
90
117
  this.#nodeKeys = nodeKeys;
91
118
  this.#nodes = nodes;
92
- this._style = style;
119
+ this.#style = style;
120
+ this.#inputStyle = inputStyle;
93
121
  }
94
122
 
95
123
  __getValue(): Object | Array<Object> {
96
- const style: {[string]: any} = {};
124
+ const style: {[string]: mixed} = {};
97
125
 
98
- const keys = Object.keys(this._style);
126
+ const keys = Object.keys(this.#style);
99
127
  for (let ii = 0, length = keys.length; ii < length; ii++) {
100
128
  const key = keys[ii];
101
- const value = this._style[key];
129
+ const value = this.#style[key];
102
130
 
103
131
  if (value instanceof AnimatedNode) {
104
132
  style[key] = value.__getValue();
@@ -107,11 +135,52 @@ export default class AnimatedStyle extends AnimatedWithChildren {
107
135
  }
108
136
  }
109
137
 
110
- return Platform.OS === 'web' ? [this._inputStyle, style] : style;
138
+ /* $FlowFixMe[incompatible-type] Error found due to incomplete typing of
139
+ * Platform.flow.js */
140
+ return Platform.OS === 'web' ? [this.#inputStyle, style] : style;
141
+ }
142
+
143
+ /**
144
+ * Creates a new `style` object that contains the same style properties as
145
+ * the supplied `staticStyle` object, except with animated nodes for any
146
+ * style properties that were created by this `AnimatedStyle` instance.
147
+ */
148
+ __getValueWithStaticStyle(staticStyle: Object): Object | Array<Object> {
149
+ const flatStaticStyle = flattenStyle(staticStyle);
150
+ const style: {[string]: mixed} =
151
+ flatStaticStyle == null
152
+ ? {}
153
+ : flatStaticStyle === staticStyle
154
+ ? // Copy the input style, since we'll mutate it below.
155
+ {...flatStaticStyle}
156
+ : // Reuse `flatStaticStyle` if it is a newly created object.
157
+ flatStaticStyle;
158
+
159
+ const keys = Object.keys(style);
160
+ for (let ii = 0, length = keys.length; ii < length; ii++) {
161
+ const key = keys[ii];
162
+ const maybeNode = this.#style[key];
163
+
164
+ if (key === 'transform' && maybeNode instanceof AnimatedTransform) {
165
+ style[key] = maybeNode.__getValueWithStaticTransforms(
166
+ // NOTE: This check should not be necessary, but the types are not
167
+ // enforced as of this writing.
168
+ Array.isArray(style[key]) ? style[key] : [],
169
+ );
170
+ } else if (maybeNode instanceof AnimatedObject) {
171
+ style[key] = maybeNode.__getValueWithStaticObject(style[key]);
172
+ } else if (maybeNode instanceof AnimatedNode) {
173
+ style[key] = maybeNode.__getValue();
174
+ }
175
+ }
176
+
177
+ /* $FlowFixMe[incompatible-type] Error found due to incomplete typing of
178
+ * Platform.flow.js */
179
+ return Platform.OS === 'web' ? [this.#inputStyle, style] : style;
111
180
  }
112
181
 
113
182
  __getAnimatedValue(): Object {
114
- const style: {[string]: any} = {};
183
+ const style: {[string]: mixed} = {};
115
184
 
116
185
  const nodeKeys = this.#nodeKeys;
117
186
  const nodes = this.#nodes;
@@ -12,8 +12,8 @@
12
12
 
13
13
  import type {PlatformConfig} from '../AnimatedPlatformConfig';
14
14
 
15
- import {validateTransform} from '../../../src/private/animated/NativeAnimatedValidation';
16
15
  import NativeAnimatedHelper from '../../../src/private/animated/NativeAnimatedHelper';
16
+ import {validateTransform} from '../../../src/private/animated/NativeAnimatedValidation';
17
17
  import AnimatedNode from './AnimatedNode';
18
18
  import AnimatedWithChildren from './AnimatedWithChildren';
19
19
 
@@ -26,37 +26,58 @@ type Transform<T = AnimatedNode> = {
26
26
  | {[string]: number | string | T},
27
27
  };
28
28
 
29
+ function flatAnimatedNodes(
30
+ transforms: $ReadOnlyArray<Transform<>>,
31
+ ): Array<AnimatedNode> {
32
+ const nodes = [];
33
+ for (let ii = 0, length = transforms.length; ii < length; ii++) {
34
+ const transform = transforms[ii];
35
+ // There should be exactly one property in `transform`.
36
+ for (const key in transform) {
37
+ const value = transform[key];
38
+ if (value instanceof AnimatedNode) {
39
+ nodes.push(value);
40
+ }
41
+ }
42
+ }
43
+ return nodes;
44
+ }
45
+
29
46
  export default class AnimatedTransform extends AnimatedWithChildren {
30
47
  // NOTE: For potentially historical reasons, some operations only operate on
31
48
  // the first level of AnimatedNode instances. This optimizes that bevavior.
32
- #shallowNodes: $ReadOnlyArray<AnimatedNode>;
49
+ #nodes: $ReadOnlyArray<AnimatedNode>;
33
50
 
34
51
  _transforms: $ReadOnlyArray<Transform<>>;
35
52
 
36
- constructor(transforms: $ReadOnlyArray<Transform<>>) {
53
+ /**
54
+ * Creates an `AnimatedTransform` if `transforms` contains `AnimatedNode`
55
+ * instances. Otherwise, returns `null`.
56
+ */
57
+ static from(transforms: $ReadOnlyArray<Transform<>>): ?AnimatedTransform {
58
+ const nodes = flatAnimatedNodes(
59
+ // NOTE: This check should not be necessary, but the types are not
60
+ // enforced as of this writing. This check should be hoisted to
61
+ // instantiation sites.
62
+ Array.isArray(transforms) ? transforms : [],
63
+ );
64
+ if (nodes.length === 0) {
65
+ return null;
66
+ }
67
+ return new AnimatedTransform(nodes, transforms);
68
+ }
69
+
70
+ constructor(
71
+ nodes: $ReadOnlyArray<AnimatedNode>,
72
+ transforms: $ReadOnlyArray<Transform<>>,
73
+ ) {
37
74
  super();
75
+ this.#nodes = nodes;
38
76
  this._transforms = transforms;
39
-
40
- const shallowNodes = [];
41
- // NOTE: This check should not be necessary, but the types are not enforced
42
- // as of this writing. This check should be hoisted to instantiation sites.
43
- if (Array.isArray(transforms)) {
44
- for (let ii = 0, length = transforms.length; ii < length; ii++) {
45
- const transform = transforms[ii];
46
- // There should be exactly one property in `transform`.
47
- for (const key in transform) {
48
- const value = transform[key];
49
- if (value instanceof AnimatedNode) {
50
- shallowNodes.push(value);
51
- }
52
- }
53
- }
54
- }
55
- this.#shallowNodes = shallowNodes;
56
77
  }
57
78
 
58
79
  __makeNative(platformConfig: ?PlatformConfig) {
59
- const nodes = this.#shallowNodes;
80
+ const nodes = this.#nodes;
60
81
  for (let ii = 0, length = nodes.length; ii < length; ii++) {
61
82
  const node = nodes[ii];
62
83
  node.__makeNative(platformConfig);
@@ -70,6 +91,18 @@ export default class AnimatedTransform extends AnimatedWithChildren {
70
91
  );
71
92
  }
72
93
 
94
+ __getValueWithStaticTransforms(
95
+ staticTransforms: $ReadOnlyArray<Object>,
96
+ ): $ReadOnlyArray<Object> {
97
+ const values = [];
98
+ mapTransforms(this._transforms, node => {
99
+ values.push(node.__getValue());
100
+ });
101
+ // NOTE: We can depend on `this._transforms` and `staticTransforms` sharing
102
+ // a structure because of `useAnimatedPropsMemo`.
103
+ return mapTransforms(staticTransforms, () => values.shift());
104
+ }
105
+
73
106
  __getAnimatedValue(): $ReadOnlyArray<Transform<any>> {
74
107
  return mapTransforms(this._transforms, animatedNode =>
75
108
  animatedNode.__getAnimatedValue(),
@@ -77,7 +110,7 @@ export default class AnimatedTransform extends AnimatedWithChildren {
77
110
  }
78
111
 
79
112
  __attach(): void {
80
- const nodes = this.#shallowNodes;
113
+ const nodes = this.#nodes;
81
114
  for (let ii = 0, length = nodes.length; ii < length; ii++) {
82
115
  const node = nodes[ii];
83
116
  node.__addChild(this);
@@ -85,7 +118,7 @@ export default class AnimatedTransform extends AnimatedWithChildren {
85
118
  }
86
119
 
87
120
  __detach(): void {
88
- const nodes = this.#shallowNodes;
121
+ const nodes = this.#nodes;
89
122
  for (let ii = 0, length = nodes.length; ii < length; ii++) {
90
123
  const node = nodes[ii];
91
124
  node.__removeChild(this);
@@ -15,8 +15,8 @@ import type {InterpolationConfigType} from './AnimatedInterpolation';
15
15
  import type AnimatedNode from './AnimatedNode';
16
16
  import type AnimatedTracking from './AnimatedTracking';
17
17
 
18
- import InteractionManager from '../../Interaction/InteractionManager';
19
18
  import NativeAnimatedHelper from '../../../src/private/animated/NativeAnimatedHelper';
19
+ import InteractionManager from '../../Interaction/InteractionManager';
20
20
  import AnimatedInterpolation from './AnimatedInterpolation';
21
21
  import AnimatedWithChildren from './AnimatedWithChildren';
22
22
 
@@ -28,12 +28,10 @@ export default class AnimatedWithChildren extends AnimatedNode {
28
28
  const children = this._children;
29
29
  let length = children.length;
30
30
  if (length > 0) {
31
- const nativeTag = this.__getNativeTag();
32
-
33
31
  for (let ii = 0; ii < length; ii++) {
34
32
  const child = children[ii];
35
33
  child.__makeNative(platformConfig);
36
- connectAnimatedNodes(nativeTag, child.__getNativeTag());
34
+ connectAnimatedNodes(this.__getNativeTag(), child.__getNativeTag());
37
35
  }
38
36
  }
39
37
  }
@@ -8,21 +8,22 @@
8
8
  * @format
9
9
  */
10
10
 
11
- 'use strict';
12
-
13
11
  import type {EventSubscription} from '../EventEmitter/NativeEventEmitter';
12
+ import type {AnimatedPropsAllowlist} from './nodes/AnimatedProps';
14
13
 
14
+ import NativeAnimatedHelper from '../../src/private/animated/NativeAnimatedHelper';
15
+ import {useAnimatedPropsMemo} from '../../src/private/animated/useAnimatedPropsMemo';
15
16
  import * as ReactNativeFeatureFlags from '../../src/private/featureflags/ReactNativeFeatureFlags';
16
17
  import {isPublicInstance as isFabricPublicInstance} from '../ReactNative/ReactFabricPublicInstance/ReactFabricPublicInstanceUtils';
17
18
  import useRefEffect from '../Utilities/useRefEffect';
18
19
  import {AnimatedEvent} from './AnimatedEvent';
19
- import NativeAnimatedHelper from '../../src/private/animated/NativeAnimatedHelper';
20
20
  import AnimatedNode from './nodes/AnimatedNode';
21
21
  import AnimatedProps from './nodes/AnimatedProps';
22
22
  import AnimatedValue from './nodes/AnimatedValue';
23
23
  import {
24
24
  useCallback,
25
25
  useEffect,
26
+ useInsertionEffect,
26
27
  useLayoutEffect,
27
28
  useMemo,
28
29
  useReducer,
@@ -36,34 +37,46 @@ type ReducedProps<TProps> = {
36
37
  };
37
38
  type CallbackRef<T> = T => mixed;
38
39
 
40
+ type UpdateCallback = () => void;
41
+
39
42
  type AnimatedValueListeners = Array<{
40
43
  propValue: AnimatedValue,
41
44
  listenerId: string,
42
45
  }>;
43
46
 
47
+ const useMemoOrAnimatedPropsMemo =
48
+ ReactNativeFeatureFlags.enableAnimatedPropsMemo()
49
+ ? useAnimatedPropsMemo
50
+ : useMemo;
51
+
44
52
  export default function useAnimatedProps<TProps: {...}, TInstance>(
45
53
  props: TProps,
54
+ allowlist?: ?AnimatedPropsAllowlist,
46
55
  ): [ReducedProps<TProps>, CallbackRef<TInstance | null>] {
47
56
  const [, scheduleUpdate] = useReducer<number, void>(count => count + 1, 0);
48
- const onUpdateRef = useRef<?() => void>(null);
57
+ const onUpdateRef = useRef<UpdateCallback | null>(null);
49
58
  const timerRef = useRef<TimeoutID | null>(null);
50
59
 
51
- // TODO: Only invalidate `node` if animated props or `style` change. In the
52
- // previous implementation, we permitted `style` to override props with the
53
- // same name property name as styles, so we can probably continue doing that.
54
- // The ordering of other props *should* not matter.
55
- const node = useMemo(
56
- () => new AnimatedProps(props, () => onUpdateRef.current?.()),
57
- [props],
60
+ const allowlistIfEnabled = ReactNativeFeatureFlags.enableAnimatedAllowlist()
61
+ ? allowlist
62
+ : null;
63
+
64
+ const node = useMemoOrAnimatedPropsMemo(
65
+ () =>
66
+ new AnimatedProps(
67
+ props,
68
+ () => onUpdateRef.current?.(),
69
+ allowlistIfEnabled,
70
+ ),
71
+ [allowlistIfEnabled, props],
58
72
  );
73
+
59
74
  const useNativePropsInFabric =
60
75
  ReactNativeFeatureFlags.shouldUseSetNativePropsInFabric();
61
- const useSetNativePropsInNativeAnimationsInFabric =
62
- ReactNativeFeatureFlags.shouldUseSetNativePropsInNativeAnimationsInFabric();
63
76
 
64
77
  const useAnimatedPropsLifecycle =
65
- ReactNativeFeatureFlags.usePassiveEffectsForAnimations()
66
- ? useAnimatedPropsLifecycle_passiveEffects
78
+ ReactNativeFeatureFlags.useInsertionEffectsForAnimations()
79
+ ? useAnimatedPropsLifecycle_insertionEffects
67
80
  : useAnimatedPropsLifecycle_layoutEffects;
68
81
 
69
82
  useAnimatedPropsLifecycle(node);
@@ -104,12 +117,7 @@ export default function useAnimatedProps<TProps: {...}, TInstance>(
104
117
  if (isFabricNode) {
105
118
  // Call `scheduleUpdate` to synchronise Fiber and Shadow tree.
106
119
  // Must not be called in Paper.
107
- if (useSetNativePropsInNativeAnimationsInFabric) {
108
- // $FlowFixMe[incompatible-use]
109
- instance.setNativeProps(node.__getAnimatedValue());
110
- } else {
111
- scheduleUpdate();
112
- }
120
+ scheduleUpdate();
113
121
  }
114
122
  return;
115
123
  }
@@ -186,23 +194,23 @@ export default function useAnimatedProps<TProps: {...}, TInstance>(
186
194
  }
187
195
  };
188
196
  },
189
- [
190
- node,
191
- useNativePropsInFabric,
192
- useSetNativePropsInNativeAnimationsInFabric,
193
- props,
194
- ],
197
+ [node, useNativePropsInFabric, props],
195
198
  );
196
199
  const callbackRef = useRefEffect<TInstance>(refEffect);
197
200
 
198
- return [reduceAnimatedProps<TProps>(node), callbackRef];
201
+ return [reduceAnimatedProps<TProps>(node, props), callbackRef];
199
202
  }
200
203
 
201
- function reduceAnimatedProps<TProps>(node: AnimatedNode): ReducedProps<TProps> {
204
+ function reduceAnimatedProps<TProps>(
205
+ node: AnimatedProps,
206
+ props: TProps,
207
+ ): ReducedProps<TProps> {
202
208
  // Force `collapsable` to be false so that the native view is not flattened.
203
209
  // Flattened views cannot be accurately referenced by the native driver.
204
210
  return {
205
- ...node.__getValue(),
211
+ ...(ReactNativeFeatureFlags.enableAnimatedPropsMemo()
212
+ ? node.__getValueWithStaticProps(props)
213
+ : node.__getValue()),
206
214
  collapsable: false,
207
215
  };
208
216
  }
@@ -301,10 +309,8 @@ function useAnimatedPropsLifecycle_layoutEffects(node: AnimatedProps): void {
301
309
  * uses reference counting to determine when to recursively detach its children
302
310
  * nodes. So in order to optimize this, we avoid detaching until the next attach
303
311
  * unless we are unmounting.
304
- *
305
- * NOTE: unlike `useAnimatedPropsLifecycle_layoutEffects`, this version uses passive effects to setup animation graph.
306
312
  */
307
- function useAnimatedPropsLifecycle_passiveEffects(node: AnimatedProps): void {
313
+ function useAnimatedPropsLifecycle_insertionEffects(node: AnimatedProps): void {
308
314
  const prevNodeRef = useRef<?AnimatedProps>(null);
309
315
  const isUnmountingRef = useRef<boolean>(false);
310
316
 
@@ -315,14 +321,14 @@ function useAnimatedPropsLifecycle_passiveEffects(node: AnimatedProps): void {
315
321
  NativeAnimatedHelper.API.flushQueue();
316
322
  });
317
323
 
318
- useEffect(() => {
324
+ useInsertionEffect(() => {
319
325
  isUnmountingRef.current = false;
320
326
  return () => {
321
327
  isUnmountingRef.current = true;
322
328
  };
323
329
  }, []);
324
330
 
325
- useEffect(() => {
331
+ useInsertionEffect(() => {
326
332
  node.__attach();
327
333
  let drivenAnimationEndedListener: ?EventSubscription = null;
328
334
 
@@ -7,8 +7,7 @@
7
7
  * @format
8
8
  */
9
9
 
10
- import type * as React from 'react';
11
- import {HostComponent} from '../../../types/public/ReactNativeTypes';
10
+ import {HostInstance} from '../../../types/public/ReactNativeTypes';
12
11
  import {EmitterSubscription} from '../../vendor/emitter/EventEmitter';
13
12
 
14
13
  type AccessibilityChangeEventName =
@@ -17,6 +16,8 @@ type AccessibilityChangeEventName =
17
16
  | 'grayscaleChanged' // iOS-only Event
18
17
  | 'invertColorsChanged' // iOS-only Event
19
18
  | 'reduceMotionChanged'
19
+ | 'highTextContrastChanged' // Android-only Event
20
+ | 'darkerSystemColorsChanged' // iOS-only Event
20
21
  | 'screenReaderChanged'
21
22
  | 'reduceTransparencyChanged'; // iOS-only Event
22
23
 
@@ -69,6 +70,21 @@ export interface AccessibilityInfoStatic {
69
70
  */
70
71
  isReduceMotionEnabled: () => Promise<boolean>;
71
72
 
73
+ /**
74
+ *
75
+ * Query whether high text contrast is currently enabled.
76
+ *
77
+ * @platform android
78
+ */
79
+ isHighTextContrastEnabled: () => Promise<boolean>;
80
+
81
+ /**
82
+ * Query whether darker system colors is currently enabled.
83
+ *
84
+ * @platform ios
85
+ */
86
+ isDarkerSystemColorsEnabled: () => Promise<boolean>;
87
+
72
88
  /**
73
89
  * Query whether reduce motion and prefer cross-fade transitions settings are currently enabled.
74
90
  *
@@ -152,7 +168,7 @@ export interface AccessibilityInfoStatic {
152
168
  */
153
169
  getRecommendedTimeoutMillis: (originalTimeout: number) => Promise<number>;
154
170
  sendAccessibilityEvent: (
155
- handle: React.ElementRef<HostComponent<unknown>>,
171
+ handle: HostInstance,
156
172
  eventType: AccessibilityEventTypes,
157
173
  ) => void;
158
174
  }