react-native-unistyles 2.4.0-rc.0 → 2.4.0-rc.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. package/README.md +5 -2
  2. package/android/src/main/cxx/cpp-adapter.cpp +28 -13
  3. package/android/src/main/cxx/helpers.cpp +21 -56
  4. package/android/src/main/cxx/helpers.h +3 -3
  5. package/android/src/main/java/com/unistyles/Config.kt +116 -0
  6. package/android/src/main/java/com/unistyles/Insets.kt +138 -0
  7. package/android/src/main/java/com/unistyles/Models.kt +85 -0
  8. package/android/src/main/java/com/unistyles/Platform.kt +10 -79
  9. package/android/src/main/java/com/unistyles/UnistylesModule.kt +85 -25
  10. package/cxx/UnistylesRuntime.cpp +57 -42
  11. package/cxx/UnistylesRuntime.h +30 -19
  12. package/ios/UnistylesModule.mm +20 -6
  13. package/ios/platform/Platform_iOS.h +5 -4
  14. package/ios/platform/Platform_iOS.mm +35 -22
  15. package/ios/platform/Platform_macOS.h +5 -4
  16. package/ios/platform/Platform_macOS.mm +18 -25
  17. package/lib/commonjs/common.js +7 -0
  18. package/lib/commonjs/common.js.map +1 -1
  19. package/lib/commonjs/core/UnistylesModule.js +6 -0
  20. package/lib/commonjs/core/UnistylesModule.js.map +1 -1
  21. package/lib/commonjs/core/UnistylesRuntime.js +8 -0
  22. package/lib/commonjs/core/UnistylesRuntime.js.map +1 -1
  23. package/lib/commonjs/hooks/useUnistyles.js +18 -1
  24. package/lib/commonjs/hooks/useUnistyles.js.map +1 -1
  25. package/lib/module/common.js +7 -0
  26. package/lib/module/common.js.map +1 -1
  27. package/lib/module/core/UnistylesModule.js +6 -0
  28. package/lib/module/core/UnistylesModule.js.map +1 -1
  29. package/lib/module/core/UnistylesRuntime.js +8 -0
  30. package/lib/module/core/UnistylesRuntime.js.map +1 -1
  31. package/lib/module/hooks/useUnistyles.js +18 -1
  32. package/lib/module/hooks/useUnistyles.js.map +1 -1
  33. package/lib/typescript/src/common.d.ts +8 -1
  34. package/lib/typescript/src/common.d.ts.map +1 -1
  35. package/lib/typescript/src/core/UnistylesModule.d.ts.map +1 -1
  36. package/lib/typescript/src/core/UnistylesRuntime.d.ts +6 -1
  37. package/lib/typescript/src/core/UnistylesRuntime.d.ts.map +1 -1
  38. package/lib/typescript/src/hooks/useUnistyles.d.ts +14 -0
  39. package/lib/typescript/src/hooks/useUnistyles.d.ts.map +1 -1
  40. package/lib/typescript/src/types/unistyles.d.ts +6 -2
  41. package/lib/typescript/src/types/unistyles.d.ts.map +1 -1
  42. package/package.json +1 -1
  43. package/src/common.ts +8 -1
  44. package/src/core/UnistylesModule.ts +8 -2
  45. package/src/core/UnistylesRuntime.ts +8 -0
  46. package/src/hooks/useUnistyles.ts +18 -1
  47. package/src/types/unistyles.ts +6 -2
  48. package/windows/ReactNativeUnistyles/ReactNativeUnistyles.h +1 -1
  49. package/windows/ReactNativeUnistyles/ReactNativeUnistyles.vcxproj +8 -1
  50. package/windows/ReactNativeUnistyles/ReactNativeUnistyles.vcxproj.filters +2 -1
@@ -7,6 +7,7 @@ import android.content.IntentFilter
7
7
  import android.os.Handler
8
8
  import android.os.Looper
9
9
  import android.util.Log
10
+ import android.view.ViewTreeObserver
10
11
  import com.facebook.react.bridge.Arguments
11
12
  import com.facebook.react.bridge.LifecycleEventListener
12
13
  import com.facebook.react.bridge.ReactApplicationContext
@@ -15,11 +16,27 @@ import com.facebook.react.bridge.ReactMethod
15
16
  import com.facebook.react.modules.core.DeviceEventManagerModule
16
17
 
17
18
  class UnistylesModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext), LifecycleEventListener {
19
+ private val drawHandler = Handler(Looper.getMainLooper())
20
+ private val debounceDuration = 250L
21
+ private var runnable: Runnable? = null
22
+
23
+ private var isCxxReady: Boolean = false
18
24
  private val platform: Platform = Platform(reactContext)
25
+ private val layoutListener = ViewTreeObserver.OnGlobalLayoutListener {
26
+ if (this.isCxxReady) {
27
+ runnable?.let { drawHandler.removeCallbacks(it) }
28
+
29
+ runnable = Runnable {
30
+ this@UnistylesModule.onLayoutConfigChange()
31
+ }.also {
32
+ drawHandler.postDelayed(it, debounceDuration)
33
+ }
34
+ }
35
+ }
19
36
 
20
37
  private val configurationChangeReceiver = object : BroadcastReceiver() {
21
38
  override fun onReceive(context: Context, intent: Intent) {
22
- if (intent.action == Intent.ACTION_CONFIGURATION_CHANGED) {
39
+ if (intent.action == Intent.ACTION_CONFIGURATION_CHANGED && this@UnistylesModule.isCxxReady) {
23
40
  Handler(Looper.getMainLooper()).postDelayed({
24
41
  this@UnistylesModule.onConfigChange()
25
42
  }, 10)
@@ -37,51 +54,79 @@ class UnistylesModule(reactContext: ReactApplicationContext) : ReactContextBaseJ
37
54
  reactApplicationContext.registerReceiver(configurationChangeReceiver, IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED))
38
55
  }
39
56
 
57
+ private fun setupLayoutListener() {
58
+ val activity = currentActivity ?: return
59
+ activity.window.decorView.rootView.viewTreeObserver.addOnGlobalLayoutListener(layoutListener)
60
+ }
61
+
40
62
  @Deprecated("Deprecated in Java")
41
63
  override fun onCatalystInstanceDestroy() {
64
+ val activity = currentActivity ?: return
65
+
66
+ activity.window.decorView.rootView.viewTreeObserver.removeOnGlobalLayoutListener(layoutListener)
42
67
  reactApplicationContext.unregisterReceiver(configurationChangeReceiver)
68
+ runnable?.let { drawHandler.removeCallbacks(it) }
43
69
  this.nativeDestroy()
44
70
  }
45
71
 
46
72
  //endregion
47
73
  //region Event handlers
48
- @Suppress("UNCHECKED_CAST")
49
74
  private fun onConfigChange() {
75
+ if (!platform.hasNewConfig()) {
76
+ return
77
+ }
78
+
50
79
  val config = platform.getConfig()
51
80
 
81
+ reactApplicationContext.runOnJSQueueThread {
82
+ if (config.hasNewColorScheme) {
83
+ this.nativeOnAppearanceChange(config.colorScheme)
84
+ }
85
+
86
+ if (config.hasNewContentSizeCategory) {
87
+ this.nativeOnContentSizeCategoryChange(config.contentSizeCategory)
88
+ }
89
+ }
90
+ }
91
+
92
+ private fun onLayoutConfigChange() {
93
+ if (!platform.hasNewLayoutConfig()) {
94
+ return
95
+ }
96
+
97
+ val config = platform.getLayoutConfig()
98
+
52
99
  reactApplicationContext.runOnJSQueueThread {
53
100
  this.nativeOnOrientationChange(
54
- config["width"] as Int,
55
- config["height"] as Int,
56
- config["insets"] as Map<String, Int>,
57
- config["statusBar"] as Map<String, Int>
58
- )
59
- this.nativeOnAppearanceChange(
60
- config["colorScheme"] as String
101
+ config.screen,
102
+ config.insets,
103
+ config.statusBar,
104
+ config.navigationBar
61
105
  )
62
- this.nativeOnContentSizeCategoryChange(config["contentSizeCategory"] as String)
63
106
  }
64
107
  }
65
108
 
66
109
  //endregion
67
110
  //region Core
68
- @Suppress("UNCHECKED_CAST")
69
111
  @ReactMethod(isBlockingSynchronousMethod = true)
70
112
  fun install(): Boolean {
71
113
  return try {
72
114
  System.loadLibrary("unistyles")
73
115
  val config = platform.getConfig()
116
+ val layoutConfig = platform.getLayoutConfig()
74
117
 
118
+ this.setupLayoutListener()
75
119
  this.reactApplicationContext.javaScriptContextHolder?.let {
76
120
  this.nativeInstall(
77
121
  it.get(),
78
- config["width"] as Int,
79
- config["height"] as Int,
80
- config["colorScheme"] as String,
81
- config["contentSizeCategory"] as String,
82
- config["insets"] as Map<String, Int>,
83
- config["statusBar"] as Map<String, Int>
122
+ layoutConfig.screen,
123
+ config.colorScheme,
124
+ config.contentSizeCategory,
125
+ layoutConfig.insets,
126
+ layoutConfig.statusBar,
127
+ layoutConfig.navigationBar
84
128
  )
129
+ this.isCxxReady = true
85
130
 
86
131
  Log.i(NAME, "Installed Unistyles \uD83E\uDD84!")
87
132
 
@@ -96,29 +141,43 @@ class UnistylesModule(reactContext: ReactApplicationContext) : ReactContextBaseJ
96
141
 
97
142
  private external fun nativeInstall(
98
143
  jsi: Long,
99
- width: Int,
100
- height: Int,
144
+ screen: Dimensions,
101
145
  colorScheme: String,
102
146
  contentSizeCategory: String,
103
- insets: Map<String, Int>,
104
- statusBar: Map<String, Int>
147
+ insets: Insets,
148
+ statusBar: Dimensions,
149
+ navigationBar: Dimensions
105
150
  )
106
151
  private external fun nativeDestroy()
107
- private external fun nativeOnOrientationChange(width: Int, height: Int, insets: Map<String, Int>, statusBar: Map<String, Int>)
152
+ private external fun nativeOnOrientationChange(screen: Dimensions, insets: Insets, statusBar: Dimensions, navigationBar: Dimensions)
108
153
  private external fun nativeOnAppearanceChange(colorScheme: String)
109
154
  private external fun nativeOnContentSizeCategoryChange(contentSizeCategory: String)
110
155
 
111
156
  //endregion
112
157
  //region Event emitter
113
- private fun onLayoutChange(breakpoint: String, orientation: String, width: Int, height: Int) {
158
+ private fun onLayoutChange(breakpoint: String, orientation: String, screen: Dimensions, statusBar: Dimensions, insets: Insets, navigationBar: Dimensions) {
114
159
  val body = Arguments.createMap().apply {
115
160
  putString("type", "layout")
116
161
  putMap("payload", Arguments.createMap().apply {
117
162
  putString("breakpoint", breakpoint)
118
163
  putString("orientation", orientation)
119
164
  putMap("screen", Arguments.createMap().apply {
120
- putInt("width", width)
121
- putInt("height", height)
165
+ putInt("width", screen.width)
166
+ putInt("height", screen.height)
167
+ })
168
+ putMap("statusBar", Arguments.createMap().apply {
169
+ putInt("width", statusBar.width)
170
+ putInt("height", statusBar.height)
171
+ })
172
+ putMap("insets", Arguments.createMap().apply {
173
+ putInt("top", insets.top)
174
+ putInt("bottom", insets.bottom)
175
+ putInt("left", insets.left)
176
+ putInt("right", insets.right)
177
+ })
178
+ putMap("navigationBar", Arguments.createMap().apply {
179
+ putInt("width", navigationBar.width)
180
+ putInt("height", navigationBar.height)
122
181
  })
123
182
  })
124
183
  }
@@ -171,6 +230,7 @@ class UnistylesModule(reactContext: ReactApplicationContext) : ReactContextBaseJ
171
230
  fun removeListeners(count: Double) = Unit
172
231
  override fun onHostResume() {
173
232
  this.onConfigChange()
233
+ this.onLayoutConfigChange()
174
234
  }
175
235
 
176
236
  override fun onHostPause() {}
@@ -27,6 +27,7 @@ std::vector<jsi::PropNameID> UnistylesRuntime::getPropertyNames(jsi::Runtime& ru
27
27
  properties.push_back(jsi::PropNameID::forUtf8(runtime, std::string("enabledPlugins")));
28
28
  properties.push_back(jsi::PropNameID::forUtf8(runtime, std::string("insets")));
29
29
  properties.push_back(jsi::PropNameID::forUtf8(runtime, std::string("statusBar")));
30
+ properties.push_back(jsi::PropNameID::forUtf8(runtime, std::string("navigationBar")));
30
31
 
31
32
  // setters
32
33
  properties.push_back(jsi::PropNameID::forUtf8(runtime, std::string("themes")));
@@ -38,17 +39,17 @@ jsi::Value UnistylesRuntime::get(jsi::Runtime& runtime, const jsi::PropNameID& p
38
39
  std::string propName = propNameId.utf8(runtime);
39
40
 
40
41
  if (propName == "screenWidth") {
41
- return jsi::Value(this->screenWidth);
42
+ return jsi::Value(this->screen.width);
42
43
  }
43
44
 
44
45
  if (propName == "screenHeight") {
45
- return jsi::Value(this->screenHeight);
46
+ return jsi::Value(this->screen.height);
46
47
  }
47
48
 
48
49
  if (propName == "hasAdaptiveThemes") {
49
50
  return jsi::Value(this->hasAdaptiveThemes);
50
51
  }
51
-
52
+
52
53
  if (propName == "contentSizeCategory") {
53
54
  return jsi::Value(jsi::String::createFromUtf8(runtime, this->contentSizeCategory));
54
55
  }
@@ -68,14 +69,14 @@ jsi::Value UnistylesRuntime::get(jsi::Runtime& runtime, const jsi::PropNameID& p
68
69
  if (propName == "colorScheme") {
69
70
  return jsi::Value(jsi::String::createFromUtf8(runtime, this->colorScheme));
70
71
  }
71
-
72
+
72
73
  if (propName == "enabledPlugins") {
73
74
  auto jsiArray = facebook::jsi::Array(runtime, this->pluginNames.size());
74
-
75
+
75
76
  for (size_t i = 0; i < this->pluginNames.size(); i++) {
76
77
  jsiArray.setValueAtIndex(runtime, i, facebook::jsi::String::createFromUtf8(runtime, this->pluginNames[i]));
77
78
  }
78
-
79
+
79
80
  return jsiArray;
80
81
  }
81
82
 
@@ -93,7 +94,7 @@ jsi::Value UnistylesRuntime::get(jsi::Runtime& runtime, const jsi::PropNameID& p
93
94
 
94
95
  return jsi::Value(runtime, *sortedBreakpointEntriesArray);
95
96
  }
96
-
97
+
97
98
  if (propName == "addPlugin") {
98
99
  return jsi::Function::createFromHostFunction(
99
100
  runtime,
@@ -102,19 +103,19 @@ jsi::Value UnistylesRuntime::get(jsi::Runtime& runtime, const jsi::PropNameID& p
102
103
  [this](jsi::Runtime &runtime, const jsi::Value &thisVal, const jsi::Value *arguments, size_t count) -> jsi::Value {
103
104
  std::string pluginName = arguments[0].asString(runtime).utf8(runtime);
104
105
  bool notify = arguments[1].asBool();
105
-
106
+
106
107
  this->pluginNames.push_back(pluginName);
107
-
108
+
108
109
  // registry enabled plugins won't notify listeners
109
110
  if (notify) {
110
111
  this->onPluginChangeCallback();
111
112
  }
112
-
113
+
113
114
  return jsi::Value::undefined();
114
115
  }
115
116
  );
116
117
  }
117
-
118
+
118
119
  if (propName == "removePlugin") {
119
120
  return jsi::Function::createFromHostFunction(
120
121
  runtime,
@@ -122,14 +123,14 @@ jsi::Value UnistylesRuntime::get(jsi::Runtime& runtime, const jsi::PropNameID& p
122
123
  1,
123
124
  [this](jsi::Runtime &runtime, const jsi::Value &thisVal, const jsi::Value *arguments, size_t count) -> jsi::Value {
124
125
  std::string pluginName = arguments[0].asString(runtime).utf8(runtime);
125
-
126
+
126
127
  auto it = std::find(this->pluginNames.begin(), this->pluginNames.end(), pluginName);
127
-
128
+
128
129
  if (it != this->pluginNames.end()) {
129
130
  this->pluginNames.erase(it);
130
131
  this->onPluginChangeCallback();
131
132
  }
132
-
133
+
133
134
  return jsi::Value::undefined();
134
135
  }
135
136
  );
@@ -171,7 +172,7 @@ jsi::Value UnistylesRuntime::get(jsi::Runtime& runtime, const jsi::PropNameID& p
171
172
 
172
173
  this->sortedBreakpointPairs = sortedBreakpointEntriesVec;
173
174
 
174
- std::string breakpoint = this->getBreakpointFromScreenWidth(this->screenWidth, sortedBreakpointEntriesVec);
175
+ std::string breakpoint = this->getBreakpointFromScreenWidth(this->screen.width, sortedBreakpointEntriesVec);
175
176
 
176
177
  this->breakpoint = breakpoint;
177
178
 
@@ -191,12 +192,12 @@ jsi::Value UnistylesRuntime::get(jsi::Runtime& runtime, const jsi::PropNameID& p
191
192
  this->themeName = themeName;
192
193
  this->onThemeChangeCallback(themeName);
193
194
  }
194
-
195
+
195
196
  return jsi::Value::undefined();
196
197
  }
197
198
  );
198
199
  }
199
-
200
+
200
201
  if (propName == "updateTheme") {
201
202
  return jsi::Function::createFromHostFunction(runtime,
202
203
  jsi::PropNameID::forAscii(runtime, "updateTheme"),
@@ -207,7 +208,7 @@ jsi::Value UnistylesRuntime::get(jsi::Runtime& runtime, const jsi::PropNameID& p
207
208
  if (this->themeName == themeName) {
208
209
  this->onThemeChangeCallback(themeName);
209
210
  }
210
-
211
+
211
212
  return jsi::Value::undefined();
212
213
  }
213
214
  );
@@ -225,7 +226,7 @@ jsi::Value UnistylesRuntime::get(jsi::Runtime& runtime, const jsi::PropNameID& p
225
226
  if (!enableAdaptiveThemes || !this->supportsAutomaticColorScheme) {
226
227
  return jsi::Value::undefined();
227
228
  }
228
-
229
+
229
230
  if (this->themeName != this->colorScheme) {
230
231
  this->themeName = this->colorScheme;
231
232
  this->onThemeChangeCallback(this->themeName);
@@ -235,27 +236,36 @@ jsi::Value UnistylesRuntime::get(jsi::Runtime& runtime, const jsi::PropNameID& p
235
236
  }
236
237
  );
237
238
  }
238
-
239
+
239
240
  if (propName == "insets") {
240
241
  auto insets = jsi::Object(runtime);
241
-
242
- insets.setProperty(runtime, "top", this->insets.at("top"));
243
- insets.setProperty(runtime, "bottom", this->insets.at("bottom"));
244
- insets.setProperty(runtime, "left", this->insets.at("left"));
245
- insets.setProperty(runtime, "right", this->insets.at("right"));
246
-
242
+
243
+ insets.setProperty(runtime, "top", this->insets.top);
244
+ insets.setProperty(runtime, "bottom", this->insets.bottom);
245
+ insets.setProperty(runtime, "left", this->insets.left);
246
+ insets.setProperty(runtime, "right", this->insets.right);
247
+
247
248
  return insets;
248
249
  }
249
-
250
+
250
251
  if (propName == "statusBar") {
251
252
  auto statusBar = jsi::Object(runtime);
252
-
253
- statusBar.setProperty(runtime, "height", this->statusBar.at("height"));
254
- statusBar.setProperty(runtime, "width", this->statusBar.at("width"));
255
-
253
+
254
+ statusBar.setProperty(runtime, "width", this->statusBar.width);
255
+ statusBar.setProperty(runtime, "height", this->statusBar.height);
256
+
256
257
  return statusBar;
257
258
  }
258
259
 
260
+ if (propName == "navigationBar") {
261
+ auto navigationBarValue = jsi::Object(runtime);
262
+
263
+ navigationBarValue.setProperty(runtime, "width", this->navigationBar.width);
264
+ navigationBarValue.setProperty(runtime, "height", this->navigationBar.height);
265
+
266
+ return navigationBarValue;
267
+ }
268
+
259
269
  return jsi::Value::undefined();
260
270
  }
261
271
 
@@ -308,22 +318,27 @@ std::string UnistylesRuntime::getBreakpointFromScreenWidth(int width, const std:
308
318
  return sortedBreakpointPairs.empty() ? "" : sortedBreakpointPairs.back().first;
309
319
  }
310
320
 
311
- void UnistylesRuntime::handleScreenSizeChange(int width, int height, std::map<std::string, int> insets, std::map<std::string, int> statusBar) {
312
- std::string breakpoint = this->getBreakpointFromScreenWidth(width, this->sortedBreakpointPairs);
313
- bool shouldNotify = this->breakpoint != breakpoint || this->screenWidth != width || this->screenHeight != height;
314
-
321
+ void UnistylesRuntime::handleScreenSizeChange(Dimensions& screen, Insets& insets, Dimensions& statusBar, Dimensions& navigationBar) {
322
+ std::string breakpoint = this->getBreakpointFromScreenWidth(screen.width, this->sortedBreakpointPairs);
323
+ bool hasDifferentBreakpoint = this->breakpoint != breakpoint;
324
+ bool hasDifferentScreenDimensions = this->screen.width != screen.width || this->screen.height != screen.height;
325
+ bool hasDifferentInsets = this->insets.top != insets.top || this->insets.bottom != insets.bottom || this->insets.left != insets.left || this->insets.right != insets.right;
326
+
327
+ // we don't need to check statusBar/navigationBar as they will only change on orientation change witch is equal to hasDifferentScreenDimensions
328
+ bool shouldNotify = hasDifferentBreakpoint || hasDifferentScreenDimensions || hasDifferentInsets;
329
+
315
330
  this->breakpoint = breakpoint;
316
- this->screenWidth = width;
317
- this->screenHeight = height;
318
- this->insets = insets;
319
- this->statusBar = statusBar;
331
+ this->screen = {screen.width, screen.height};
332
+ this->insets = {insets.top, insets.bottom, insets.left, insets.right};
333
+ this->statusBar = {statusBar.width, statusBar.height};
334
+ this->navigationBar = {navigationBar.width, navigationBar.height};
320
335
 
321
- std::string orientation = width > height
336
+ std::string orientation = screen.width > screen.height
322
337
  ? UnistylesOrientationLandscape
323
338
  : UnistylesOrientationPortrait;
324
339
 
325
340
  if (shouldNotify) {
326
- this->onLayoutChangeCallback(breakpoint, orientation, width, height);
341
+ this->onLayoutChangeCallback(breakpoint, orientation, screen, statusBar, insets, navigationBar);
327
342
  }
328
343
  }
329
344
 
@@ -333,7 +348,7 @@ void UnistylesRuntime::handleAppearanceChange(std::string colorScheme) {
333
348
  if (!this->supportsAutomaticColorScheme || !this->hasAdaptiveThemes) {
334
349
  return;
335
350
  }
336
-
351
+
337
352
  if (this->themeName != this->colorScheme) {
338
353
  this->onThemeChangeCallback(this->colorScheme);
339
354
  this->themeName = this->colorScheme;
@@ -17,32 +17,46 @@ const std::string UnistylesErrorBreakpointsCannotBeEmpty = "You are trying to re
17
17
  const std::string UnistylesErrorBreakpointsMustStartFromZero = "You are trying to register breakpoints that don't start from 0";
18
18
  const std::string UnistylesErrorThemesCannotBeEmpty = "You are trying to register empty themes object";
19
19
 
20
+ struct Dimensions {
21
+ int width;
22
+ int height;
23
+ };
24
+
25
+ struct Insets {
26
+ int top;
27
+ int bottom;
28
+ int left;
29
+ int right;
30
+ };
31
+
20
32
  class JSI_EXPORT UnistylesRuntime : public jsi::HostObject {
21
33
  private:
22
34
  std::function<void(std::string)> onThemeChangeCallback;
23
- std::function<void(std::string breakpoint, std::string orientation, int screenWidth, int screenHeight)> onLayoutChangeCallback;
35
+ std::function<void(std::string breakpoint, std::string orientation, Dimensions& screen, Dimensions& statusBar, Insets& insets, Dimensions& navigationBar)> onLayoutChangeCallback;
24
36
  std::function<void(std::string)> onContentSizeCategoryChangeCallback;
25
37
  std::function<void()> onPluginChangeCallback;
26
38
 
27
- int screenWidth;
28
- int screenHeight;
39
+ Dimensions screen;
40
+ Dimensions statusBar;
41
+ Dimensions navigationBar;
42
+ Insets insets;
29
43
  std::string colorScheme;
30
44
  std::string contentSizeCategory;
31
45
 
32
46
  public:
33
47
  UnistylesRuntime(
34
- int screenWidth,
35
- int screenHeight,
48
+ Dimensions screen,
36
49
  std::string colorScheme,
37
50
  std::string contentSizeCategory,
38
- std::map<std::string, int> insets,
39
- std::map<std::string, int> statusBar
40
- ): screenWidth(screenWidth),
41
- screenHeight(screenHeight),
42
- colorScheme(colorScheme),
43
- contentSizeCategory(contentSizeCategory),
44
- insets(insets),
45
- statusBar(statusBar) {}
51
+ Insets insets,
52
+ Dimensions statusBar,
53
+ Dimensions navigationBar
54
+ ): screen(screen),
55
+ colorScheme(colorScheme),
56
+ contentSizeCategory(contentSizeCategory),
57
+ insets(insets),
58
+ statusBar(statusBar),
59
+ navigationBar(navigationBar) {}
46
60
 
47
61
  bool hasAdaptiveThemes;
48
62
  bool supportsAutomaticColorScheme;
@@ -52,22 +66,19 @@ public:
52
66
  std::vector<std::string> pluginNames;
53
67
  std::vector<std::string> themes;
54
68
  std::vector<std::pair<std::string, double>> sortedBreakpointPairs;
55
-
56
- std::map<std::string, int> insets;
57
- std::map<std::string, int> statusBar;
58
69
 
59
70
  void onThemeChange(std::function<void(std::string)> callback) {
60
71
  this->onThemeChangeCallback = callback;
61
72
  }
62
73
 
63
- void onLayoutChange(std::function<void(std::string breakpoint, std::string orientation, int screenWidth, int screenHeight)> callback) {
74
+ void onLayoutChange(std::function<void(std::string breakpoint, std::string orientation, Dimensions& screen, Dimensions& statusBar, Insets& insets, Dimensions& navigationBar)> callback) {
64
75
  this->onLayoutChangeCallback = callback;
65
76
  }
66
77
 
67
78
  void onPluginChange(std::function<void()> callback) {
68
79
  this->onPluginChangeCallback = callback;
69
80
  }
70
-
81
+
71
82
  void onContentSizeCategoryChange(std::function<void(std::string)> callback) {
72
83
  this->onContentSizeCategoryChangeCallback = callback;
73
84
  }
@@ -76,7 +87,7 @@ public:
76
87
  void set(jsi::Runtime& runtime, const jsi::PropNameID& propNameId, const jsi::Value& value) override;
77
88
  std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime& runtime) override;
78
89
 
79
- void handleScreenSizeChange(int width, int height, std::map<std::string, int> insets, std::map<std::string, int> statusBar);
90
+ void handleScreenSizeChange(Dimensions& screen, Insets& insets, Dimensions& statusBar, Dimensions& navigationBar);
80
91
  void handleAppearanceChange(std::string colorScheme);
81
92
  void handleContentSizeCategoryChange(std::string contentSizeCategory);
82
93
 
@@ -72,12 +72,12 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install) {
72
72
 
73
73
  void registerUnistylesHostObject(jsi::Runtime &runtime, UnistylesModule* weakSelf) {
74
74
  auto unistylesRuntime = std::make_shared<UnistylesRuntime>(
75
- (int)weakSelf.platform.initialWidth,
76
- (int)weakSelf.platform.initialHeight,
75
+ weakSelf.platform.initialScreen,
77
76
  weakSelf.platform.initialColorScheme,
78
77
  weakSelf.platform.initialContentSizeCategory,
79
78
  weakSelf.platform.initialInsets,
80
- weakSelf.platform.initialStatusBar
79
+ weakSelf.platform.initialStatusBar,
80
+ weakSelf.platform.initialNavigationBar
81
81
  );
82
82
 
83
83
  unistylesRuntime.get()->onThemeChange([=](std::string theme) {
@@ -91,15 +91,29 @@ void registerUnistylesHostObject(jsi::Runtime &runtime, UnistylesModule* weakSel
91
91
  [weakSelf emitEvent:@"__unistylesOnChange" withBody:body];
92
92
  });
93
93
 
94
- unistylesRuntime.get()->onLayoutChange([=](std::string breakpoint, std::string orientation, int width, int height) {
94
+ unistylesRuntime.get()->onLayoutChange([=](std::string breakpoint, std::string orientation, Dimensions& screen, Dimensions& statusBar, Insets& insets, Dimensions& navigationBar) {
95
95
  NSDictionary *body = @{
96
96
  @"type": @"layout",
97
97
  @"payload": @{
98
98
  @"breakpoint": cxxStringToNSString(breakpoint),
99
99
  @"orientation": cxxStringToNSString(orientation),
100
100
  @"screen": @{
101
- @"width": @(width),
102
- @"height": @(height)
101
+ @"width": @(screen.width),
102
+ @"height": @(screen.height)
103
+ },
104
+ @"statusBar": @{
105
+ @"width": @(statusBar.width),
106
+ @"height": @(statusBar.height)
107
+ },
108
+ @"navigationBar": @{
109
+ @"width": @(navigationBar.width),
110
+ @"height": @(navigationBar.height)
111
+ },
112
+ @"insets": @{
113
+ @"top": @(insets.top),
114
+ @"bottom": @(insets.bottom),
115
+ @"left": @(insets.left),
116
+ @"right": @(insets.right)
103
117
  }
104
118
  }
105
119
  };
@@ -1,14 +1,15 @@
1
1
  #include <string>
2
2
  #include <map>
3
+ #include <UnistylesRuntime.h>
3
4
 
4
5
  @interface Platform : NSObject
5
6
 
6
- @property (nonatomic, assign) CGFloat initialWidth;
7
- @property (nonatomic, assign) CGFloat initialHeight;
7
+ @property (nonatomic, assign) Dimensions initialScreen;
8
8
  @property (nonatomic, assign) std::string initialColorScheme;
9
9
  @property (nonatomic, assign) std::string initialContentSizeCategory;
10
- @property (nonatomic, assign) std::map<std::string, int> initialInsets;
11
- @property (nonatomic, assign) std::map<std::string, int> initialStatusBar;
10
+ @property (nonatomic, assign) Insets initialInsets;
11
+ @property (nonatomic, assign) Dimensions initialStatusBar;
12
+ @property (nonatomic, assign) Dimensions initialNavigationBar;
12
13
  @property (nonatomic, assign) void* unistylesRuntime;
13
14
 
14
15
  - (instancetype)init;