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

Sign up to get free protection for your applications and to get access to all the features.
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",