react-native-unistyles 3.0.0-alpha.1 → 3.0.0-alpha.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,33 @@
1
+ require "json"
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
+
5
+ Pod::Spec.new do |s|
6
+ s.name = "Unistyles"
7
+ s.version = package["version"]
8
+ s.summary = package["description"]
9
+ s.homepage = package["homepage"]
10
+ s.license = package["license"]
11
+ s.authors = package["author"]
12
+
13
+ s.platforms = { :ios => min_ios_version_supported }
14
+ s.source = { :git => package["repository"], :tag => "#{s.version}" }
15
+
16
+ s.source_files = [
17
+ "ios/**/*.{swift,h,mm}",
18
+ "cxx/**/*.{h,cpp,hpp}"
19
+ ]
20
+ s.pod_target_xcconfig = {
21
+ "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
22
+ "GCC_PREPROCESSOR_DEFINITIONS" => "$(inherited) FOLLY_NO_CONFIG FOLLY_CFG_NO_COROUTINES"
23
+ }
24
+
25
+ s.public_header_files = [
26
+ "ios/Unistyles.h"
27
+ ]
28
+
29
+ load 'nitrogen/generated/ios/Unistyles+autolinking.rb'
30
+ add_nitrogen_files(s)
31
+
32
+ install_modules_dependencies(s)
33
+ end
@@ -7,10 +7,12 @@ using namespace facebook;
7
7
  std::vector<jsi::PropNameID> HostStyle::getPropertyNames(jsi::Runtime& rt) {
8
8
  auto propertyNames = std::vector<jsi::PropNameID> {};
9
9
 
10
+ propertyNames.reserve(8);
11
+
10
12
  for (const auto& pair : this->_styleSheet->unistyles) {
11
13
  propertyNames.emplace_back(jsi::PropNameID::forUtf8(rt, pair.first));
12
14
  }
13
-
15
+
14
16
  return propertyNames;
15
17
  }
16
18
 
@@ -20,7 +22,7 @@ jsi::Value HostStyle::get(jsi::Runtime& rt, const jsi::PropNameID& propNameId) {
20
22
  if (propertyName == helpers::UNISTYLES_ID) {
21
23
  return jsi::Value(this->_styleSheet->tag);
22
24
  }
23
-
25
+
24
26
  if (propertyName == helpers::ADD_VARIANTS_FN) {
25
27
  return this->createAddVariantsProxyFunction(rt);
26
28
  }
@@ -28,7 +30,7 @@ jsi::Value HostStyle::get(jsi::Runtime& rt, const jsi::PropNameID& propNameId) {
28
30
  if (this->_styleSheet->unistyles.contains(propertyName)) {
29
31
  return valueFromUnistyle(rt, this->_styleSheet->unistyles[propertyName]);
30
32
  }
31
-
33
+
32
34
  return jsi::Value::undefined();
33
35
  }
34
36
 
@@ -41,15 +43,15 @@ jsi::Function HostStyle::createAddVariantsProxyFunction(jsi::Runtime& rt) {
41
43
 
42
44
  auto parser = parser::Parser(this->_unistylesRuntime);
43
45
  auto pairs = parser.variantsToPairs(rt, arguments[0].asObject(rt));
44
-
46
+
45
47
  if (pairs == this->_styleSheet->variants) {
46
48
  return jsi::Value::undefined();
47
49
  }
48
-
50
+
49
51
  this->_styleSheet->variants = pairs;
50
-
52
+
51
53
  parser.rebuildUnistylesWithVariants(rt, this->_styleSheet);
52
-
54
+
53
55
  return jsi::Value::undefined();
54
56
  });
55
57
  }
@@ -3,12 +3,9 @@
3
3
  using namespace margelo::nitro::unistyles;
4
4
  using namespace facebook::react;
5
5
 
6
- core::UnistylesCommitHook::UnistylesCommitHook(UIManager& uiManager, std::shared_ptr<HybridUnistylesRuntime> unistylesRuntime)
7
- : _unistylesRuntime{unistylesRuntime} {
8
- uiManager.registerCommitHook(*this);
9
- };
10
-
11
- core::UnistylesCommitHook::~UnistylesCommitHook() noexcept {}
6
+ core::UnistylesCommitHook::~UnistylesCommitHook() noexcept {
7
+ _uiManager->unregisterCommitHook(*this);
8
+ }
12
9
 
13
10
  void core::UnistylesCommitHook::commitHookWasRegistered(const UIManager &uiManager) noexcept {}
14
11
  void core::UnistylesCommitHook::commitHookWasUnregistered(const UIManager &uiManager) noexcept {}
@@ -11,7 +11,11 @@ namespace margelo::nitro::unistyles::core {
11
11
  using namespace facebook::react;
12
12
 
13
13
  struct UnistylesCommitHook : public UIManagerCommitHook {
14
- UnistylesCommitHook(UIManager& uiManager, std::shared_ptr<HybridUnistylesRuntime> unistylesRuntime);
14
+ UnistylesCommitHook(std::shared_ptr<UIManager> uiManager, std::shared_ptr<HybridUnistylesRuntime> unistylesRuntime)
15
+ : _unistylesRuntime{unistylesRuntime}, _uiManager{uiManager} {
16
+ _uiManager->registerCommitHook(*this);
17
+ }
18
+
15
19
  ~UnistylesCommitHook() noexcept override;
16
20
 
17
21
  void commitHookWasRegistered(const UIManager &uiManager) noexcept override;
@@ -22,6 +26,7 @@ struct UnistylesCommitHook : public UIManagerCommitHook {
22
26
 
23
27
  private:
24
28
  std::shared_ptr<HybridUnistylesRuntime> _unistylesRuntime;
29
+ std::shared_ptr<UIManager> _uiManager;
25
30
  };
26
31
 
27
32
  }
@@ -4,6 +4,8 @@ using namespace margelo::nitro::unistyles;
4
4
  using namespace facebook::react;
5
5
 
6
6
  jsi::Value HybridShadowRegistry::link(jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) {
7
+ helpers::assertThat(rt, count == 2, "Invalid babel transform. ShadowRegistry link expected two arguments.");
8
+
7
9
  ShadowNode::Shared shadowNodeWrapper = shadowNodeFromValue(rt, args[0]);
8
10
  core::Unistyle::Shared unistyleWrapper = core::unistyleFromValue(rt, args[1]);
9
11
 
@@ -15,6 +17,8 @@ jsi::Value HybridShadowRegistry::link(jsi::Runtime &rt, const jsi::Value &thisVa
15
17
  }
16
18
 
17
19
  jsi::Value HybridShadowRegistry::unlink(jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) {
20
+ helpers::assertThat(rt, count == 2, "Invalid babel transform. ShadowRegistry unlink expected two arguments.");
21
+
18
22
  ShadowNode::Shared shadowNodeWrapper = shadowNodeFromValue(rt, args[0]);
19
23
  core::Unistyle::Shared unistyleWrapper = core::unistyleFromValue(rt, args[1]);
20
24
 
@@ -14,7 +14,8 @@ double HybridStyleSheet::get___unid() {
14
14
  }
15
15
 
16
16
  jsi::Value HybridStyleSheet::create(jsi::Runtime &rt, const jsi::Value &thisVal, const jsi::Value *arguments, size_t count) {
17
- helpers::assertThat(rt, arguments[0].isObject(), "expected to be called with object or function.");
17
+ helpers::assertThat(rt, count == 1, "StyleSheet.create expected to be called with one argument.");
18
+ helpers::assertThat(rt, arguments[0].isObject(), "StyleSheet.create expected to be called with object or function.");
18
19
 
19
20
  auto thisStyleSheet = thisVal.asObject(rt);
20
21
  auto& registry = core::UnistylesRegistry::get();
@@ -45,7 +46,8 @@ jsi::Value HybridStyleSheet::create(jsi::Runtime &rt, const jsi::Value &thisVal,
45
46
  }
46
47
 
47
48
  jsi::Value HybridStyleSheet::configure(jsi::Runtime &rt, const jsi::Value &thisVal, const jsi::Value *arguments, size_t count) {
48
- helpers::assertThat(rt, arguments[0].isObject(), "expected to be called with object.");
49
+ helpers::assertThat(rt, count == 1, "StyleSheet.configure expected to be called with one argument.");
50
+ helpers::assertThat(rt, arguments[0].isObject(), "StyleSheet.configure expected to be called with object.");
49
51
 
50
52
  // create new state
51
53
  auto config = arguments[0].asObject(rt);
@@ -77,7 +79,6 @@ jsi::Value HybridStyleSheet::configure(jsi::Runtime &rt, const jsi::Value &thisV
77
79
 
78
80
  verifyAndSelectTheme(rt);
79
81
  loadExternalMethods(thisVal, rt);
80
- registerCommitHook(rt);
81
82
 
82
83
  return jsi::Value::undefined();
83
84
  }
@@ -237,9 +238,3 @@ void HybridStyleSheet::onPlatformDependenciesChange(std::vector<UnistyleDependen
237
238
 
238
239
  shadow::ShadowTreeManager::updateShadowTree(rt, shadowLeafUpdates);
239
240
  }
240
-
241
- void HybridStyleSheet::registerCommitHook(jsi::Runtime &rt) {
242
- UIManager& uiManager = const_cast<UIManager&>(UIManagerBinding::getBinding(rt)->getUIManager());
243
-
244
- this->_unistylesCommitHook = std::make_shared<core::UnistylesCommitHook>(uiManager, this->_unistylesRuntime);
245
- }
@@ -16,11 +16,12 @@ using namespace margelo::nitro::unistyles;
16
16
  using namespace facebook::react;
17
17
 
18
18
  struct HybridStyleSheet: public HybridUnistylesStyleSheetSpec {
19
- HybridStyleSheet(std::shared_ptr<HybridUnistylesRuntime> unistylesRuntime)
20
- : HybridObject(TAG), _unistylesRuntime{unistylesRuntime} {
21
- this->_unistylesRuntime->registerPlatformListener(
22
- std::bind(&HybridStyleSheet::onPlatformDependenciesChange, this, std::placeholders::_1)
23
- );
19
+ HybridStyleSheet(std::shared_ptr<HybridUnistylesRuntime> unistylesRuntime, std::shared_ptr<UIManager> uiManager)
20
+ : HybridObject(TAG), _unistylesRuntime{unistylesRuntime} {
21
+ this->_unistylesCommitHook = std::make_shared<core::UnistylesCommitHook>(uiManager, unistylesRuntime);
22
+ this->_unistylesRuntime->registerPlatformListener(
23
+ std::bind(&HybridStyleSheet::onPlatformDependenciesChange, this, std::placeholders::_1)
24
+ );
24
25
  }
25
26
 
26
27
  jsi::Value create(jsi::Runtime& rt,
@@ -52,7 +53,6 @@ private:
52
53
  void setThemeFromColorScheme(jsi::Runtime& rt);
53
54
  void loadExternalMethods(const jsi::Value& thisValue, jsi::Runtime& rt);
54
55
  void onPlatformDependenciesChange(std::vector<UnistyleDependency> dependencies);
55
- void registerCommitHook(jsi::Runtime& rt);
56
56
 
57
57
  double __unid = -1;
58
58
  std::shared_ptr<HybridUnistylesRuntime> _unistylesRuntime;
@@ -45,7 +45,7 @@ Insets HybridUnistylesRuntime::getInsets() {
45
45
 
46
46
  Orientation HybridUnistylesRuntime::getOrientation() {
47
47
  int orientation = this->_nativePlatform.getOrientation();
48
-
48
+
49
49
  return static_cast<Orientation>(orientation);
50
50
  };
51
51
 
@@ -68,14 +68,17 @@ void HybridUnistylesRuntime::setTheme(const std::string &themeName) {
68
68
 
69
69
  void HybridUnistylesRuntime::setAdaptiveThemes(bool isEnabled) {
70
70
  auto& registry = core::UnistylesRegistry::get();
71
-
71
+
72
72
  std::vector<UnistyleDependency> changedDependencies{};
73
+
74
+ changedDependencies.reserve(5);
75
+
73
76
  bool hadAdaptiveThemes = this->getHasAdaptiveThemes();
74
77
 
75
78
  registry.setPrefersAdaptiveThemes(*_rt, isEnabled);
76
-
79
+
77
80
  bool haveAdaptiveThemes = this->getHasAdaptiveThemes();
78
-
81
+
79
82
  if (hadAdaptiveThemes != haveAdaptiveThemes) {
80
83
  changedDependencies.push_back(UnistyleDependency::ADAPTIVETHEMES);
81
84
  }
@@ -83,7 +86,7 @@ void HybridUnistylesRuntime::setAdaptiveThemes(bool isEnabled) {
83
86
  // if user disabled it, or can't have adaptive themes, do nothing
84
87
  if (!this->getHasAdaptiveThemes()) {
85
88
  this->_onDependenciesChange(changedDependencies);
86
-
89
+
87
90
  return;
88
91
  }
89
92
 
@@ -99,16 +102,17 @@ void HybridUnistylesRuntime::setAdaptiveThemes(bool isEnabled) {
99
102
  if (!currentThemeName.has_value() || nextTheme != currentThemeName.value()) {
100
103
  changedDependencies.push_back(UnistyleDependency::THEME);
101
104
  changedDependencies.push_back(UnistyleDependency::THEMENAME);
102
-
105
+
103
106
  state.setTheme(nextTheme);
104
107
  }
105
-
108
+
106
109
  this->_onDependenciesChange(changedDependencies);
107
110
  };
108
111
 
109
112
  jsi::Value HybridUnistylesRuntime::updateTheme(jsi::Runtime &rt, const jsi::Value &thisValue, const jsi::Value *args, size_t count) {
110
- helpers::assertThat(rt, args[0].isString(), "first argument expected to be a string.");
111
- helpers::assertThat(rt, args[1].isObject(), "second argument expected to be a function.");
113
+ helpers::assertThat(rt, count == 2, "UnistylesRuntime.updateTheme expected to be called with 2 arguments.");
114
+ helpers::assertThat(rt, args[0].isString(), "UnistylesRuntime.updateTheme expected first argument to be a string.");
115
+ helpers::assertThat(rt, args[1].isObject(), "UnistylesRuntime.updateTheme expected first argument to be a function.");
112
116
 
113
117
  auto& registry = core::UnistylesRegistry::get();
114
118
  auto themeName = args[0].asString(rt).utf8(rt);
@@ -116,7 +120,7 @@ jsi::Value HybridUnistylesRuntime::updateTheme(jsi::Runtime &rt, const jsi::Valu
116
120
  helpers::assertThat(rt, args[1].asObject(rt).isFunction(rt), "second argument expected to be a function.");
117
121
 
118
122
  registry.updateTheme(rt, themeName, args[1].asObject(rt).asFunction(rt));
119
-
123
+
120
124
  this->_onDependenciesChange({UnistyleDependency::THEME});
121
125
 
122
126
  return jsi::Value::undefined();
@@ -163,7 +167,7 @@ UnistylesCxxMiniRuntime HybridUnistylesRuntime::getMiniRuntime() {
163
167
  nativeMiniRuntime.statusBar,
164
168
  nativeMiniRuntime.navigationBar
165
169
  };
166
-
170
+
167
171
  return cxxMiniRuntime;
168
172
  }
169
173
 
@@ -133,6 +133,8 @@ void parser::Parser::rebuildUnistyle(jsi::Runtime& rt, std::shared_ptr<StyleShee
133
133
  // convert arguments to jsi::Value
134
134
  auto metadata = unistyleFn->dynamicFunctionMetadata.value();
135
135
  std::vector<jsi::Value> args{};
136
+
137
+ args.reserve(3);
136
138
 
137
139
  for (int i = 0; i < metadata.count; i++) {
138
140
  folly::dynamic& arg = metadata.arguments.at(i);
@@ -177,6 +179,8 @@ shadow::ShadowLeafUpdates parser::Parser::dependencyMapToShadowLeafUpdates(Depen
177
179
  // convert jsi::Value arguments to folly::dynamic
178
180
  std::vector<folly::dynamic> parser::Parser::parseDynamicFunctionArguments(jsi::Runtime& rt, size_t count, const jsi::Value* arguments) {
179
181
  std::vector<folly::dynamic> parsedArgument{};
182
+
183
+ parsedArgument.reserve(3);
180
184
 
181
185
  for (size_t i = 0; i < count; i++) {
182
186
  auto& arg = arguments[i];
@@ -369,7 +373,9 @@ jsi::Function parser::Parser::createDynamicFunctionProxy(jsi::Runtime& rt, Unist
369
373
  std::vector<UnistyleDependency> parser::Parser::parseDependencies(jsi::Runtime &rt, jsi::Object&& dependencies) {
370
374
  helpers::assertThat(rt, dependencies.isArray(rt), "babel transform is invalid. Unexpected type for dependencies. Please report new Github issue.");
371
375
 
372
- std::vector<UnistyleDependency> parsedDependencies;
376
+ std::vector<UnistyleDependency> parsedDependencies{};
377
+
378
+ parsedDependencies.reserve(5);
373
379
 
374
380
  helpers::iterateJSIArray(rt, dependencies.asArray(rt), [&](size_t i, jsi::Value& value){
375
381
  auto dependency = static_cast<UnistyleDependency>(value.asNumber());
@@ -387,6 +393,8 @@ jsi::Value parser::Parser::parseTransforms(jsi::Runtime& rt, Unistyle::Shared un
387
393
  }
388
394
 
389
395
  std::vector<jsi::Value> parsedTransforms{};
396
+
397
+ parsedTransforms.reserve(2);
390
398
 
391
399
  helpers::iterateJSIArray(rt, obj.asArray(rt), [&](size_t i, jsi::Value& value){
392
400
  if (!value.isObject()) {
@@ -3,6 +3,8 @@
3
3
  #import <React/RCTEventEmitter.h>
4
4
  #import <ReactCommon/RCTTurboModuleWithJSIBindings.h>
5
5
  #import "TurboUnistyles/TurboUnistyles.h"
6
+ #import <React/RCTSurfacePresenter.h>
7
+ #import <React/RCTScheduler.h>
6
8
 
7
9
  @interface UnistylesModule: RCTEventEmitter<NativeTurboUnistylesSpec>
8
10
  @end
@@ -10,10 +10,16 @@ using namespace margelo::nitro;
10
10
 
11
11
  RCT_EXPORT_MODULE(Unistyles)
12
12
 
13
+ __weak RCTSurfacePresenter* _surfacePresenter;
14
+
13
15
  + (BOOL)requiresMainQueueSetup {
14
16
  return YES;
15
17
  }
16
18
 
19
+ - (void)setSurfacePresenter:(id<RCTSurfacePresenterStub>)surfacePresenter {
20
+ _surfacePresenter = surfacePresenter;
21
+ }
22
+
17
23
  - (void)installJSIBindingsWithRuntime:(jsi::Runtime&)rt {
18
24
  // function is called on: first init and every live reload
19
25
  // check if this is live reload, if so let's replace UnistylesRuntime with new runtime
@@ -31,7 +37,8 @@ RCT_EXPORT_MODULE(Unistyles)
31
37
  - (void)createHybrids:(jsi::Runtime&)rt {
32
38
  auto nativePlatform = Unistyles::NativePlatform::create();
33
39
  auto unistylesRuntime = std::make_shared<HybridUnistylesRuntime>(nativePlatform, rt);
34
- auto styleSheet = std::make_shared<HybridStyleSheet>(unistylesRuntime);
40
+ auto uiManager = [_surfacePresenter scheduler].uiManager;
41
+ auto styleSheet = std::make_shared<HybridStyleSheet>(unistylesRuntime, uiManager);
35
42
 
36
43
  HybridObjectRegistry::registerHybridObjectConstructor("UnistylesRuntime", [unistylesRuntime]() -> std::shared_ptr<HybridObject>{
37
44
  return unistylesRuntime;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-unistyles",
3
- "version": "3.0.0-alpha.1",
3
+ "version": "3.0.0-alpha.3",
4
4
  "description": "Level up your React Native StyleSheet",
5
5
  "scripts": {
6
6
  "test": "jest",
@@ -26,7 +26,7 @@
26
26
  "plugin",
27
27
  "web",
28
28
  "react-native.config.js",
29
- "react-native-unistyles.podspec",
29
+ "Unistyles.podspec",
30
30
  "!lib/typescript/examples",
31
31
  "!ios/build",
32
32
  "!android/build",