Skip to content

Commit 98d6795

Browse files
Make Image fadeDuration and progressiveRenderingEnabled optional in C++ (#58863)
Summary: Pull Request resolved: #58863 On Android, props equal to their C++ default are not sent when a view is created, so each `ImageProps` default must describe the state a new image view starts in. Two defaults could not: - `fadeDuration` defaulted to 300, while `ReactImageView` treats an unset duration as "no fade for local resources, 300ms for remote images". It is now a `std::optional<Float>` that is unset by default, the Android image request keeps using 300 when it is unset, and `ReactImageView` maps a removed `fadeDuration` back to unset instead of 0. - `progressiveRenderingEnabled` defaulted to `false`, which image views that defer to the image pipeline's default never received when passed explicitly. It is now a `std::optional<bool>` that is unset by default; the Android image request keeps using `false` when it is unset. Changelog: [General][Breaking] - `ImageProps::fadeDuration` and `ImageProps::progressiveRenderingEnabled` are now `std::optional` in C++ [Android][Fixed] - Fix explicit `fadeDuration` being ignored on newly created `Image`s Reviewed By: christophpurrer Differential Revision: D123029512 fbshipit-source-id: 272a1ffaa32cc6cc6e37fb37975a64f480209c30
1 parent 2afaf3b commit 98d6795

13 files changed

Lines changed: 29 additions & 25 deletions

File tree

‎packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/image/ReactImageManager.kt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ public constructor(
254254
view.setProgressiveRenderingEnabled(enabled)
255255
}
256256

257-
@ReactProp(name = "fadeDuration")
257+
@ReactProp(name = "fadeDuration", defaultInt = -1)
258258
public fun setFadeDuration(view: ReactImageView, durationMs: Int) {
259259
view.setFadeDuration(durationMs)
260260
}

‎packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.cpp‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,11 +246,15 @@ folly::dynamic ImageProps::getDiffProps(const Props* prevProps) const {
246246
}
247247

248248
if (fadeDuration != oldProps->fadeDuration) {
249-
result["fadeDuration"] = fadeDuration;
249+
result["fadeDuration"] =
250+
fadeDuration.has_value() ? folly::dynamic(*fadeDuration) : nullptr;
250251
}
251252

252253
if (progressiveRenderingEnabled != oldProps->progressiveRenderingEnabled) {
253-
result["progressiveRenderingEnabled"] = progressiveRenderingEnabled;
254+
result["progressiveRenderingEnabled"] =
255+
progressiveRenderingEnabled.has_value()
256+
? folly::dynamic(*progressiveRenderingEnabled)
257+
: nullptr;
254258
}
255259

256260
return result;

‎packages/react-native/ReactCommon/react/renderer/components/image/ImageProps.h‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ class ImageProps final : public ViewProps {
4242
Float resizeMultiplier{1.f};
4343
bool shouldNotifyLoadEvents{};
4444
SharedColor overlayColor{};
45-
Float fadeDuration{300.f};
46-
bool progressiveRenderingEnabled{};
45+
std::optional<Float> fadeDuration{};
46+
std::optional<bool> progressiveRenderingEnabled{};
4747

4848
#ifdef RN_SERIALIZABLE_STATE
4949
ComponentName getDiffPropsImplementationTarget() const override;

‎packages/react-native/ReactCommon/react/renderer/components/image/ImageShadowNode.cpp‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ void ImageShadowNode::updateStateIfNeeded() {
6262
imageProps.shouldNotifyLoadEvents,
6363
imageProps.overlayColor,
6464
imageProps.tintColor,
65-
imageProps.fadeDuration,
66-
imageProps.progressiveRenderingEnabled,
65+
imageProps.fadeDuration.value_or(300.f),
66+
imageProps.progressiveRenderingEnabled.value_or(false),
6767
imageProps.loadingIndicatorSource,
6868
imageProps.internal_analyticTag,
6969
Size{

‎scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2573,17 +2573,17 @@ class facebook::react::ImageManager {
25732573
class facebook::react::ImageProps : public facebook::react::HostPlatformViewProps {
25742574
public ImageProps() = default;
25752575
public ImageProps(const facebook::react::PropsParserContext& context, const facebook::react::ImageProps& sourceProps, const facebook::react::RawProps& rawProps);
2576-
public bool progressiveRenderingEnabled;
25772576
public bool shouldNotifyLoadEvents;
25782577
public facebook::react::EdgeInsets capInsets;
25792578
public facebook::react::Float blurRadius;
2580-
public facebook::react::Float fadeDuration;
25812579
public facebook::react::Float resizeMultiplier;
25822580
public facebook::react::ImageResizeMode resizeMode;
25832581
public facebook::react::ImageSource defaultSource;
25842582
public facebook::react::ImageSource loadingIndicatorSource;
25852583
public facebook::react::ImageSources sources;
25862584
public facebook::react::SharedColor overlayColor;
2585+
public std::optional<bool> progressiveRenderingEnabled;
2586+
public std::optional<facebook::react::Float> fadeDuration;
25872587
public std::optional<facebook::react::SharedColor> tintColor;
25882588
public std::string resizeMethod;
25892589
public virtual facebook::react::ComponentName getDiffPropsImplementationTarget() const override;

‎scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2555,17 +2555,17 @@ class facebook::react::ImageManager {
25552555
class facebook::react::ImageProps : public facebook::react::HostPlatformViewProps {
25562556
public ImageProps() = default;
25572557
public ImageProps(const facebook::react::PropsParserContext& context, const facebook::react::ImageProps& sourceProps, const facebook::react::RawProps& rawProps);
2558-
public bool progressiveRenderingEnabled;
25592558
public bool shouldNotifyLoadEvents;
25602559
public facebook::react::EdgeInsets capInsets;
25612560
public facebook::react::Float blurRadius;
2562-
public facebook::react::Float fadeDuration;
25632561
public facebook::react::Float resizeMultiplier;
25642562
public facebook::react::ImageResizeMode resizeMode;
25652563
public facebook::react::ImageSource defaultSource;
25662564
public facebook::react::ImageSource loadingIndicatorSource;
25672565
public facebook::react::ImageSources sources;
25682566
public facebook::react::SharedColor overlayColor;
2567+
public std::optional<bool> progressiveRenderingEnabled;
2568+
public std::optional<facebook::react::Float> fadeDuration;
25692569
public std::optional<facebook::react::SharedColor> tintColor;
25702570
public std::string resizeMethod;
25712571
public virtual facebook::react::ComponentName getDiffPropsImplementationTarget() const override;

‎scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2570,17 +2570,17 @@ class facebook::react::ImageManager {
25702570
class facebook::react::ImageProps : public facebook::react::HostPlatformViewProps {
25712571
public ImageProps() = default;
25722572
public ImageProps(const facebook::react::PropsParserContext& context, const facebook::react::ImageProps& sourceProps, const facebook::react::RawProps& rawProps);
2573-
public bool progressiveRenderingEnabled;
25742573
public bool shouldNotifyLoadEvents;
25752574
public facebook::react::EdgeInsets capInsets;
25762575
public facebook::react::Float blurRadius;
2577-
public facebook::react::Float fadeDuration;
25782576
public facebook::react::Float resizeMultiplier;
25792577
public facebook::react::ImageResizeMode resizeMode;
25802578
public facebook::react::ImageSource defaultSource;
25812579
public facebook::react::ImageSource loadingIndicatorSource;
25822580
public facebook::react::ImageSources sources;
25832581
public facebook::react::SharedColor overlayColor;
2582+
public std::optional<bool> progressiveRenderingEnabled;
2583+
public std::optional<facebook::react::Float> fadeDuration;
25842584
public std::optional<facebook::react::SharedColor> tintColor;
25852585
public std::string resizeMethod;
25862586
public virtual facebook::react::ComponentName getDiffPropsImplementationTarget() const override;

‎scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4954,17 +4954,17 @@ class facebook::react::ImageManager {
49544954
class facebook::react::ImageProps : public facebook::react::HostPlatformViewProps {
49554955
public ImageProps() = default;
49564956
public ImageProps(const facebook::react::PropsParserContext& context, const facebook::react::ImageProps& sourceProps, const facebook::react::RawProps& rawProps);
4957-
public bool progressiveRenderingEnabled;
49584957
public bool shouldNotifyLoadEvents;
49594958
public facebook::react::EdgeInsets capInsets;
49604959
public facebook::react::Float blurRadius;
4961-
public facebook::react::Float fadeDuration;
49624960
public facebook::react::Float resizeMultiplier;
49634961
public facebook::react::ImageResizeMode resizeMode;
49644962
public facebook::react::ImageSource defaultSource;
49654963
public facebook::react::ImageSource loadingIndicatorSource;
49664964
public facebook::react::ImageSources sources;
49674965
public facebook::react::SharedColor overlayColor;
4966+
public std::optional<bool> progressiveRenderingEnabled;
4967+
public std::optional<facebook::react::Float> fadeDuration;
49684968
public std::optional<facebook::react::SharedColor> tintColor;
49694969
public std::string resizeMethod;
49704970
public void setProp(const facebook::react::PropsParserContext& context, facebook::react::RawPropsPropNameHash hash, const char* propName, const facebook::react::RawValue& value);

‎scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4929,17 +4929,17 @@ class facebook::react::ImageManager {
49294929
class facebook::react::ImageProps : public facebook::react::HostPlatformViewProps {
49304930
public ImageProps() = default;
49314931
public ImageProps(const facebook::react::PropsParserContext& context, const facebook::react::ImageProps& sourceProps, const facebook::react::RawProps& rawProps);
4932-
public bool progressiveRenderingEnabled;
49334932
public bool shouldNotifyLoadEvents;
49344933
public facebook::react::EdgeInsets capInsets;
49354934
public facebook::react::Float blurRadius;
4936-
public facebook::react::Float fadeDuration;
49374935
public facebook::react::Float resizeMultiplier;
49384936
public facebook::react::ImageResizeMode resizeMode;
49394937
public facebook::react::ImageSource defaultSource;
49404938
public facebook::react::ImageSource loadingIndicatorSource;
49414939
public facebook::react::ImageSources sources;
49424940
public facebook::react::SharedColor overlayColor;
4941+
public std::optional<bool> progressiveRenderingEnabled;
4942+
public std::optional<facebook::react::Float> fadeDuration;
49434943
public std::optional<facebook::react::SharedColor> tintColor;
49444944
public std::string resizeMethod;
49454945
public void setProp(const facebook::react::PropsParserContext& context, facebook::react::RawPropsPropNameHash hash, const char* propName, const facebook::react::RawValue& value);

‎scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4951,17 +4951,17 @@ class facebook::react::ImageManager {
49514951
class facebook::react::ImageProps : public facebook::react::HostPlatformViewProps {
49524952
public ImageProps() = default;
49534953
public ImageProps(const facebook::react::PropsParserContext& context, const facebook::react::ImageProps& sourceProps, const facebook::react::RawProps& rawProps);
4954-
public bool progressiveRenderingEnabled;
49554954
public bool shouldNotifyLoadEvents;
49564955
public facebook::react::EdgeInsets capInsets;
49574956
public facebook::react::Float blurRadius;
4958-
public facebook::react::Float fadeDuration;
49594957
public facebook::react::Float resizeMultiplier;
49604958
public facebook::react::ImageResizeMode resizeMode;
49614959
public facebook::react::ImageSource defaultSource;
49624960
public facebook::react::ImageSource loadingIndicatorSource;
49634961
public facebook::react::ImageSources sources;
49644962
public facebook::react::SharedColor overlayColor;
4963+
public std::optional<bool> progressiveRenderingEnabled;
4964+
public std::optional<facebook::react::Float> fadeDuration;
49654965
public std::optional<facebook::react::SharedColor> tintColor;
49664966
public std::string resizeMethod;
49674967
public void setProp(const facebook::react::PropsParserContext& context, facebook::react::RawPropsPropNameHash hash, const char* propName, const facebook::react::RawValue& value);

0 commit comments

Comments
 (0)