react-native-unistyles 3.0.0-alpha.2 → 3.0.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/Unistyles.podspec CHANGED
@@ -10,7 +10,7 @@ Pod::Spec.new do |s|
10
10
  s.license = package["license"]
11
11
  s.authors = package["author"]
12
12
 
13
- s.platforms = { :ios => min_ios_version_supported, :osx => "10.14", :tvos => "9.0", :visionos => "1.0" }
13
+ s.platforms = { :ios => min_ios_version_supported }
14
14
  s.source = { :git => package["repository"], :tag => "#{s.version}" }
15
15
 
16
16
  s.source_files = [
@@ -18,7 +18,8 @@ Pod::Spec.new do |s|
18
18
  "cxx/**/*.{h,cpp,hpp}"
19
19
  ]
20
20
  s.pod_target_xcconfig = {
21
- "CLANG_CXX_LANGUAGE_STANDARD" => "c++20"
21
+ "CLANG_CXX_LANGUAGE_STANDARD" => "c++20",
22
+ "GCC_PREPROCESSOR_DEFINITIONS" => "$(inherited) FOLLY_NO_CONFIG FOLLY_CFG_NO_COROUTINES"
22
23
  }
23
24
 
24
25
  s.public_header_files = [
@@ -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
 
@@ -36,20 +38,20 @@ jsi::Function HostStyle::createAddVariantsProxyFunction(jsi::Runtime& rt) {
36
38
  auto useVariantsFnName = jsi::PropNameID::forUtf8(rt, helpers::ADD_VARIANTS_FN);
37
39
 
38
40
  return jsi::Function::createFromHostFunction(rt, useVariantsFnName, 1, [&](jsi::Runtime &rt, const jsi::Value &thisVal, const jsi::Value *arguments, size_t count){
39
- helpers::assertThat(rt, count == 1, "useVariants expected to be called with one argument.");
40
- helpers::assertThat(rt, arguments[0].isObject(), "useVariants expected to be called with object.");
41
+ helpers::assertThat(rt, count == 1, "Unistyles: useVariants expected to be called with one argument.");
42
+ helpers::assertThat(rt, arguments[0].isObject(), "Unistyles: useVariants expected to be called with object.");
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
  }
@@ -17,7 +17,7 @@ std::shared_ptr<StyleSheet> StyleSheetRegistry::addStyleSheetFromValue(jsi::Runt
17
17
  std::shared_ptr<StyleSheet> StyleSheetRegistry::addFromFunction(jsi::Runtime& rt, unsigned int tag, jsi::Function styleSheetFn) {
18
18
  auto numberOfArgs = styleSheetFn.getProperty(rt, "length").getNumber();
19
19
 
20
- helpers::assertThat(rt, numberOfArgs <= 2, "expected up to 2 arguments.");
20
+ helpers::assertThat(rt, numberOfArgs <= 2, "StyleSheet.create expected up to 2 arguments.");
21
21
 
22
22
  auto& registry = UnistylesRegistry::get();
23
23
 
@@ -43,3 +43,8 @@ std::shared_ptr<StyleSheet> StyleSheetRegistry::addFromObject(jsi::Runtime& rt,
43
43
  return registry.addStyleSheet(tag, core::StyleSheetType::Static, std::move(rawStyleSheet));
44
44
  }
45
45
 
46
+ void StyleSheetRegistry::removeStyleSheetByTag(unsigned int tag) {
47
+ auto& registry = UnistylesRegistry::get();
48
+
49
+ registry.removeStyleSheet(tag);
50
+ }
@@ -17,7 +17,8 @@ struct StyleSheetRegistry {
17
17
  StyleSheetRegistry(StyleSheetRegistry&&) = delete;
18
18
 
19
19
  virtual std::shared_ptr<StyleSheet> addStyleSheetFromValue(jsi::Runtime& rt, jsi::Object rawStyleSheet);
20
-
20
+ virtual void removeStyleSheetByTag(unsigned int tag);
21
+
21
22
  private:
22
23
  virtual std::shared_ptr<StyleSheet> addFromFunction(jsi::Runtime& rt, unsigned int tag, jsi::Function styleSheetFn);
23
24
  virtual std::shared_ptr<StyleSheet> addFromObject(jsi::Runtime& rt, unsigned int tag, jsi::Object rawStyleSheet);
@@ -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
  }
@@ -63,15 +63,15 @@ void core::UnistylesRegistry::updateTheme(jsi::Runtime& rt, std::string& themeNa
63
63
  auto& state = this->getState(rt);
64
64
  auto it = state._jsThemes.find(themeName);
65
65
 
66
- helpers::assertThat(rt, it != state._jsThemes.end(), "you're trying to update theme '" + themeName + "' but it wasn't registered.");
66
+ helpers::assertThat(rt, it != state._jsThemes.end(), "Unistyles: You're trying to update theme '" + themeName + "' but it wasn't registered.");
67
67
 
68
68
  auto currentThemeValue = it->second.lock(rt);
69
69
 
70
- helpers::assertThat(rt, currentThemeValue.isObject(), "unable to update your theme from C++. It was already garbage collected.");
70
+ helpers::assertThat(rt, currentThemeValue.isObject(), "Unistyles: Unable to update your theme from C++. It was already garbage collected.");
71
71
 
72
72
  auto result = callback.call(rt, currentThemeValue.asObject(rt));
73
73
 
74
- helpers::assertThat(rt, result.isObject(), "returned theme is not an object. Please check your updateTheme function.");
74
+ helpers::assertThat(rt, result.isObject(), "Unistyles: Returned theme is not an object. Please check your updateTheme function.");
75
75
 
76
76
  it->second = jsi::WeakObject(rt, result.asObject(rt));
77
77
  }
@@ -99,7 +99,7 @@ std::shared_ptr<core::StyleSheet> core::UnistylesRegistry::addStyleSheet(int tag
99
99
  return this->_styleSheetRegistry.back();
100
100
  }
101
101
 
102
- std::shared_ptr<core::StyleSheet> core::UnistylesRegistry::getStyleSheetById(int tag) {
102
+ void core::UnistylesRegistry::removeStyleSheet(int tag) {
103
103
  auto it = std::find_if(
104
104
  this->_styleSheetRegistry.begin(),
105
105
  this->_styleSheetRegistry.end(),
@@ -111,8 +111,8 @@ std::shared_ptr<core::StyleSheet> core::UnistylesRegistry::getStyleSheetById(int
111
111
  if (it == this->_styleSheetRegistry.cend()) {
112
112
  throw std::runtime_error("stylesheet with tag: " + std::to_string(tag) + " cannot be found.");
113
113
  }
114
-
115
- return *it;
114
+
115
+ this->_styleSheetRegistry.erase(it);
116
116
  }
117
117
 
118
118
  DependencyMap core::UnistylesRegistry::buildDependencyMap(std::vector<UnistyleDependency>& deps) {
@@ -38,7 +38,7 @@ struct UnistylesRegistry: public StyleSheetRegistry {
38
38
  void linkShadowNodeWithUnistyle(const ShadowNodeFamily*, const core::Unistyle::Shared);
39
39
  void unlinkShadowNodeWithUnistyle(const ShadowNodeFamily*, const core::Unistyle::Shared);
40
40
  std::shared_ptr<core::StyleSheet> addStyleSheet(int tag, core::StyleSheetType type, jsi::Object&& rawValue);
41
- std::shared_ptr<core::StyleSheet> getStyleSheetById(int tag);
41
+ void removeStyleSheet(int tag);
42
42
  DependencyMap buildDependencyMap(std::vector<UnistyleDependency>& deps);
43
43
  DependencyMap buildDependencyMap();
44
44
 
@@ -12,7 +12,7 @@ bool core::UnistylesState::hasAdaptiveThemes() {
12
12
  }
13
13
 
14
14
  void core::UnistylesState::setTheme(std::string themeName) {
15
- helpers::assertThat(*_rt, helpers::vecContainsKeys(this->_registeredThemeNames, {themeName}), "You're trying to set theme to: '" + std::string(themeName) + "', but it wasn't registered.");
15
+ helpers::assertThat(*_rt, helpers::vecContainsKeys(this->_registeredThemeNames, {themeName}), "Unistyles: You're trying to set theme to: '" + std::string(themeName) + "', but it wasn't registered.");
16
16
 
17
17
  if (themeName != this->_currentThemeName) {
18
18
  this->_currentThemeName = themeName;
@@ -31,15 +31,15 @@ jsi::Object core::UnistylesState::getJSTheme() {
31
31
  return jsi::Object(*_rt);
32
32
  }
33
33
 
34
- helpers::assertThat(*_rt, _currentThemeName.has_value(), "one of your stylesheets is trying to get the theme, but no theme has been selected yet. Did you forget to select an initial theme?");
34
+ helpers::assertThat(*_rt, _currentThemeName.has_value(), "Unistyles: One of your stylesheets is trying to get the theme, but no theme has been selected yet. Did you forget to select an initial theme?");
35
35
 
36
36
  auto it = this->_jsThemes.find(_currentThemeName.value());
37
37
 
38
- helpers::assertThat(*_rt, it != this->_jsThemes.end(), "you're trying to get theme '" + _currentThemeName.value() + "', but it was not registered. Did you forget to register it with StyleSheet.configure?");
38
+ helpers::assertThat(*_rt, it != this->_jsThemes.end(), "Unistyles: You're trying to get theme '" + _currentThemeName.value() + "', but it was not registered. Did you forget to register it with StyleSheet.configure?");
39
39
 
40
40
  auto maybeTheme = it->second.lock(*_rt);
41
41
 
42
- helpers::assertThat(*_rt, maybeTheme.isObject(), "unable to retrieve your theme from C++ as it has already been garbage collected, likely due to multiple hot reloads. Please live reload the app.");
42
+ helpers::assertThat(*_rt, maybeTheme.isObject(), "Unistyles: Unable to retrieve your theme from C++ as it has already been garbage collected, likely due to multiple hot reloads. Please live reload the app.");
43
43
 
44
44
  return maybeTheme.asObject(*_rt);
45
45
  }
@@ -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, "Unistyles: 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, "Unistyles: 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,18 +14,15 @@ 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();
21
22
 
22
23
  // this might happen only when hot reloading
23
24
  if (this->__unid != -1) {
24
- auto registeredStyleSheet = registry.getStyleSheetById(this->__unid);
25
- auto style = std::make_shared<core::HostStyle>(registeredStyleSheet, this->_unistylesRuntime);
26
- auto styleHostObject = jsi::Object::createFromHostObject(rt, style);
27
-
28
- return styleHostObject;
25
+ registry.removeStyleSheet(this->__unid);
29
26
  }
30
27
 
31
28
  jsi::Object rawStyleSheet = arguments[0].asObject(rt);
@@ -45,7 +42,8 @@ jsi::Value HybridStyleSheet::create(jsi::Runtime &rt, const jsi::Value &thisVal,
45
42
  }
46
43
 
47
44
  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.");
45
+ helpers::assertThat(rt, count == 1, "StyleSheet.configure expected to be called with one argument.");
46
+ helpers::assertThat(rt, arguments[0].isObject(), "StyleSheet.configure expected to be called with object.");
49
47
 
50
48
  // create new state
51
49
  auto config = arguments[0].asObject(rt);
@@ -55,29 +53,28 @@ jsi::Value HybridStyleSheet::configure(jsi::Runtime &rt, const jsi::Value &thisV
55
53
 
56
54
  helpers::enumerateJSIObject(rt, config, [&](const std::string& propertyName, jsi::Value& propertyValue){
57
55
  if (propertyName == "settings") {
58
- helpers::assertThat(rt, propertyValue.isObject(), "settings must be an object.");
56
+ helpers::assertThat(rt, propertyValue.isObject(), "StyleSheet.configure's settings must be an object.");
59
57
 
60
58
  return this->parseSettings(rt, propertyValue.asObject(rt));
61
59
  }
62
60
 
63
61
  if (propertyName == "breakpoints") {
64
- helpers::assertThat(rt, propertyValue.isObject(), "breakpoints must be an object.");
62
+ helpers::assertThat(rt, propertyValue.isObject(), "StyleSheet.configure's breakpoints must be an object.");
65
63
 
66
64
  return this->parseBreakpoints(rt, propertyValue.asObject(rt));
67
65
  }
68
66
 
69
67
  if (propertyName == "themes") {
70
- helpers::assertThat(rt, propertyValue.isObject(), "themes must be an object.");
68
+ helpers::assertThat(rt, propertyValue.isObject(), "StyleSheet.configure's themes must be an object.");
71
69
 
72
70
  return this->parseThemes(rt, propertyValue.asObject(rt));
73
71
  }
74
72
 
75
- helpers::assertThat(rt, false, "received unexpected key: '" + std::string(propertyName) + "'.");
73
+ helpers::assertThat(rt, false, "StyleSheet.configure received unexpected key: '" + std::string(propertyName) + "'.");
76
74
  });
77
75
 
78
76
  verifyAndSelectTheme(rt);
79
77
  loadExternalMethods(thisVal, rt);
80
- registerCommitHook(rt);
81
78
 
82
79
  return jsi::Value::undefined();
83
80
  }
@@ -87,7 +84,7 @@ void HybridStyleSheet::parseSettings(jsi::Runtime &rt, jsi::Object settings) {
87
84
 
88
85
  helpers::enumerateJSIObject(rt, settings, [&](const std::string& propertyName, jsi::Value& propertyValue){
89
86
  if (propertyName == "adaptiveThemes") {
90
- helpers::assertThat(rt, propertyValue.isBool(), "adaptiveThemes configuration must be of boolean type.");
87
+ helpers::assertThat(rt, propertyValue.isBool(), "StyleSheet.configure's adaptiveThemes must be of boolean type.");
91
88
 
92
89
  registry.setPrefersAdaptiveThemes(rt, propertyValue.asBool());
93
90
 
@@ -96,31 +93,31 @@ void HybridStyleSheet::parseSettings(jsi::Runtime &rt, jsi::Object settings) {
96
93
 
97
94
  if (propertyName == "initialTheme") {
98
95
  if (propertyValue.isObject()) {
99
- helpers::assertThat(rt, propertyValue.asObject(rt).isFunction(rt), "initialTheme configuration must be either a string or a function.");
96
+ helpers::assertThat(rt, propertyValue.asObject(rt).isFunction(rt), "StyleSheet.configure's initialTheme must be either a string or a function.");
100
97
 
101
98
  auto result = propertyValue.asObject(rt).asFunction(rt).call(rt);
102
99
 
103
- helpers::assertThat(rt, result.isString(), "initialTheme resolved from function is not a string. Please check your initialTheme function.");
100
+ helpers::assertThat(rt, result.isString(), "StyleSheet.configure's initialTheme resolved from function is not a string. Please check your initialTheme function.");
104
101
 
105
102
  return registry.setInitialThemeName(rt, result.asString(rt).utf8(rt));
106
103
  }
107
104
 
108
- helpers::assertThat(rt, propertyValue.isString(), "initialTheme configuration must be either a string or a function.");
105
+ helpers::assertThat(rt, propertyValue.isString(), "StyleSheet.configure's initialTheme must be either a string or a function.");
109
106
 
110
107
  registry.setInitialThemeName(rt, propertyValue.asString(rt).utf8(rt));
111
108
 
112
109
  return;
113
110
  }
114
111
 
115
- helpers::assertThat(rt, false, "settings received unexpected key: '" + std::string(propertyName) + "'");
112
+ helpers::assertThat(rt, false, "StyleSheet.configure's settings received unexpected key: '" + std::string(propertyName) + "'");
116
113
  });
117
114
  }
118
115
 
119
116
  void HybridStyleSheet::parseBreakpoints(jsi::Runtime &rt, jsi::Object breakpoints){
120
117
  helpers::Breakpoints sortedBreakpoints = helpers::jsiBreakpointsToVecPairs(rt, std::move(breakpoints));
121
118
 
122
- helpers::assertThat(rt, sortedBreakpoints.size() > 0, "registered breakpoints can't be empty.");
123
- helpers::assertThat(rt, sortedBreakpoints.front().second == 0, "first breakpoint must start from 0.");
119
+ helpers::assertThat(rt, sortedBreakpoints.size() > 0, "StyleSheet.configure's breakpoints can't be empty.");
120
+ helpers::assertThat(rt, sortedBreakpoints.front().second == 0, "StyleSheet.configure's first breakpoint must start from 0.");
124
121
 
125
122
  auto& registry = core::UnistylesRegistry::get();
126
123
  auto& state = registry.getState(rt);
@@ -133,7 +130,7 @@ void HybridStyleSheet::parseThemes(jsi::Runtime &rt, jsi::Object themes) {
133
130
  auto& registry = core::UnistylesRegistry::get();
134
131
 
135
132
  helpers::enumerateJSIObject(rt, themes, [&](const std::string& propertyName, jsi::Value& propertyValue){
136
- helpers::assertThat(rt, propertyValue.isObject(), "registered theme '" + propertyName + "' must be an object.");
133
+ helpers::assertThat(rt, propertyValue.isObject(), "StyleSheet.configure's registered theme '" + propertyName + "' must be an object.");
137
134
 
138
135
  registry.registerTheme(rt, propertyName, propertyValue.asObject(rt));
139
136
  });
@@ -151,7 +148,7 @@ void HybridStyleSheet::verifyAndSelectTheme(jsi::Runtime &rt) {
151
148
 
152
149
  // user tries to enable adaptive themes, but didn't register both 'light' and 'dark' themes
153
150
  if (prefersAdaptiveThemes && !hasAdaptiveThemes) {
154
- helpers::assertThat(rt, false, "you're trying to enable adaptiveThemes, but you didn't register both 'light' and 'dark' themes.");
151
+ helpers::assertThat(rt, false, "Unistyles: You're trying to enable adaptiveThemes, but you didn't register both 'light' and 'dark' themes.");
155
152
  }
156
153
 
157
154
  // user didn't select initial theme nor can have adaptive themes, and registered more than 1 theme
@@ -175,14 +172,14 @@ void HybridStyleSheet::verifyAndSelectTheme(jsi::Runtime &rt) {
175
172
  // user selected both initial theme and adaptive themes
176
173
  // we should throw an error as these options are mutually exclusive
177
174
  if (hasInitialTheme && hasAdaptiveThemes) {
178
- helpers::assertThat(rt, false, "you're trying to set initial theme and enable adaptiveThemes, but these options are mutually exclusive.");
175
+ helpers::assertThat(rt, false, "Unistyles: You're trying to set initial theme and enable adaptiveThemes, but these options are mutually exclusive.");
179
176
  }
180
177
 
181
178
  // user only selected initial theme
182
179
  // validate if following theme exist
183
180
  std::string selectedTheme = state.getInitialTheme().value();
184
181
 
185
- helpers::assertThat(rt, state.hasTheme(selectedTheme), "you're trying to select theme '" + selectedTheme + "' but it wasn't registered.");
182
+ helpers::assertThat(rt, state.hasTheme(selectedTheme), "Unistyles: You're trying to select theme '" + selectedTheme + "' but it wasn't registered.");
186
183
 
187
184
  state.setTheme(selectedTheme);
188
185
  }
@@ -201,18 +198,18 @@ void HybridStyleSheet::setThemeFromColorScheme(jsi::Runtime& rt) {
201
198
 
202
199
  return;
203
200
  default:
204
- throw std::runtime_error("unable to set adaptive theme as your device doesn't support it.");
201
+ throw std::runtime_error("Unistyles: Unable to set adaptive theme as your device doesn't support it.");
205
202
  }
206
203
  }
207
204
 
208
205
  void HybridStyleSheet::loadExternalMethods(const jsi::Value& thisValue, jsi::Runtime& rt) {
209
206
  auto jsMethods = thisValue.getObject(rt).getProperty(rt, "jsMethods");
210
207
 
211
- helpers::assertThat(rt, jsMethods.isObject(), "can't find jsMethods.");
208
+ helpers::assertThat(rt, jsMethods.isObject(), "Unistyles: Can't find jsMethods.");
212
209
 
213
210
  auto maybeProcessColorFn = jsMethods.asObject(rt).getProperty(rt, "processColor");
214
211
 
215
- helpers::assertThat(rt, maybeProcessColorFn.isObject(), "can't load processColor function from JS.");
212
+ helpers::assertThat(rt, maybeProcessColorFn.isObject(), "Unistyles: Can't load processColor function from JS.");
216
213
 
217
214
  auto processColorFn = maybeProcessColorFn.asObject(rt).asFunction(rt);
218
215
  auto& registry = core::UnistylesRegistry::get();
@@ -237,9 +234,3 @@ void HybridStyleSheet::onPlatformDependenciesChange(std::vector<UnistyleDependen
237
234
 
238
235
  shadow::ShadowTreeManager::updateShadowTree(rt, shadowLeafUpdates);
239
236
  }
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
 
@@ -58,7 +58,7 @@ double HybridUnistylesRuntime::getFontScale() {
58
58
  };
59
59
 
60
60
  void HybridUnistylesRuntime::setTheme(const std::string &themeName) {
61
- helpers::assertThat(*_rt, !this->getHasAdaptiveThemes(), "You're trying to set theme to: '" + themeName + "', but adaptiveThemes are enabled.");
61
+ helpers::assertThat(*_rt, !this->getHasAdaptiveThemes(), "Unistyles: You're trying to set theme to: '" + themeName + "', but adaptiveThemes are enabled.");
62
62
 
63
63
  auto& state = core::UnistylesRegistry::get().getState(*_rt);
64
64
 
@@ -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,24 +102,25 @@ 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);
115
119
 
116
- helpers::assertThat(rt, args[1].asObject(rt).isFunction(rt), "second argument expected to be a function.");
120
+ helpers::assertThat(rt, args[1].asObject(rt).isFunction(rt), "UnistylesRuntime.updateTheme expected second argument 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
 
@@ -11,7 +11,7 @@ void parser::Parser::buildUnistyles(jsi::Runtime& rt, std::shared_ptr<StyleSheet
11
11
  jsi::Object unwrappedStyleSheet = this->unwrapStyleSheet(rt, styleSheet);
12
12
 
13
13
  helpers::enumerateJSIObject(rt, unwrappedStyleSheet, [&](const std::string& styleKey, jsi::Value& propertyValue){
14
- helpers::assertThat(rt, propertyValue.isObject(), "style with name '" + styleKey + "' is not a function or object.");
14
+ helpers::assertThat(rt, propertyValue.isObject(), "Unistyles: Style with name '" + styleKey + "' is not a function or object.");
15
15
 
16
16
  jsi::Object styleValue = propertyValue.asObject(rt);
17
17
 
@@ -128,11 +128,13 @@ void parser::Parser::rebuildUnistyle(jsi::Runtime& rt, std::shared_ptr<StyleShee
128
128
  auto unistyleFn = std::dynamic_pointer_cast<UnistyleDynamicFunction>(unistyle);
129
129
  auto maybeMetadata = unistyleFn->dynamicFunctionMetadata;
130
130
 
131
- helpers::assertThat(rt, maybeMetadata.has_value(), "Your dynamic function '" + unistyleFn->styleKey + "' has no metadata and can't be processed.");
131
+ helpers::assertThat(rt, maybeMetadata.has_value(), "Unistyles: Your dynamic function '" + unistyleFn->styleKey + "' has no metadata and can't be processed.");
132
132
 
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];
@@ -312,10 +316,6 @@ jsi::Object parser::Parser::parseFirstLevel(jsi::Runtime& rt, Unistyle::Shared u
312
316
 
313
317
  parsedStyle.setProperty(rt, jsi::PropNameID::forUtf8(rt, propertyName), this->parseSecondLevel(rt, unistyle, valueFromBreakpoint));
314
318
  });
315
-
316
- if (shouldParseVariants) {
317
- unistyle->addDependency(UnistyleDependency::VARIANTS);
318
- }
319
319
 
320
320
  if (shouldParseVariants && !variants.empty()) {
321
321
  auto propertyValueObject = style.getProperty(rt, "variants").asObject(rt);
@@ -367,9 +367,11 @@ jsi::Function parser::Parser::createDynamicFunctionProxy(jsi::Runtime& rt, Unist
367
367
 
368
368
  // function convert babel generated dependencies to C++ dependencies
369
369
  std::vector<UnistyleDependency> parser::Parser::parseDependencies(jsi::Runtime &rt, jsi::Object&& dependencies) {
370
- helpers::assertThat(rt, dependencies.isArray(rt), "babel transform is invalid. Unexpected type for dependencies. Please report new Github issue.");
370
+ helpers::assertThat(rt, dependencies.isArray(rt), "Unistyles: Babel transform is invalid - unexpected type for dependencies.");
371
371
 
372
- std::vector<UnistyleDependency> parsedDependencies;
372
+ std::vector<UnistyleDependency> parsedDependencies{};
373
+
374
+ parsedDependencies.reserve(5);
373
375
 
374
376
  helpers::iterateJSIArray(rt, dependencies.asArray(rt), [&](size_t i, jsi::Value& value){
375
377
  auto dependency = static_cast<UnistyleDependency>(value.asNumber());
@@ -387,6 +389,8 @@ jsi::Value parser::Parser::parseTransforms(jsi::Runtime& rt, Unistyle::Shared un
387
389
  }
388
390
 
389
391
  std::vector<jsi::Value> parsedTransforms{};
392
+
393
+ parsedTransforms.reserve(2);
390
394
 
391
395
  helpers::iterateJSIArray(rt, obj.asArray(rt), [&](size_t i, jsi::Value& value){
392
396
  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.2",
3
+ "version": "3.0.0-alpha.4",
4
4
  "description": "Level up your React Native StyleSheet",
5
5
  "scripts": {
6
6
  "test": "jest",