Files
Schnappix/node_modules/react-native-reanimated/Common/cpp/reanimated/CSS/configs/CSSTransitionConfig.cpp
T

103 lines
3.1 KiB
C++

#include <reanimated/CSS/configs/CSSTransitionConfig.h>
namespace reanimated::css {
std::optional<CSSTransitionPropertySettings> getTransitionPropertySettings(
const CSSTransitionPropertiesSettings &propertiesSettings,
const std::string &propName) {
// Try to use property specific settings first
const auto &propIt = propertiesSettings.find(propName);
if (propIt != propertiesSettings.end()) {
return propIt->second;
}
// Fallback to "all" settings if no property specific settings are available
const auto &allIt = propertiesSettings.find("all");
if (allIt != propertiesSettings.end()) {
return allIt->second;
}
// Or return nullopt if no settings are available
return std::nullopt;
}
TransitionProperties getProperties(
jsi::Runtime &rt,
const jsi::Object &config) {
const auto transitionProperty = config.getProperty(rt, "properties");
if (transitionProperty.isObject()) {
PropertyNames properties;
const auto propertiesArray = transitionProperty.asObject(rt).asArray(rt);
const auto propertiesCount = propertiesArray.size(rt);
for (size_t i = 0; i < propertiesCount; ++i) {
properties.emplace_back(
propertiesArray.getValueAtIndex(rt, i).asString(rt).utf8(rt));
}
return properties;
}
return std::nullopt;
}
bool getAllowDiscrete(jsi::Runtime &rt, const jsi::Object &config) {
return config.getProperty(rt, "allowDiscrete").asBool();
}
CSSTransitionPropertiesSettings parseCSSTransitionPropertiesSettings(
jsi::Runtime &rt,
const jsi::Object &settings) {
CSSTransitionPropertiesSettings result;
const auto propertyNames = settings.getPropertyNames(rt);
const auto propertiesCount = propertyNames.size(rt);
for (size_t i = 0; i < propertiesCount; ++i) {
const auto propertyName =
propertyNames.getValueAtIndex(rt, i).asString(rt).utf8(rt);
const auto propertySettings =
settings.getProperty(rt, jsi::PropNameID::forUtf8(rt, propertyName))
.asObject(rt);
result.emplace(
propertyName,
CSSTransitionPropertySettings{
getDuration(rt, propertySettings),
getTimingFunction(rt, propertySettings),
getDelay(rt, propertySettings),
getAllowDiscrete(rt, propertySettings)});
}
return result;
}
CSSTransitionConfig parseCSSTransitionConfig(
jsi::Runtime &rt,
const jsi::Value &config) {
const auto configObj = config.asObject(rt);
return CSSTransitionConfig{
getProperties(rt, configObj),
parseCSSTransitionPropertiesSettings(
rt, configObj.getProperty(rt, "settings").asObject(rt))};
}
PartialCSSTransitionConfig parsePartialCSSTransitionConfig(
jsi::Runtime &rt,
const jsi::Value &partialConfig) {
const auto partialObj = partialConfig.asObject(rt);
PartialCSSTransitionConfig result;
if (partialObj.hasProperty(rt, "properties")) {
result.properties = getProperties(rt, partialObj);
}
if (partialObj.hasProperty(rt, "settings")) {
result.settings = parseCSSTransitionPropertiesSettings(
rt, partialObj.getProperty(rt, "settings").asObject(rt));
}
return result;
}
} // namespace reanimated::css