react-native 0.72.6 → 0.72.7

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.
@@ -562,10 +562,13 @@ function transformDataType(value: number | string): number | string {
562
562
  if (typeof value !== 'string') {
563
563
  return value;
564
564
  }
565
- if (/deg$/.test(value)) {
565
+
566
+ // Normalize degrees and radians to a number expressed in radians
567
+ if (value.endsWith('deg')) {
566
568
  const degrees = parseFloat(value) || 0;
567
- const radians = (degrees * Math.PI) / 180.0;
568
- return radians;
569
+ return (degrees * Math.PI) / 180.0;
570
+ } else if (value.endsWith('rad')) {
571
+ return parseFloat(value) || 0;
569
572
  } else {
570
573
  return value;
571
574
  }
@@ -96,15 +96,19 @@ Pod::Spec.new do |s|
96
96
  s.dependency "React-utils"
97
97
  s.dependency "React-debug"
98
98
 
99
+ rel_path_from_pods_root_to_app = Pathname.new(ENV['APP_PATH']).relative_path_from(Pod::Config.instance.installation_root)
100
+ rel_path_from_pods_to_app = Pathname.new(ENV['APP_PATH']).relative_path_from(File.join(Pod::Config.instance.installation_root, 'Pods'))
101
+
102
+
99
103
  s.script_phases = {
100
104
  :name => "Generate Legacy Components Interop",
101
105
  :script => "
102
106
  WITH_ENVIRONMENT=\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\"
103
107
  source $WITH_ENVIRONMENT
104
- ${NODE_BINARY} ${REACT_NATIVE_PATH}/scripts/codegen/generate-legacy-interop-components.js -p #{ENV['APP_PATH']} -o ${REACT_NATIVE_PATH}/Libraries/AppDelegate
108
+ ${NODE_BINARY} ${REACT_NATIVE_PATH}/scripts/codegen/generate-legacy-interop-components.js -p #{rel_path_from_pods_to_app} -o ${REACT_NATIVE_PATH}/Libraries/AppDelegate
105
109
  ",
106
110
  :execution_position => :before_compile,
107
- :input_files => ["#{ENV['APP_PATH']}/react-native.config.js"],
111
+ :input_files => ["#{rel_path_from_pods_root_to_app}/react-native.config.js"],
108
112
  :output_files => ["${REACT_NATIVE_PATH}/Libraries/AppDelegate/RCTLegacyInteropComponents.mm"],
109
113
  }
110
114
  end
@@ -12,6 +12,6 @@
12
12
  exports.version = {
13
13
  major: 0,
14
14
  minor: 72,
15
- patch: 6,
15
+ patch: 7,
16
16
  prerelease: null,
17
17
  };
@@ -30,6 +30,7 @@ export type LogData = $ReadOnly<{|
30
30
  message: Message,
31
31
  category: Category,
32
32
  componentStack: ComponentStack,
33
+ stack?: string,
33
34
  |}>;
34
35
 
35
36
  export type Observer = (
@@ -198,7 +199,7 @@ export function addLog(log: LogData): void {
198
199
  // otherwise spammy logs would pause rendering.
199
200
  setImmediate(() => {
200
201
  try {
201
- const stack = parseErrorStack(errorForStackTrace?.stack);
202
+ const stack = parseErrorStack(log.stack ?? errorForStackTrace?.stack);
202
203
 
203
204
  appendNewLog(
204
205
  new LogBoxLog({
@@ -10,6 +10,8 @@
10
10
 
11
11
  import typeof {enable} from 'promise/setimmediate/rejection-tracking';
12
12
 
13
+ import LogBox from './LogBox/LogBox';
14
+
13
15
  type ExtractOptionsType = <P>(((options?: ?P) => void)) => P;
14
16
 
15
17
  let rejectionTrackingOptions: $Call<ExtractOptionsType, enable> = {
@@ -36,17 +38,29 @@ let rejectionTrackingOptions: $Call<ExtractOptionsType, enable> = {
36
38
  }
37
39
  }
38
40
 
39
- const warning =
40
- `Possible Unhandled Promise Rejection (id: ${id}):\n` +
41
- `${message ?? ''}\n` +
42
- (stack == null ? '' : stack);
43
- console.warn(warning);
41
+ const warning = `Possible unhandled promise rejection (id: ${id}):\n${
42
+ message ?? ''
43
+ }`;
44
+ if (__DEV__) {
45
+ LogBox.addLog({
46
+ level: 'warn',
47
+ message: {
48
+ content: warning,
49
+ substitutions: [],
50
+ },
51
+ componentStack: [],
52
+ stack,
53
+ category: 'possible_unhandled_promise_rejection',
54
+ });
55
+ } else {
56
+ console.warn(warning);
57
+ }
44
58
  },
45
59
  onHandled: id => {
46
60
  const warning =
47
- `Promise Rejection Handled (id: ${id})\n` +
61
+ `Promise rejection handled (id: ${id})\n` +
48
62
  'This means you can ignore any previous messages of the form ' +
49
- `"Possible Unhandled Promise Rejection (id: ${id}):"`;
63
+ `"Possible unhandled promise rejection (id: ${id}):"`;
50
64
  console.warn(warning);
51
65
  },
52
66
  };
@@ -23,7 +23,7 @@ NSDictionary* RCTGetReactNativeVersion(void)
23
23
  __rnVersion = @{
24
24
  RCTVersionMajor: @(0),
25
25
  RCTVersionMinor: @(72),
26
- RCTVersionPatch: @(6),
26
+ RCTVersionPatch: @(7),
27
27
  RCTVersionPrerelease: [NSNull null],
28
28
  };
29
29
  });
@@ -1,4 +1,4 @@
1
- VERSION_NAME=0.72.6
1
+ VERSION_NAME=0.72.7
2
2
  GROUP=com.facebook.react
3
3
 
4
4
  # JVM Versions
@@ -17,6 +17,6 @@ public class ReactNativeVersion {
17
17
  public static final Map<String, Object> VERSION = MapBuilder.<String, Object>of(
18
18
  "major", 0,
19
19
  "minor", 72,
20
- "patch", 6,
20
+ "patch", 7,
21
21
  "prerelease", null);
22
22
  }
@@ -25,6 +25,7 @@ import com.facebook.react.modules.blob.BlobModule;
25
25
  import com.facebook.react.modules.blob.FileReaderModule;
26
26
  import com.facebook.react.modules.camera.ImageStoreManager;
27
27
  import com.facebook.react.modules.clipboard.ClipboardModule;
28
+ import com.facebook.react.modules.devloading.DevLoadingModule;
28
29
  import com.facebook.react.modules.devtoolssettings.DevToolsSettingsManagerModule;
29
30
  import com.facebook.react.modules.dialog.DialogModule;
30
31
  import com.facebook.react.modules.fresco.FrescoModule;
@@ -72,6 +73,7 @@ import javax.inject.Provider;
72
73
  AppearanceModule.class,
73
74
  AppStateModule.class,
74
75
  BlobModule.class,
76
+ DevLoadingModule.class,
75
77
  FileReaderModule.class,
76
78
  ClipboardModule.class,
77
79
  DialogModule.class,
@@ -113,6 +115,8 @@ public class MainReactPackage extends TurboReactPackage implements ViewManagerOn
113
115
  return new AppStateModule(context);
114
116
  case BlobModule.NAME:
115
117
  return new BlobModule(context);
118
+ case DevLoadingModule.NAME:
119
+ return new DevLoadingModule(context);
116
120
  case FileReaderModule.NAME:
117
121
  return new FileReaderModule(context);
118
122
  case ClipboardModule.NAME:
@@ -371,6 +375,7 @@ public class MainReactPackage extends TurboReactPackage implements ViewManagerOn
371
375
  AppearanceModule.class,
372
376
  AppStateModule.class,
373
377
  BlobModule.class,
378
+ DevLoadingModule.class,
374
379
  FileReaderModule.class,
375
380
  ClipboardModule.class,
376
381
  DialogModule.class,
@@ -204,6 +204,11 @@ import java.util.Map;
204
204
  mDefaultValue = defaultValue;
205
205
  }
206
206
 
207
+ public ColorPropSetter(ReactPropGroup prop, Method setter, int index, int defaultValue) {
208
+ super(prop, "mixed", setter, index);
209
+ mDefaultValue = defaultValue;
210
+ }
211
+
207
212
  @Override
208
213
  protected Object getValueOrDefault(Object value, Context context) {
209
214
  if (value == null) {
@@ -331,6 +336,10 @@ import java.util.Map;
331
336
  super(prop, "mixed", setter);
332
337
  }
333
338
 
339
+ public BoxedColorPropSetter(ReactPropGroup prop, Method setter, int index) {
340
+ super(prop, "mixed", setter, index);
341
+ }
342
+
334
343
  @Override
335
344
  protected @Nullable Object getValueOrDefault(Object value, Context context) {
336
345
  if (value != null) {
@@ -463,7 +472,11 @@ import java.util.Map;
463
472
  }
464
473
  } else if (propTypeClass == int.class) {
465
474
  for (int i = 0; i < names.length; i++) {
466
- props.put(names[i], new IntPropSetter(annotation, method, i, annotation.defaultInt()));
475
+ if ("Color".equals(annotation.customType())) {
476
+ props.put(names[i], new ColorPropSetter(annotation, method, i, annotation.defaultInt()));
477
+ } else {
478
+ props.put(names[i], new IntPropSetter(annotation, method, i, annotation.defaultInt()));
479
+ }
467
480
  }
468
481
  } else if (propTypeClass == float.class) {
469
482
  for (int i = 0; i < names.length; i++) {
@@ -476,7 +489,11 @@ import java.util.Map;
476
489
  }
477
490
  } else if (propTypeClass == Integer.class) {
478
491
  for (int i = 0; i < names.length; i++) {
479
- props.put(names[i], new BoxedIntPropSetter(annotation, method, i));
492
+ if ("Color".equals(annotation.customType())) {
493
+ props.put(names[i], new BoxedColorPropSetter(annotation, method, i));
494
+ } else {
495
+ props.put(names[i], new BoxedIntPropSetter(annotation, method, i));
496
+ }
480
497
  }
481
498
  } else {
482
499
  throw new RuntimeException(
@@ -17,7 +17,7 @@ namespace facebook::react {
17
17
  constexpr struct {
18
18
  int32_t Major = 0;
19
19
  int32_t Minor = 72;
20
- int32_t Patch = 6;
20
+ int32_t Patch = 7;
21
21
  std::string_view Prerelease = "";
22
22
  } ReactNativeVersion;
23
23
 
@@ -74,19 +74,35 @@ static Class getViewManagerFromComponentName(const std::string &componentName)
74
74
  return nil;
75
75
  }
76
76
 
77
- static std::shared_ptr<void> const constructCoordinator(
78
- ContextContainer::Shared const &contextContainer,
79
- ComponentDescriptor::Flavor const &flavor)
77
+ static Class getViewManagerClass(const std::string &componentName, RCTBridge *bridge)
78
+ {
79
+ Class viewManager = getViewManagerFromComponentName(componentName);
80
+ if (viewManager != nil) {
81
+ return viewManager;
82
+ }
83
+
84
+ // If all the heuristics fail, let's try to retrieve the view manager from the bridge/bridgeProxy
85
+ if (bridge != nil) {
86
+ return [[bridge moduleForName:RCTNSStringFromString(componentName)] class];
87
+ }
88
+
89
+ return nil;
90
+ }
91
+
92
+ static const std::shared_ptr<void> constructCoordinator(
93
+ const ContextContainer::Shared &contextContainer,
94
+ const ComponentDescriptor::Flavor &flavor)
80
95
  {
81
- auto componentName = *std::static_pointer_cast<std::string const>(flavor);
82
- Class viewManagerClass = getViewManagerFromComponentName(componentName);
83
- assert(viewManagerClass);
84
96
  auto optionalBridge = contextContainer->find<std::shared_ptr<void>>("Bridge");
85
97
  RCTBridge *bridge;
86
98
  if (optionalBridge) {
87
99
  bridge = unwrapManagedObjectWeakly(optionalBridge.value());
88
100
  }
89
101
 
102
+ auto componentName = *std::static_pointer_cast<std::string const>(flavor);
103
+ Class viewManagerClass = getViewManagerClass(componentName, bridge);
104
+ assert(viewManagerClass);
105
+
90
106
  auto optionalEventDispatcher = contextContainer->find<std::shared_ptr<void>>("RCTEventDispatcher");
91
107
  RCTEventDispatcher *eventDispatcher;
92
108
  if (optionalEventDispatcher) {
@@ -92,6 +92,10 @@ using namespace facebook::react;
92
92
  if (props.isObject()) {
93
93
  NSDictionary<NSString *, id> *convertedProps = convertFollyDynamicToId(props);
94
94
  [_componentData setProps:convertedProps forView:view];
95
+
96
+ if ([view respondsToSelector:@selector(didSetProps:)]) {
97
+ [view performSelector:@selector(didSetProps:) withObject:[convertedProps allKeys]];
98
+ }
95
99
  }
96
100
  }
97
101
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native",
3
- "version": "0.72.6",
3
+ "version": "0.72.7",
4
4
  "bin": "./cli.js",
5
5
  "description": "A framework for building native apps using React",
6
6
  "license": "MIT",
@@ -79,9 +79,9 @@
79
79
  },
80
80
  "dependencies": {
81
81
  "@jest/create-cache-key-function": "^29.2.1",
82
- "@react-native-community/cli": "11.3.7",
83
- "@react-native-community/cli-platform-android": "11.3.7",
84
- "@react-native-community/cli-platform-ios": "11.3.7",
82
+ "@react-native-community/cli": "11.3.10",
83
+ "@react-native-community/cli-platform-android": "11.3.10",
84
+ "@react-native-community/cli-platform-ios": "11.3.10",
85
85
  "@react-native/assets-registry": "^0.72.0",
86
86
  "@react-native/codegen": "^0.72.7",
87
87
  "@react-native/gradle-plugin": "^0.72.11",
@@ -91,7 +91,7 @@
91
91
  "abort-controller": "^3.0.0",
92
92
  "anser": "^1.4.9",
93
93
  "base64-js": "^1.1.2",
94
- "deprecated-react-native-prop-types": "4.1.0",
94
+ "deprecated-react-native-prop-types": "^4.2.3",
95
95
  "event-target-shim": "^5.0.1",
96
96
  "flow-enums-runtime": "^0.0.5",
97
97
  "invariant": "^2.2.4",
@@ -11,6 +11,7 @@
11
11
 
12
12
  const yargs = require('yargs');
13
13
  const fs = require('fs');
14
+ const p = require('path');
14
15
 
15
16
  const CONFIG_FILE_NAME = 'react-native.config.js';
16
17
  const PROJECT_FIELD = 'project';
@@ -93,7 +94,11 @@ function extractComponentsNames(reactNativeConfig) {
93
94
  }
94
95
 
95
96
  function generateRCTLegacyInteropComponents() {
96
- const configFilePath = `${appRoot}/${CONFIG_FILE_NAME}`;
97
+ const cwd = process.cwd();
98
+ const configFilePath = p.join(cwd, appRoot, CONFIG_FILE_NAME);
99
+ console.log(
100
+ `Looking for a react-native.config.js file at ${configFilePath}...`,
101
+ );
97
102
  let reactNativeConfig = null;
98
103
  try {
99
104
  reactNativeConfig = require(configFilePath);
@@ -107,7 +112,7 @@ function generateRCTLegacyInteropComponents() {
107
112
  console.log('Skip LegacyInterop generation');
108
113
  return;
109
114
  }
110
-
115
+ console.log(`Components found: ${componentNames}`);
111
116
  let componentsArray = componentNames.map(name => `\t\t\t@"${name}",`);
112
117
  // Remove the last comma
113
118
  if (componentsArray.length > 0) {
@@ -118,6 +123,7 @@ function generateRCTLegacyInteropComponents() {
118
123
 
119
124
  const filePath = `${outputPath}/${OUTPUT_FILE_NAME}`;
120
125
  fs.writeFileSync(filePath, fileBody(componentsArray.join('\n')));
126
+ console.log(`${filePath} updated!`);
121
127
  }
122
128
 
123
129
  generateRCTLegacyInteropComponents();
Binary file
Binary file
@@ -11,7 +11,7 @@
11
11
  },
12
12
  "dependencies": {
13
13
  "react": "18.2.0",
14
- "react-native": "0.72.6"
14
+ "react-native": "0.72.7"
15
15
  },
16
16
  "devDependencies": {
17
17
  "@babel/core": "^7.20.0",