Skip to content

Commit e4a16fc

Browse files
authored
Merge pull request #1172 from jpudysz/feature/scoped-themes
fix: no ime updates in withUnistyles wrapped components
2 parents f117d52 + 5e66c35 commit e4a16fc

2 files changed

Lines changed: 27 additions & 61 deletions

File tree

packages/unistyles/cxx/hybridObjects/HybridStyleSheet.cpp

Lines changed: 25 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -271,32 +271,9 @@ void HybridStyleSheet::onPlatformDependenciesChange(std::vector<UnistyleDependen
271271
return;
272272
}
273273

274-
auto& registry = core::UnistylesRegistry::get();
275-
auto parser = parser::Parser(self->_unistylesRuntime);
276274
auto unistyleDependencies = dependencies;
277-
auto dependencyMap = registry.buildDependencyMap(unistyleDependencies);
278-
279-
if (dependencyMap.empty()) {
280-
self->notifyJSListeners(unistyleDependencies);
281-
}
282-
283-
// in a later step, we will rebuild only Unistyles with mounted StyleSheets
284-
// however, user may have StyleSheets with components that haven't mounted yet
285-
// we need to rebuild all dependent StyleSheets as well
286-
auto dependentStyleSheets = registry.getStyleSheetsToRefresh(unistyleDependencies);
287-
288-
parser.rebuildUnistylesInDependencyMap(rt, dependencyMap, dependentStyleSheets, std::nullopt);
289-
290-
// we need to stop here if there is nothing to update at the moment,
291-
// but we need to compute dependentStyleSheets
292-
if (dependencyMap.empty()) {
293-
return;
294-
}
295-
296-
parser.rebuildShadowLeafUpdates(rt, dependencyMap);
297275

298-
self->notifyJSListeners(unistyleDependencies);
299-
shadow::ShadowTreeManager::updateShadowTree(rt);
276+
self->applyDependencyChanges(rt, unistyleDependencies, std::nullopt);
300277
});
301278
}
302279

@@ -316,7 +293,6 @@ void HybridStyleSheet::onPlatformNativeDependenciesChange(std::vector<UnistyleDe
316293
}
317294

318295
auto& registry = core::UnistylesRegistry::get();
319-
auto parser = parser::Parser(self->_unistylesRuntime);
320296
auto unistyleDependencies = std::move(dependencies);
321297

322298
// re-compute new breakpoint
@@ -339,29 +315,7 @@ void HybridStyleSheet::onPlatformNativeDependenciesChange(std::vector<UnistyleDe
339315
self->_unistylesRuntime->includeDependenciesForColorSchemeChange(unistyleDependencies);
340316
}
341317

342-
auto dependencyMap = registry.buildDependencyMap(unistyleDependencies);
343-
344-
if (dependencyMap.empty()) {
345-
self->notifyJSListeners(unistyleDependencies);
346-
}
347-
348-
// in a later step, we will rebuild only Unistyles with mounted StyleSheets
349-
// however, user may have StyleSheets with components that haven't mounted yet
350-
// we need to rebuild all dependent StyleSheets as well
351-
auto dependentStyleSheets = registry.getStyleSheetsToRefresh(unistyleDependencies);
352-
353-
parser.rebuildUnistylesInDependencyMap(rt, dependencyMap, dependentStyleSheets, miniRuntime);
354-
355-
// we need to stop here if there is nothing to update at the moment,
356-
// but we need to compute dependentStyleSheets
357-
if (dependencyMap.empty()) {
358-
return;
359-
}
360-
361-
parser.rebuildShadowLeafUpdates(rt, dependencyMap);
362-
363-
self->notifyJSListeners(unistyleDependencies);
364-
shadow::ShadowTreeManager::updateShadowTree(rt);
318+
self->applyDependencyChanges(rt, unistyleDependencies, miniRuntime);
365319
});
366320
}
367321

@@ -380,26 +334,36 @@ void HybridStyleSheet::onImeChange(UnistylesNativeMiniRuntime miniRuntime) {
380334
}
381335

382336
std::vector<UnistyleDependency> dependencies{UnistyleDependency::IME};
383-
auto& registry = core::UnistylesRegistry::get();
384-
auto parser = parser::Parser(self->_unistylesRuntime);
385-
auto dependencyMap = registry.buildDependencyMap(dependencies);
386337

387-
if (dependencyMap.empty()) {
388-
self->notifyJSListeners(dependencies);
338+
self->applyDependencyChanges(rt, dependencies, miniRuntime);
339+
});
340+
}
389341

390-
return;
391-
}
342+
void HybridStyleSheet::applyDependencyChanges(jsi::Runtime& rt, std::vector<UnistyleDependency>& dependencies, std::optional<UnistylesNativeMiniRuntime> maybeMiniRuntime) {
343+
auto& registry = core::UnistylesRegistry::get();
344+
auto parser = parser::Parser(this->_unistylesRuntime);
345+
auto dependencyMap = registry.buildDependencyMap(dependencies);
346+
347+
// include StyleSheets consumed only by JS (withUnistyles) — they aren't in dependencyMap
348+
// but their rawValue must still be refreshed so rerenders read fresh closures
349+
auto dependentStyleSheets = registry.getStyleSheetsToRefresh(dependencies);
350+
351+
if (dependencyMap.empty() && dependentStyleSheets.empty()) {
352+
return;
353+
}
392354

393-
// we don't care about other unmounted stylesheets as their not visible
394-
// so user won't see any changes
395-
std::vector<std::shared_ptr<core::StyleSheet>> dependentStyleSheets;
355+
// rebuild rawValue BEFORE notifying listeners so JS rerenders read fresh closures
356+
parser.rebuildUnistylesInDependencyMap(rt, dependencyMap, dependentStyleSheets, maybeMiniRuntime);
396357

397-
parser.rebuildUnistylesInDependencyMap(rt, dependencyMap, dependentStyleSheets, miniRuntime);
358+
if (!dependencyMap.empty()) {
398359
parser.rebuildShadowLeafUpdates(rt, dependencyMap);
360+
}
361+
362+
this->notifyJSListeners(dependencies);
399363

400-
self->notifyJSListeners(dependencies);
364+
if (!dependencyMap.empty()) {
401365
shadow::ShadowTreeManager::updateShadowTree(rt);
402-
});
366+
}
403367
}
404368

405369
void HybridStyleSheet::notifyJSListeners(std::vector<UnistyleDependency>& dependencies) {

packages/unistyles/cxx/hybridObjects/HybridStyleSheet.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <cmath>
44
#include <jsi/jsi.h>
55
#include <mutex>
6+
#include <optional>
67
#include <unordered_map>
78
#include "HybridUnistylesRuntime.h"
89
#include "HybridUnistylesStyleSheetSpec.hpp"
@@ -69,6 +70,7 @@ struct HybridStyleSheet: public HybridUnistylesStyleSheetSpec {
6970
void onPlatformDependenciesChange(std::vector<UnistyleDependency> dependencies);
7071
void onPlatformNativeDependenciesChange(std::vector<UnistyleDependency> dependencies, UnistylesNativeMiniRuntime miniRuntime);
7172
void onImeChange(UnistylesNativeMiniRuntime miniRuntime);
73+
void applyDependencyChanges(jsi::Runtime& rt, std::vector<UnistyleDependency>& dependencies, std::optional<UnistylesNativeMiniRuntime> maybeMiniRuntime);
7274
void notifyJSListeners(std::vector<UnistyleDependency>& dependencies);
7375

7476
bool isInitialized = false;

0 commit comments

Comments
 (0)