Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 25 additions & 61 deletions packages/unistyles/cxx/hybridObjects/HybridStyleSheet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -271,32 +271,9 @@ void HybridStyleSheet::onPlatformDependenciesChange(std::vector<UnistyleDependen
return;
}

auto& registry = core::UnistylesRegistry::get();
auto parser = parser::Parser(self->_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);
});
}

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

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

// re-compute new breakpoint
Expand All @@ -339,29 +315,7 @@ void HybridStyleSheet::onPlatformNativeDependenciesChange(std::vector<UnistyleDe
self->_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);
});
}

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

std::vector<UnistyleDependency> 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<UnistyleDependency>& dependencies, std::optional<UnistylesNativeMiniRuntime> 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<std::shared_ptr<core::StyleSheet>> 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<UnistyleDependency>& dependencies) {
Expand Down
2 changes: 2 additions & 0 deletions packages/unistyles/cxx/hybridObjects/HybridStyleSheet.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
#include <cmath>
#include <jsi/jsi.h>
#include <mutex>
#include <optional>
#include <unordered_map>
#include "HybridUnistylesRuntime.h"
#include "HybridUnistylesStyleSheetSpec.hpp"
Expand Down Expand Up @@ -69,6 +70,7 @@ struct HybridStyleSheet: public HybridUnistylesStyleSheetSpec {
void onPlatformDependenciesChange(std::vector<UnistyleDependency> dependencies);
void onPlatformNativeDependenciesChange(std::vector<UnistyleDependency> dependencies, UnistylesNativeMiniRuntime miniRuntime);
void onImeChange(UnistylesNativeMiniRuntime miniRuntime);
void applyDependencyChanges(jsi::Runtime& rt, std::vector<UnistyleDependency>& dependencies, std::optional<UnistylesNativeMiniRuntime> maybeMiniRuntime);
void notifyJSListeners(std::vector<UnistyleDependency>& dependencies);

bool isInitialized = false;
Expand Down
Loading