diff --git a/packages/unistyles/cxx/hybridObjects/HybridStyleSheet.cpp b/packages/unistyles/cxx/hybridObjects/HybridStyleSheet.cpp index be22e985..ae74c57f 100644 --- a/packages/unistyles/cxx/hybridObjects/HybridStyleSheet.cpp +++ b/packages/unistyles/cxx/hybridObjects/HybridStyleSheet.cpp @@ -271,32 +271,9 @@ void HybridStyleSheet::onPlatformDependenciesChange(std::vector_unistylesRuntime); auto unistyleDependencies = dependencies; - auto dependencyMap = registry.buildDependencyMap(unistyleDependencies); - - if (dependencyMap.empty()) { - self->notifyJSListeners(unistyleDependencies); - } - - // in a later step, we will rebuild only Unistyles with mounted StyleSheets - // however, user may have StyleSheets with components that haven't mounted yet - // we need to rebuild all dependent StyleSheets as well - auto dependentStyleSheets = registry.getStyleSheetsToRefresh(unistyleDependencies); - - parser.rebuildUnistylesInDependencyMap(rt, dependencyMap, dependentStyleSheets, std::nullopt); - - // we need to stop here if there is nothing to update at the moment, - // but we need to compute dependentStyleSheets - if (dependencyMap.empty()) { - return; - } - - parser.rebuildShadowLeafUpdates(rt, dependencyMap); - self->notifyJSListeners(unistyleDependencies); - shadow::ShadowTreeManager::updateShadowTree(rt); + self->applyDependencyChanges(rt, unistyleDependencies, std::nullopt); }); } @@ -316,7 +293,6 @@ void HybridStyleSheet::onPlatformNativeDependenciesChange(std::vector_unistylesRuntime); auto unistyleDependencies = std::move(dependencies); // re-compute new breakpoint @@ -339,29 +315,7 @@ void HybridStyleSheet::onPlatformNativeDependenciesChange(std::vector_unistylesRuntime->includeDependenciesForColorSchemeChange(unistyleDependencies); } - auto dependencyMap = registry.buildDependencyMap(unistyleDependencies); - - if (dependencyMap.empty()) { - self->notifyJSListeners(unistyleDependencies); - } - - // in a later step, we will rebuild only Unistyles with mounted StyleSheets - // however, user may have StyleSheets with components that haven't mounted yet - // we need to rebuild all dependent StyleSheets as well - auto dependentStyleSheets = registry.getStyleSheetsToRefresh(unistyleDependencies); - - parser.rebuildUnistylesInDependencyMap(rt, dependencyMap, dependentStyleSheets, miniRuntime); - - // we need to stop here if there is nothing to update at the moment, - // but we need to compute dependentStyleSheets - if (dependencyMap.empty()) { - return; - } - - parser.rebuildShadowLeafUpdates(rt, dependencyMap); - - self->notifyJSListeners(unistyleDependencies); - shadow::ShadowTreeManager::updateShadowTree(rt); + self->applyDependencyChanges(rt, unistyleDependencies, miniRuntime); }); } @@ -380,26 +334,36 @@ void HybridStyleSheet::onImeChange(UnistylesNativeMiniRuntime miniRuntime) { } std::vector dependencies{UnistyleDependency::IME}; - auto& registry = core::UnistylesRegistry::get(); - auto parser = parser::Parser(self->_unistylesRuntime); - auto dependencyMap = registry.buildDependencyMap(dependencies); - if (dependencyMap.empty()) { - self->notifyJSListeners(dependencies); + self->applyDependencyChanges(rt, dependencies, miniRuntime); + }); +} - return; - } +void HybridStyleSheet::applyDependencyChanges(jsi::Runtime& rt, std::vector& dependencies, std::optional maybeMiniRuntime) { + auto& registry = core::UnistylesRegistry::get(); + auto parser = parser::Parser(this->_unistylesRuntime); + auto dependencyMap = registry.buildDependencyMap(dependencies); + + // include StyleSheets consumed only by JS (withUnistyles) — they aren't in dependencyMap + // but their rawValue must still be refreshed so rerenders read fresh closures + auto dependentStyleSheets = registry.getStyleSheetsToRefresh(dependencies); + + if (dependencyMap.empty() && dependentStyleSheets.empty()) { + return; + } - // we don't care about other unmounted stylesheets as their not visible - // so user won't see any changes - std::vector> dependentStyleSheets; + // rebuild rawValue BEFORE notifying listeners so JS rerenders read fresh closures + parser.rebuildUnistylesInDependencyMap(rt, dependencyMap, dependentStyleSheets, maybeMiniRuntime); - parser.rebuildUnistylesInDependencyMap(rt, dependencyMap, dependentStyleSheets, miniRuntime); + if (!dependencyMap.empty()) { parser.rebuildShadowLeafUpdates(rt, dependencyMap); + } + + this->notifyJSListeners(dependencies); - self->notifyJSListeners(dependencies); + if (!dependencyMap.empty()) { shadow::ShadowTreeManager::updateShadowTree(rt); - }); + } } void HybridStyleSheet::notifyJSListeners(std::vector& dependencies) { diff --git a/packages/unistyles/cxx/hybridObjects/HybridStyleSheet.h b/packages/unistyles/cxx/hybridObjects/HybridStyleSheet.h index 0df55858..6dea9d4f 100644 --- a/packages/unistyles/cxx/hybridObjects/HybridStyleSheet.h +++ b/packages/unistyles/cxx/hybridObjects/HybridStyleSheet.h @@ -3,6 +3,7 @@ #include #include #include +#include #include #include "HybridUnistylesRuntime.h" #include "HybridUnistylesStyleSheetSpec.hpp" @@ -69,6 +70,7 @@ struct HybridStyleSheet: public HybridUnistylesStyleSheetSpec { void onPlatformDependenciesChange(std::vector dependencies); void onPlatformNativeDependenciesChange(std::vector dependencies, UnistylesNativeMiniRuntime miniRuntime); void onImeChange(UnistylesNativeMiniRuntime miniRuntime); + void applyDependencyChanges(jsi::Runtime& rt, std::vector& dependencies, std::optional maybeMiniRuntime); void notifyJSListeners(std::vector& dependencies); bool isInitialized = false;