From 7623a1ba22d664f8814225ede795ad6daef82d0d Mon Sep 17 00:00:00 2001 From: DaveyEke Date: Mon, 11 May 2026 17:16:39 +0100 Subject: [PATCH] fix(android): fixed image loading priority on android --- .../margelo/nitro/image/HybridImageView.kt | 2 + .../ios/HybridImageView.swift | 1 + .../generated/android/NitroImageOnLoad.cpp | 16 ++-- .../nitrogen/generated/android/c++/JColor.hpp | 2 +- .../android/c++/JEncodedImageData.hpp | 2 +- .../android/c++/JHybridImageFactorySpec.hpp | 4 +- .../c++/JHybridImageLoaderFactorySpec.hpp | 4 +- .../android/c++/JHybridImageLoaderSpec.hpp | 4 +- .../android/c++/JHybridImageSpec.hpp | 4 +- .../android/c++/JHybridImageUtilsSpec.hpp | 4 +- .../android/c++/JHybridNitroImageViewSpec.cpp | 11 ++- .../android/c++/JHybridNitroImageViewSpec.hpp | 6 +- .../generated/android/c++/JImageFormat.hpp | 2 +- .../generated/android/c++/JPixelFormat.hpp | 2 +- .../generated/android/c++/JRawPixelData.hpp | 2 +- .../generated/android/c++/JResizeMode.hpp | 2 +- ..._HybridImageSpec_HybridImageLoaderSpec.hpp | 6 +- .../JHybridNitroImageViewStateUpdater.cpp | 4 + .../kotlin/com/margelo/nitro/image/Color.kt | 19 ----- .../margelo/nitro/image/EncodedImageData.kt | 19 ----- .../nitro/image/HybridNitroImageViewSpec.kt | 6 ++ .../com/margelo/nitro/image/RawPixelData.kt | 19 ----- ...t_HybridImageSpec_HybridImageLoaderSpec.kt | 23 ++---- .../views/HybridNitroImageViewManager.kt | 14 +--- .../generated/ios/NitroImage+autolinking.rb | 2 - .../ios/c++/HybridNitroImageViewSpecSwift.hpp | 9 ++- .../views/HybridNitroImageViewComponent.mm | 20 ++--- .../ios/swift/HybridNitroImageViewSpec.swift | 1 + .../swift/HybridNitroImageViewSpec_cxx.swift | 28 ++++++- ...ageSpec___any_HybridImageLoaderSpec_.swift | 12 --- .../shared/c++/HybridNitroImageViewSpec.cpp | 2 + .../shared/c++/HybridNitroImageViewSpec.hpp | 4 +- .../views/HybridNitroImageViewComponent.cpp | 11 +++ .../views/HybridNitroImageViewComponent.hpp | 3 +- .../shared/json/NitroImageViewConfig.json | 1 + .../src/specs/ImageView.nitro.ts | 15 ++++ .../nitro/web/image/HybridWebImageFactory.kt | 9 ++- .../nitro/web/image/HybridWebImageLoader.kt | 10 +++ .../AsyncImagePriority+toCoroutineContext.kt | 14 ---- .../ImageRequestBuilder+applyOptions.kt | 7 +- .../web/image/interceptors/PriorityGate.kt | 72 +++++++++++++++++ .../image/interceptors/PriorityInterceptor.kt | 15 ++++ ...ImageLoadOptions+toSDWebImageOptions.swift | 9 +-- .../ios/HybridWebImageLoader.swift | 19 +++-- .../generated/android/NitroWebImageOnLoad.cpp | 4 +- .../android/c++/JAsyncImageLoadOptions.hpp | 14 ++-- .../android/c++/JAsyncImagePriority.hpp | 61 -------------- .../c++/JHybridWebImageFactorySpec.cpp | 4 - .../c++/JHybridWebImageFactorySpec.hpp | 4 +- .../nitro/web/image/AsyncImageLoadOptions.kt | 37 +-------- .../nitro/web/image/AsyncImagePriority.kt | 24 ------ .../ios/NitroWebImage+autolinking.rb | 2 - .../ios/NitroWebImage-Swift-Cxx-Bridge.hpp | 17 ++-- .../ios/NitroWebImage-Swift-Cxx-Umbrella.hpp | 3 - .../c++/HybridWebImageFactorySpecSwift.hpp | 3 - .../ios/swift/AsyncImageLoadOptions.swift | 17 ++-- .../ios/swift/AsyncImagePriority.swift | 44 ---------- .../shared/c++/AsyncImageLoadOptions.hpp | 14 ++-- .../shared/c++/AsyncImagePriority.hpp | 80 ------------------- .../src/specs/WebImageFactory.nitro.ts | 7 +- 60 files changed, 297 insertions(+), 479 deletions(-) delete mode 100644 packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/extensions/AsyncImagePriority+toCoroutineContext.kt create mode 100644 packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/interceptors/PriorityGate.kt create mode 100644 packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/interceptors/PriorityInterceptor.kt delete mode 100644 packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JAsyncImagePriority.hpp delete mode 100644 packages/react-native-nitro-web-image/nitrogen/generated/android/kotlin/com/margelo/nitro/web/image/AsyncImagePriority.kt delete mode 100644 packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/AsyncImagePriority.swift delete mode 100644 packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/AsyncImagePriority.hpp diff --git a/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridImageView.kt b/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridImageView.kt index 672c3e2c..a6732bcc 100644 --- a/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridImageView.kt +++ b/packages/react-native-nitro-image/android/src/main/java/com/margelo/nitro/image/HybridImageView.kt @@ -49,6 +49,8 @@ class HybridImageView(context: Context): HybridNitroImageViewSpec(), RecyclableV field = value } + override var priority: Double? = null + override fun prepareForRecycle() { onDisappear() imageView.setImageBitmap(null) diff --git a/packages/react-native-nitro-image/ios/HybridImageView.swift b/packages/react-native-nitro-image/ios/HybridImageView.swift index 96f47848..531c8f86 100644 --- a/packages/react-native-nitro-image/ios/HybridImageView.swift +++ b/packages/react-native-nitro-image/ios/HybridImageView.swift @@ -37,6 +37,7 @@ class HybridImageView: HybridNitroImageViewSpec { resetImageBeforeLoad = recyclingKey != oldValue } } + var priority: Double? = nil private func updateResizeMode() { let mode = resizeMode ?? .cover diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/NitroImageOnLoad.cpp b/packages/react-native-nitro-image/nitrogen/generated/android/NitroImageOnLoad.cpp index 7ed3065e..e3134c60 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/NitroImageOnLoad.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/NitroImageOnLoad.cpp @@ -33,33 +33,33 @@ int initialize(JavaVM* vm) { } struct JHybridImageFactorySpecImpl: public jni::JavaClass { - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageFactory;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageFactory;"; static std::shared_ptr create() { - static const auto constructorFn = javaClassStatic()->getConstructor(); + static auto constructorFn = javaClassStatic()->getConstructor(); jni::local_ref javaPart = javaClassStatic()->newObject(constructorFn); return javaPart->getJHybridImageFactorySpec(); } }; struct JHybridImageLoaderFactorySpecImpl: public jni::JavaClass { - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageLoaderFactory;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageLoaderFactory;"; static std::shared_ptr create() { - static const auto constructorFn = javaClassStatic()->getConstructor(); + static auto constructorFn = javaClassStatic()->getConstructor(); jni::local_ref javaPart = javaClassStatic()->newObject(constructorFn); return javaPart->getJHybridImageLoaderFactorySpec(); } }; struct JHybridImageUtilsSpecImpl: public jni::JavaClass { - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageUtils;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageUtils;"; static std::shared_ptr create() { - static const auto constructorFn = javaClassStatic()->getConstructor(); + static auto constructorFn = javaClassStatic()->getConstructor(); jni::local_ref javaPart = javaClassStatic()->newObject(constructorFn); return javaPart->getJHybridImageUtilsSpec(); } }; struct JHybridNitroImageViewSpecImpl: public jni::JavaClass { - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageView;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageView;"; static std::shared_ptr create() { - static const auto constructorFn = javaClassStatic()->getConstructor(); + static auto constructorFn = javaClassStatic()->getConstructor(); jni::local_ref javaPart = javaClassStatic()->newObject(constructorFn); return javaPart->getJHybridNitroImageViewSpec(); } diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JColor.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JColor.hpp index 52790ffb..97c72cce 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JColor.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JColor.hpp @@ -21,7 +21,7 @@ namespace margelo::nitro::image { */ struct JColor final: public jni::JavaClass { public: - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/Color;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/Color;"; public: /** diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JEncodedImageData.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JEncodedImageData.hpp index a1f69432..d7d8203d 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JEncodedImageData.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JEncodedImageData.hpp @@ -24,7 +24,7 @@ namespace margelo::nitro::image { */ struct JEncodedImageData final: public jni::JavaClass { public: - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/EncodedImageData;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/EncodedImageData;"; public: /** diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageFactorySpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageFactorySpec.hpp index 3b4d3fe4..1868afdc 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageFactorySpec.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageFactorySpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::image { class JHybridImageFactorySpec: public virtual HybridImageFactorySpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageFactorySpec;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageFactorySpec;"; std::shared_ptr getJHybridImageFactorySpec(); }; struct CxxPart: public jni::HybridClass { - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageFactorySpec$CxxPart;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageFactorySpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageLoaderFactorySpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageLoaderFactorySpec.hpp index e32cc07a..b359cd8c 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageLoaderFactorySpec.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageLoaderFactorySpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::image { class JHybridImageLoaderFactorySpec: public virtual HybridImageLoaderFactorySpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageLoaderFactorySpec;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageLoaderFactorySpec;"; std::shared_ptr getJHybridImageLoaderFactorySpec(); }; struct CxxPart: public jni::HybridClass { - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageLoaderFactorySpec$CxxPart;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageLoaderFactorySpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageLoaderSpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageLoaderSpec.hpp index 169d3f42..6cad8fbe 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageLoaderSpec.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageLoaderSpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::image { class JHybridImageLoaderSpec: public virtual HybridImageLoaderSpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageLoaderSpec;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageLoaderSpec;"; std::shared_ptr getJHybridImageLoaderSpec(); }; struct CxxPart: public jni::HybridClass { - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageLoaderSpec$CxxPart;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageLoaderSpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageSpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageSpec.hpp index 88e7488a..08d58891 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageSpec.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageSpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::image { class JHybridImageSpec: public virtual HybridImageSpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageSpec;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageSpec;"; std::shared_ptr getJHybridImageSpec(); }; struct CxxPart: public jni::HybridClass { - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageSpec$CxxPart;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageSpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageUtilsSpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageUtilsSpec.hpp index 39265a4a..72791689 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageUtilsSpec.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridImageUtilsSpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::image { class JHybridImageUtilsSpec: public virtual HybridImageUtilsSpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageUtilsSpec;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageUtilsSpec;"; std::shared_ptr getJHybridImageUtilsSpec(); }; struct CxxPart: public jni::HybridClass { - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageUtilsSpec$CxxPart;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/HybridImageUtilsSpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridNitroImageViewSpec.cpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridNitroImageViewSpec.cpp index cdb27588..d92d5947 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridNitroImageViewSpec.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridNitroImageViewSpec.cpp @@ -14,11 +14,11 @@ namespace margelo::nitro::image { class HybridImageLoaderSpec; } // Forward declaration of `ResizeMode` to properly resolve imports. namespace margelo::nitro::image { enum class ResizeMode; } +#include #include #include "HybridImageSpec.hpp" #include "HybridImageLoaderSpec.hpp" #include -#include #include "JVariant_HybridImageSpec_HybridImageLoaderSpec.hpp" #include "JHybridImageSpec.hpp" #include "JHybridImageLoaderSpec.hpp" @@ -56,6 +56,15 @@ namespace margelo::nitro::image { } // Properties + std::optional JHybridNitroImageViewSpec::getPriority() { + static const auto method = _javaPart->javaClassStatic()->getMethod()>("getPriority"); + auto __result = method(_javaPart); + return __result != nullptr ? std::make_optional(__result->value()) : std::nullopt; + } + void JHybridNitroImageViewSpec::setPriority(std::optional priority) { + static const auto method = _javaPart->javaClassStatic()->getMethod /* priority */)>("setPriority"); + method(_javaPart, priority.has_value() ? jni::JDouble::valueOf(priority.value()) : nullptr); + } std::optional, std::shared_ptr>> JHybridNitroImageViewSpec::getImage() { static const auto method = _javaPart->javaClassStatic()->getMethod()>("getImage"); auto __result = method(_javaPart); diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridNitroImageViewSpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridNitroImageViewSpec.hpp index 42681e55..747bba74 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridNitroImageViewSpec.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JHybridNitroImageViewSpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::image { class JHybridNitroImageViewSpec: public virtual HybridNitroImageViewSpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/HybridNitroImageViewSpec;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/HybridNitroImageViewSpec;"; std::shared_ptr getJHybridNitroImageViewSpec(); }; struct CxxPart: public jni::HybridClass { - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/HybridNitroImageViewSpec$CxxPart;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/HybridNitroImageViewSpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; @@ -50,6 +50,8 @@ namespace margelo::nitro::image { public: // Properties + std::optional getPriority() override; + void setPriority(std::optional priority) override; std::optional, std::shared_ptr>> getImage() override; void setImage(const std::optional, std::shared_ptr>>& image) override; std::optional getResizeMode() override; diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JImageFormat.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JImageFormat.hpp index 5e65e8bb..9562ed57 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JImageFormat.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JImageFormat.hpp @@ -19,7 +19,7 @@ namespace margelo::nitro::image { */ struct JImageFormat final: public jni::JavaClass { public: - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/ImageFormat;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/ImageFormat;"; public: /** diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JPixelFormat.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JPixelFormat.hpp index ee91de76..6575aee3 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JPixelFormat.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JPixelFormat.hpp @@ -19,7 +19,7 @@ namespace margelo::nitro::image { */ struct JPixelFormat final: public jni::JavaClass { public: - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/PixelFormat;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/PixelFormat;"; public: /** diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JRawPixelData.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JRawPixelData.hpp index 0a799406..047632c1 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JRawPixelData.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JRawPixelData.hpp @@ -24,7 +24,7 @@ namespace margelo::nitro::image { */ struct JRawPixelData final: public jni::JavaClass { public: - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/RawPixelData;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/RawPixelData;"; public: /** diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JResizeMode.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JResizeMode.hpp index 5c22b5f1..be289a5e 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JResizeMode.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JResizeMode.hpp @@ -19,7 +19,7 @@ namespace margelo::nitro::image { */ struct JResizeMode final: public jni::JavaClass { public: - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/ResizeMode;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/ResizeMode;"; public: /** diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JVariant_HybridImageSpec_HybridImageLoaderSpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JVariant_HybridImageSpec_HybridImageLoaderSpec.hpp index ff3a6fd7..54f585ab 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/JVariant_HybridImageSpec_HybridImageLoaderSpec.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/JVariant_HybridImageSpec_HybridImageLoaderSpec.hpp @@ -26,7 +26,7 @@ namespace margelo::nitro::image { */ class JVariant_HybridImageSpec_HybridImageLoaderSpec: public jni::JavaClass { public: - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/Variant_HybridImageSpec_HybridImageLoaderSpec;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/Variant_HybridImageSpec_HybridImageLoaderSpec;"; static jni::local_ref create_0(jni::alias_ref value) { static const auto method = javaClassStatic()->getStaticMethod)>("create"); @@ -51,7 +51,7 @@ namespace margelo::nitro::image { namespace JVariant_HybridImageSpec_HybridImageLoaderSpec_impl { class First final: public jni::JavaClass { public: - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/Variant_HybridImageSpec_HybridImageLoaderSpec$First;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/Variant_HybridImageSpec_HybridImageLoaderSpec$First;"; [[nodiscard]] jni::local_ref getValue() const { static const auto field = javaClassStatic()->getField("value"); @@ -61,7 +61,7 @@ namespace margelo::nitro::image { class Second final: public jni::JavaClass { public: - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/image/Variant_HybridImageSpec_HybridImageLoaderSpec$Second;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/image/Variant_HybridImageSpec_HybridImageLoaderSpec$Second;"; [[nodiscard]] jni::local_ref getValue() const { static const auto field = javaClassStatic()->getField("value"); diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/c++/views/JHybridNitroImageViewStateUpdater.cpp b/packages/react-native-nitro-image/nitrogen/generated/android/c++/views/JHybridNitroImageViewStateUpdater.cpp index 81eb6e4c..354fa012 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/c++/views/JHybridNitroImageViewStateUpdater.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/android/c++/views/JHybridNitroImageViewStateUpdater.cpp @@ -37,6 +37,10 @@ void JHybridNitroImageViewStateUpdater::updateViewProps(jni::alias_refpriority.isDirty) { + hybridView->setPriority(props->priority.value); + props->priority.isDirty = false; + } if (props->image.isDirty) { hybridView->setImage(props->image.value); props->image.isDirty = false; diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/Color.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/Color.kt index 8bd3a854..8d0ef746 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/Color.kt +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/Color.kt @@ -9,7 +9,6 @@ package com.margelo.nitro.image import androidx.annotation.Keep import com.facebook.proguard.annotations.DoNotStrip -import java.util.Objects /** @@ -33,24 +32,6 @@ data class Color( ) { /* primary constructor */ - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is Color) return false - return Objects.deepEquals(this.r, other.r) - && Objects.deepEquals(this.g, other.g) - && Objects.deepEquals(this.b, other.b) - && Objects.deepEquals(this.a, other.a) - } - - override fun hashCode(): Int { - return arrayOf( - r, - g, - b, - a - ).contentDeepHashCode() - } - companion object { /** * Constructor called from C++ diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/EncodedImageData.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/EncodedImageData.kt index b07a2cfa..8b34c579 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/EncodedImageData.kt +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/EncodedImageData.kt @@ -9,7 +9,6 @@ package com.margelo.nitro.image import androidx.annotation.Keep import com.facebook.proguard.annotations.DoNotStrip -import java.util.Objects import com.margelo.nitro.core.ArrayBuffer /** @@ -33,24 +32,6 @@ data class EncodedImageData( ) { /* primary constructor */ - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is EncodedImageData) return false - return Objects.deepEquals(this.buffer, other.buffer) - && Objects.deepEquals(this.width, other.width) - && Objects.deepEquals(this.height, other.height) - && Objects.deepEquals(this.imageFormat, other.imageFormat) - } - - override fun hashCode(): Int { - return arrayOf( - buffer, - width, - height, - imageFormat - ).contentDeepHashCode() - } - companion object { /** * Constructor called from C++ diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridNitroImageViewSpec.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridNitroImageViewSpec.kt index 2781d821..bb489973 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridNitroImageViewSpec.kt +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/HybridNitroImageViewSpec.kt @@ -26,6 +26,12 @@ import com.margelo.nitro.views.HybridView ) abstract class HybridNitroImageViewSpec: HybridView() { // Properties + @get:DoNotStrip + @get:Keep + @set:DoNotStrip + @set:Keep + abstract var priority: Double? + @get:DoNotStrip @get:Keep @set:DoNotStrip diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/RawPixelData.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/RawPixelData.kt index 1284ef23..e1f9a2a0 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/RawPixelData.kt +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/RawPixelData.kt @@ -9,7 +9,6 @@ package com.margelo.nitro.image import androidx.annotation.Keep import com.facebook.proguard.annotations.DoNotStrip -import java.util.Objects import com.margelo.nitro.core.ArrayBuffer /** @@ -33,24 +32,6 @@ data class RawPixelData( ) { /* primary constructor */ - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is RawPixelData) return false - return Objects.deepEquals(this.buffer, other.buffer) - && Objects.deepEquals(this.width, other.width) - && Objects.deepEquals(this.height, other.height) - && Objects.deepEquals(this.pixelFormat, other.pixelFormat) - } - - override fun hashCode(): Int { - return arrayOf( - buffer, - width, - height, - pixelFormat - ).contentDeepHashCode() - } - companion object { /** * Constructor called from C++ diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/Variant_HybridImageSpec_HybridImageLoaderSpec.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/Variant_HybridImageSpec_HybridImageLoaderSpec.kt index bb35963f..d3d9c2ac 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/Variant_HybridImageSpec_HybridImageLoaderSpec.kt +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/Variant_HybridImageSpec_HybridImageLoaderSpec.kt @@ -21,22 +21,6 @@ sealed class Variant_HybridImageSpec_HybridImageLoaderSpec { @DoNotStrip data class Second(@DoNotStrip val value: HybridImageLoaderSpec): Variant_HybridImageSpec_HybridImageLoaderSpec() - inline fun asType(): T? { - return when (this) { - is First -> (value) as? T - is Second -> (value) as? T - } - } - inline fun isType(): Boolean { - return asType() != null - } - inline fun match(first: (HybridImageSpec) -> R, second: (HybridImageLoaderSpec) -> R): R { - return when (this) { - is First -> first(value) - is Second -> second(value) - } - } - val isFirst: Boolean get() = this is First val isSecond: Boolean @@ -51,6 +35,13 @@ sealed class Variant_HybridImageSpec_HybridImageLoaderSpec { return value } + inline fun match(first: (HybridImageSpec) -> R, second: (HybridImageLoaderSpec) -> R): R { + return when (this) { + is First -> first(value) + is Second -> second(value) + } + } + companion object { @JvmStatic @DoNotStrip diff --git a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/views/HybridNitroImageViewManager.kt b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/views/HybridNitroImageViewManager.kt index a0c23213..04e93ccd 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/views/HybridNitroImageViewManager.kt +++ b/packages/react-native-nitro-image/nitrogen/generated/android/kotlin/com/margelo/nitro/image/views/HybridNitroImageViewManager.kt @@ -39,7 +39,7 @@ public class HybridNitroImageViewManager: SimpleViewManager() { } override fun updateState(view: View, props: ReactStylesDiffMap, stateWrapper: StateWrapper): Any? { - val hybridView = getHybridView(view) + val hybridView = view.getTag(associated_hybrid_view_tag) as? HybridImageView ?: throw Error("Couldn't find view $view in local views table!") // 1. Update each prop individually @@ -51,15 +51,9 @@ public class HybridNitroImageViewManager: SimpleViewManager() { return super.updateState(view, props, stateWrapper) } - override fun onDropViewInstance(view: View) { - val hybridView = getHybridView(view) - hybridView?.onDropView() - return super.onDropViewInstance(view) - } - protected override fun prepareToRecycleView(reactContext: ThemedReactContext, view: View): View? { super.prepareToRecycleView(reactContext, view) - val hybridView = getHybridView(view) + val hybridView = view.getTag(associated_hybrid_view_tag) as? HybridImageView ?: return null @Suppress("USELESS_IS_CHECK") @@ -73,8 +67,4 @@ public class HybridNitroImageViewManager: SimpleViewManager() { return null } } - - private fun getHybridView(view: View): HybridImageView? { - return view.getTag(associated_hybrid_view_tag) as? HybridImageView - } } diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage+autolinking.rb b/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage+autolinking.rb index 06be8b7b..90cf3058 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage+autolinking.rb +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/NitroImage+autolinking.rb @@ -56,7 +56,5 @@ def add_nitrogen_files(spec) "SWIFT_OBJC_INTEROP_MODE" => "objcxx", # Enables stricter modular headers "DEFINES_MODULE" => "YES", - # Disable auto-generated ObjC header for Swift (Static linkage on Xcode 26.4 breaks here) - "SWIFT_INSTALL_OBJC_HEADER" => "NO", }) end diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridNitroImageViewSpecSwift.hpp b/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridNitroImageViewSpecSwift.hpp index b794f603..7da398f4 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridNitroImageViewSpecSwift.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/c++/HybridNitroImageViewSpecSwift.hpp @@ -19,11 +19,11 @@ namespace margelo::nitro::image { class HybridImageLoaderSpec; } // Forward declaration of `ResizeMode` to properly resolve imports. namespace margelo::nitro::image { enum class ResizeMode; } +#include #include #include "HybridImageSpec.hpp" #include "HybridImageLoaderSpec.hpp" #include -#include #include "ResizeMode.hpp" #include @@ -73,6 +73,13 @@ namespace margelo::nitro::image { public: // Properties + inline std::optional getPriority() noexcept override { + auto __result = _swiftPart.getPriority(); + return __result; + } + inline void setPriority(std::optional priority) noexcept override { + _swiftPart.setPriority(priority); + } inline std::optional, std::shared_ptr>> getImage() noexcept override { auto __result = _swiftPart.getImage(); return __result; diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/c++/views/HybridNitroImageViewComponent.mm b/packages/react-native-nitro-image/nitrogen/generated/ios/c++/views/HybridNitroImageViewComponent.mm index 176e7b23..8a7336a0 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/c++/views/HybridNitroImageViewComponent.mm +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/c++/views/HybridNitroImageViewComponent.mm @@ -17,13 +17,6 @@ #import "HybridNitroImageViewSpecSwift.hpp" #import "NitroImage-Swift-Cxx-Umbrella.hpp" -#if __has_include() -#include -#if REACT_NATIVE_VERSION_MINOR >= 82 -#define ENABLE_RCT_COMPONENT_VIEW_INVALIDATE -#endif -#endif - using namespace facebook; using namespace margelo::nitro::image; using namespace margelo::nitro::image::views; @@ -79,6 +72,11 @@ - (void) updateProps:(const std::shared_ptr&)props // 2. Update each prop individually swiftPart.beforeUpdate(); + // priority: optional + if (newViewProps.priority.isDirty) { + swiftPart.setPriority(newViewProps.priority.value); + newViewProps.priority.isDirty = false; + } // image: optional if (newViewProps.image.isDirty) { swiftPart.setImage(newViewProps.image.value); @@ -121,12 +119,4 @@ - (void)prepareForRecycle { swiftPart.maybePrepareForRecycle(); } -#ifdef ENABLE_RCT_COMPONENT_VIEW_INVALIDATE -- (void)invalidate { - NitroImage::HybridNitroImageViewSpec_cxx& swiftPart = _hybridView->getSwiftPart(); - swiftPart.onDropView(); - [super invalidate]; -} -#endif - @end diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridNitroImageViewSpec.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridNitroImageViewSpec.swift index 07709254..01858bab 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridNitroImageViewSpec.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridNitroImageViewSpec.swift @@ -10,6 +10,7 @@ import NitroModules /// See ``HybridNitroImageViewSpec`` public protocol HybridNitroImageViewSpec_protocol: HybridObject, HybridView { // Properties + var priority: Double? { get set } var image: Variant__any_HybridImageSpec___any_HybridImageLoaderSpec_? { get set } var resizeMode: ResizeMode? { get set } var recyclingKey: String? { get set } diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridNitroImageViewSpec_cxx.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridNitroImageViewSpec_cxx.swift index 7f878b7c..fbb41277 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridNitroImageViewSpec_cxx.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridNitroImageViewSpec_cxx.swift @@ -121,6 +121,30 @@ open class HybridNitroImageViewSpec_cxx { } // Properties + public final var priority: bridge.std__optional_double_ { + @inline(__always) + get { + return { () -> bridge.std__optional_double_ in + if let __unwrappedValue = self.__implementation.priority { + return bridge.create_std__optional_double_(__unwrappedValue) + } else { + return .init() + } + }() + } + @inline(__always) + set { + self.__implementation.priority = { () -> Double? in + if bridge.has_value_std__optional_double_(newValue) { + let __unwrapped = bridge.get_std__optional_double_(newValue) + return __unwrapped + } else { + return nil + } + }() + } + } + public final var image: bridge.std__optional_std__variant_std__shared_ptr_HybridImageSpec___std__shared_ptr_HybridImageLoaderSpec___ { @inline(__always) get { @@ -236,8 +260,4 @@ open class HybridNitroImageViewSpec_cxx { guard let recyclable = __implementation as? any RecyclableView else { return } recyclable.prepareForRecycle() } - - public final func onDropView() { - __implementation.onDropView() - } } diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/Variant__any_HybridImageSpec___any_HybridImageLoaderSpec_.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/Variant__any_HybridImageSpec___any_HybridImageLoaderSpec_.swift index 1af85907..63b54cd8 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/Variant__any_HybridImageSpec___any_HybridImageLoaderSpec_.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/Variant__any_HybridImageSpec___any_HybridImageLoaderSpec_.swift @@ -16,15 +16,3 @@ public indirect enum Variant__any_HybridImageSpec___any_HybridImageLoaderSpec_ { case first((any HybridImageSpec)) case second((any HybridImageLoaderSpec)) } - -public extension Variant__any_HybridImageSpec___any_HybridImageLoaderSpec_ { - func asType(_ type: T.Type = T.self) -> T? { - switch self { - case .first(let value): return value as? T - case .second(let value): return value as? T - } - } - func isType(_ type: T.Type = T.self) -> Bool { - return self.asType(type) != nil - } -} diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridNitroImageViewSpec.cpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridNitroImageViewSpec.cpp index 04c55de6..2710f86a 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridNitroImageViewSpec.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridNitroImageViewSpec.cpp @@ -14,6 +14,8 @@ namespace margelo::nitro::image { HybridObject::loadHybridMethods(); // load custom methods/properties registerHybrids(this, [](Prototype& prototype) { + prototype.registerHybridGetter("priority", &HybridNitroImageViewSpec::getPriority); + prototype.registerHybridSetter("priority", &HybridNitroImageViewSpec::setPriority); prototype.registerHybridGetter("image", &HybridNitroImageViewSpec::getImage); prototype.registerHybridSetter("image", &HybridNitroImageViewSpec::setImage); prototype.registerHybridGetter("resizeMode", &HybridNitroImageViewSpec::getResizeMode); diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridNitroImageViewSpec.hpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridNitroImageViewSpec.hpp index 61e4e744..0590baaa 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridNitroImageViewSpec.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/HybridNitroImageViewSpec.hpp @@ -20,11 +20,11 @@ namespace margelo::nitro::image { class HybridImageLoaderSpec; } // Forward declaration of `ResizeMode` to properly resolve imports. namespace margelo::nitro::image { enum class ResizeMode; } +#include #include #include "HybridImageSpec.hpp" #include "HybridImageLoaderSpec.hpp" #include -#include #include "ResizeMode.hpp" #include @@ -55,6 +55,8 @@ namespace margelo::nitro::image { public: // Properties + virtual std::optional getPriority() = 0; + virtual void setPriority(std::optional priority) = 0; virtual std::optional, std::shared_ptr>> getImage() = 0; virtual void setImage(const std::optional, std::shared_ptr>>& image) = 0; virtual std::optional getResizeMode() = 0; diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/views/HybridNitroImageViewComponent.cpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/views/HybridNitroImageViewComponent.cpp index cdae2e81..5c191c7a 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/views/HybridNitroImageViewComponent.cpp +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/views/HybridNitroImageViewComponent.cpp @@ -26,6 +26,16 @@ namespace margelo::nitro::image::views { const HybridNitroImageViewProps& sourceProps, const react::RawProps& rawProps): react::ViewProps(context, sourceProps, rawProps, filterObjectKeys), + priority([&]() -> CachedProp> { + try { + const react::RawValue* rawValue = rawProps.at("priority", nullptr, nullptr); + if (rawValue == nullptr) return sourceProps.priority; + const auto& [runtime, value] = (std::pair)*rawValue; + return CachedProp>::fromRawValue(*runtime, value, sourceProps.priority); + } catch (const std::exception& exc) { + throw std::runtime_error(std::string("NitroImageView.priority: ") + exc.what()); + } + }()), image([&]() -> CachedProp, std::shared_ptr>>> { try { const react::RawValue* rawValue = rawProps.at("image", nullptr, nullptr); @@ -69,6 +79,7 @@ namespace margelo::nitro::image::views { bool HybridNitroImageViewProps::filterObjectKeys(const std::string& propName) { switch (hashString(propName)) { + case hashString("priority"): return true; case hashString("image"): return true; case hashString("resizeMode"): return true; case hashString("recyclingKey"): return true; diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/views/HybridNitroImageViewComponent.hpp b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/views/HybridNitroImageViewComponent.hpp index 91248b9e..1188bda6 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/c++/views/HybridNitroImageViewComponent.hpp +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/c++/views/HybridNitroImageViewComponent.hpp @@ -16,11 +16,11 @@ #include #include +#include #include #include "HybridImageSpec.hpp" #include "HybridImageLoaderSpec.hpp" #include -#include #include "ResizeMode.hpp" #include #include "HybridNitroImageViewSpec.hpp" @@ -46,6 +46,7 @@ namespace margelo::nitro::image::views { const react::RawProps& rawProps); public: + CachedProp> priority; CachedProp, std::shared_ptr>>> image; CachedProp> resizeMode; CachedProp> recyclingKey; diff --git a/packages/react-native-nitro-image/nitrogen/generated/shared/json/NitroImageViewConfig.json b/packages/react-native-nitro-image/nitrogen/generated/shared/json/NitroImageViewConfig.json index e376831b..7445eca5 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/shared/json/NitroImageViewConfig.json +++ b/packages/react-native-nitro-image/nitrogen/generated/shared/json/NitroImageViewConfig.json @@ -4,6 +4,7 @@ "bubblingEventTypes": {}, "directEventTypes": {}, "validAttributes": { + "priority": true, "image": true, "resizeMode": true, "recyclingKey": true, diff --git a/packages/react-native-nitro-image/src/specs/ImageView.nitro.ts b/packages/react-native-nitro-image/src/specs/ImageView.nitro.ts index 572a3a69..afb98eff 100644 --- a/packages/react-native-nitro-image/src/specs/ImageView.nitro.ts +++ b/packages/react-native-nitro-image/src/specs/ImageView.nitro.ts @@ -15,7 +15,22 @@ import type { ImageLoader } from './ImageLoader.nitro' */ export type ResizeMode = 'cover' | 'contain' | 'center' | 'stretch' +/** + * Priority for loading an Image. + * - `0`: Low priority — the load is queued behind normal and high priority loads. + * - `1`: Normal priority — the default load behavior. + * - `2`: High priority — the load is started before normal and low priority loads. + */ +export type ImagePriority = 0 | 1 | 2 + export interface NativeNitroImageViewProps extends HybridViewProps { + /** + * Specifies the priority for loading the Image when multiple loads are queued + * at the same time. + * @see {@linkcode ImagePriority} + * @default 1 + */ + priority?: ImagePriority /** * Represents the image actually shown in this Image View. * - {@linkcode Image}: Shows a specific in-memory {@linkcode Image} diff --git a/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/HybridWebImageFactory.kt b/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/HybridWebImageFactory.kt index e282f35b..611fa118 100644 --- a/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/HybridWebImageFactory.kt +++ b/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/HybridWebImageFactory.kt @@ -10,13 +10,20 @@ import com.margelo.nitro.core.Promise import com.margelo.nitro.image.HybridImageLoaderSpec import com.margelo.nitro.image.HybridImageSpec import com.margelo.nitro.web.image.extensions.loadImageAsync +import com.margelo.nitro.web.image.interceptors.PriorityGate +import com.margelo.nitro.web.image.interceptors.PriorityInterceptor @DoNotStrip @Keep class HybridWebImageFactory: HybridWebImageFactorySpec() { private val context: ReactApplicationContext get() = NitroModules.applicationContext ?: throw Error("No context - NitroModules.applicationContext was null!") - private val imageLoader = ImageLoader(context) + private val numOfCoresAvailable = Runtime.getRuntime().availableProcessors() + private val maxConcurrentOperations = minOf(6, numOfCoresAvailable) + private val priorityGate = PriorityGate(maxConcurrentOperations = maxConcurrentOperations) + private val imageLoader = ImageLoader.Builder(context) + .components { add(PriorityInterceptor(priorityGate)) } + .build() override fun createWebImageLoader( url: String, diff --git a/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/HybridWebImageLoader.kt b/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/HybridWebImageLoader.kt index d4fd6b40..e5e47bdf 100644 --- a/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/HybridWebImageLoader.kt +++ b/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/HybridWebImageLoader.kt @@ -1,6 +1,7 @@ package com.margelo.nitro.web.image import android.content.Context +import android.util.Log import android.widget.ImageView import coil3.ImageLoader import coil3.load @@ -10,6 +11,7 @@ import com.margelo.nitro.image.HybridImageLoaderSpec import com.margelo.nitro.image.HybridNitroImageViewSpec import com.margelo.nitro.web.image.extensions.applyOptions import com.margelo.nitro.web.image.extensions.loadImageAsync +import com.margelo.nitro.web.image.interceptors.PriorityKey class HybridWebImageLoader(private val imageLoader: ImageLoader, private val url: String, @@ -22,8 +24,16 @@ class HybridWebImageLoader(private val imageLoader: ImageLoader, override fun requestImage(forView: HybridNitroImageViewSpec) { val imageView = forView.view as? ImageView ?: return + Log.d("WebImage", "requestImage start: $url (priority=${forView.priority})") imageView.load(url, imageLoader) { this.applyOptions(options) + forView.priority?.toInt()?.let { extras[PriorityKey] = it } + listener( + onStart = { Log.d("WebImage", "start: $url") }, + onSuccess = { _, _ -> Log.d("WebImage", "loaded: $url") }, + onError = { _, err -> Log.w("WebImage", "error: $url", err.throwable) }, + onCancel = { Log.d("WebImage", "cancel: $url") }, + ) } } diff --git a/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/extensions/AsyncImagePriority+toCoroutineContext.kt b/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/extensions/AsyncImagePriority+toCoroutineContext.kt deleted file mode 100644 index a15cb8b5..00000000 --- a/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/extensions/AsyncImagePriority+toCoroutineContext.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.margelo.nitro.web.image.extensions - -import com.margelo.nitro.web.image.AsyncImagePriority -import kotlinx.coroutines.Dispatchers -import kotlin.coroutines.CoroutineContext - -fun AsyncImagePriority.toCoroutineContext(): CoroutineContext? { - // TODO: Does this look about right? - return when (this) { - AsyncImagePriority.LOW -> Dispatchers.IO.limitedParallelism(2) - AsyncImagePriority.DEFAULT -> null - AsyncImagePriority.HIGH -> Dispatchers.IO - } -} diff --git a/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/extensions/ImageRequestBuilder+applyOptions.kt b/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/extensions/ImageRequestBuilder+applyOptions.kt index 6acec22d..02e57d29 100644 --- a/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/extensions/ImageRequestBuilder+applyOptions.kt +++ b/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/extensions/ImageRequestBuilder+applyOptions.kt @@ -7,17 +7,14 @@ import coil3.request.ImageRequest import coil3.request.allowHardware import coil3.size.Precision import com.margelo.nitro.web.image.AsyncImageLoadOptions +import com.margelo.nitro.web.image.interceptors.PriorityKey @OptIn(ExperimentalCoilApi::class) fun ImageRequest.Builder.applyOptions(options: AsyncImageLoadOptions?): ImageRequest.Builder { if (options == null) return this var result = this - if (options.priority != null) { - options.priority.toCoroutineContext()?.let { context -> - result = result.coroutineContext(context) - } - } + options.priority?.toInt()?.let { result.extras[PriorityKey] = it } if (options.forceRefresh == true) { // don't allow reading from cache, only writing. diff --git a/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/interceptors/PriorityGate.kt b/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/interceptors/PriorityGate.kt new file mode 100644 index 00000000..f87d915a --- /dev/null +++ b/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/interceptors/PriorityGate.kt @@ -0,0 +1,72 @@ +package com.margelo.nitro.web.image.interceptors + +import kotlinx.coroutines.CancellationException +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.NonCancellable +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock +import kotlinx.coroutines.withContext +import java.util.PriorityQueue + +class PriorityGate(private val maxConcurrentOperations: Int) { + init { require(maxConcurrentOperations > 0) { "maxConcurrentOperations must be > 0" } } + + private val mutex = Mutex() + private var currentlyRunningCount = 0 + private var nextArrivalSequenceNumber: Long = 0L + private val pendingRequestsByPriority = PriorityQueue( + compareByDescending { it.priority }.thenBy { it.arrivalSequenceNumber } + ) + + private class PendingRequest( + val priority: Int, + val arrivalSequenceNumber: Long, + val permitGrantedSignal: CompletableDeferred, + ) + + suspend fun withPermit(priority: Int, operation: suspend () -> T): T { + val permitGrantedSignal = CompletableDeferred() + var enqueuedRequest: PendingRequest? = null + + mutex.withLock { + if (currentlyRunningCount < maxConcurrentOperations) { + currentlyRunningCount++ + permitGrantedSignal.complete(Unit) + } else { + val request = PendingRequest(priority, nextArrivalSequenceNumber++, permitGrantedSignal) + enqueuedRequest = request + pendingRequestsByPriority.add(request) + } + } + + try { + permitGrantedSignal.await() + } catch (e: CancellationException) { + withContext(NonCancellable) { + val request = enqueuedRequest + val wasStillQueued = request != null && mutex.withLock { pendingRequestsByPriority.remove(request) } + if (!wasStillQueued) releasePermitAndPromoteNext() + } + throw e + } + + try { + return operation() + } finally { + withContext(NonCancellable) { releasePermitAndPromoteNext() } + } + } + + private suspend fun releasePermitAndPromoteNext() { + mutex.withLock { + while (true) { + val nextRequest = pendingRequestsByPriority.poll() + if (nextRequest == null) { + currentlyRunningCount-- + return@withLock + } + if (nextRequest.permitGrantedSignal.complete(Unit)) return@withLock + } + } + } +} diff --git a/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/interceptors/PriorityInterceptor.kt b/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/interceptors/PriorityInterceptor.kt new file mode 100644 index 00000000..ae2d9a33 --- /dev/null +++ b/packages/react-native-nitro-web-image/android/src/main/java/com/margelo/nitro/web/image/interceptors/PriorityInterceptor.kt @@ -0,0 +1,15 @@ +package com.margelo.nitro.web.image.interceptors + +import coil3.Extras +import coil3.getExtra +import coil3.intercept.Interceptor +import coil3.request.ImageResult + +val PriorityKey = Extras.Key(default = 1) + +class PriorityInterceptor(private val gate: PriorityGate) : Interceptor { + override suspend fun intercept(chain: Interceptor.Chain): ImageResult { + val priority = chain.request.getExtra(PriorityKey) + return gate.withPermit(priority) { chain.proceed() } + } +} diff --git a/packages/react-native-nitro-web-image/ios/Extensions/AsyncImageLoadOptions+toSDWebImageOptions.swift b/packages/react-native-nitro-web-image/ios/Extensions/AsyncImageLoadOptions+toSDWebImageOptions.swift index 6ef84d8b..4df2c51f 100644 --- a/packages/react-native-nitro-web-image/ios/Extensions/AsyncImageLoadOptions+toSDWebImageOptions.swift +++ b/packages/react-native-nitro-web-image/ios/Extensions/AsyncImageLoadOptions+toSDWebImageOptions.swift @@ -13,12 +13,9 @@ extension AsyncImageLoadOptions { var options: SDWebImageOptions = [] switch priority { - case .default, .none: - break - case .low: - options.insert(.lowPriority) - case .high: - options.insert(.highPriority) + case 0: options.insert(.lowPriority) + case 2: options.insert(.highPriority) + default: break } if forceRefresh == true { diff --git a/packages/react-native-nitro-web-image/ios/HybridWebImageLoader.swift b/packages/react-native-nitro-web-image/ios/HybridWebImageLoader.swift index e95e8986..83c819db 100644 --- a/packages/react-native-nitro-web-image/ios/HybridWebImageLoader.swift +++ b/packages/react-native-nitro-web-image/ios/HybridWebImageLoader.swift @@ -32,20 +32,25 @@ class HybridWebImageLoader: HybridImageLoaderSpec { } func requestImage(forView view: (any HybridNitroImageViewSpec)) throws { - guard let view = view as? NativeImageView else { throw RuntimeError.error(withMessage: "Invalid view type!") } + guard let imageView = (view as? NativeImageView)?.imageView else { throw RuntimeError.error(withMessage: "Invalid view type!") } - let webImageOptions = options?.toSDWebImageOptions() ?? [] + var webImageOptions = options?.toSDWebImageOptions() ?? [] + switch view.priority { + case 0: webImageOptions.insert(.lowPriority) + case 2: webImageOptions.insert(.highPriority) + default: break + } let webImageContext = options?.toSDWebImageContext() - view.imageView.sd_setImage(with: url, - placeholderImage: view.imageView.image, - options: webImageOptions, - context: webImageContext) + imageView.sd_setImage(with: url, + placeholderImage: imageView.image, + options: webImageOptions, + context: webImageContext) } func dropImage(forView view: (any HybridNitroImageViewSpec)) throws { // TODO: Do we need to reset the image here or not? } - + public static func loadImage(url: URL, options: AsyncImageLoadOptions?) -> Promise { return Promise.async { let uiImage = try await SDWebImageManager.shared.loadImage(with: url, diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/android/NitroWebImageOnLoad.cpp b/packages/react-native-nitro-web-image/nitrogen/generated/android/NitroWebImageOnLoad.cpp index 3a00fe36..7c85f416 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/android/NitroWebImageOnLoad.cpp +++ b/packages/react-native-nitro-web-image/nitrogen/generated/android/NitroWebImageOnLoad.cpp @@ -27,9 +27,9 @@ int initialize(JavaVM* vm) { } struct JHybridWebImageFactorySpecImpl: public jni::JavaClass { - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/web/image/HybridWebImageFactory;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/web/image/HybridWebImageFactory;"; static std::shared_ptr create() { - static const auto constructorFn = javaClassStatic()->getConstructor(); + static auto constructorFn = javaClassStatic()->getConstructor(); jni::local_ref javaPart = javaClassStatic()->newObject(constructorFn); return javaPart->getJHybridWebImageFactorySpec(); } diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JAsyncImageLoadOptions.hpp b/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JAsyncImageLoadOptions.hpp index ee4c8b2e..d22ac958 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JAsyncImageLoadOptions.hpp +++ b/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JAsyncImageLoadOptions.hpp @@ -10,8 +10,6 @@ #include #include "AsyncImageLoadOptions.hpp" -#include "AsyncImagePriority.hpp" -#include "JAsyncImagePriority.hpp" #include #include @@ -24,7 +22,7 @@ namespace margelo::nitro::web::image { */ struct JAsyncImageLoadOptions final: public jni::JavaClass { public: - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/web/image/AsyncImageLoadOptions;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/web/image/AsyncImageLoadOptions;"; public: /** @@ -34,8 +32,8 @@ namespace margelo::nitro::web::image { [[nodiscard]] AsyncImageLoadOptions toCpp() const { static const auto clazz = javaClassStatic(); - static const auto fieldPriority = clazz->getField("priority"); - jni::local_ref priority = this->getFieldValue(fieldPriority); + static const auto fieldPriority = clazz->getField("priority"); + jni::local_ref priority = this->getFieldValue(fieldPriority); static const auto fieldForceRefresh = clazz->getField("forceRefresh"); jni::local_ref forceRefresh = this->getFieldValue(fieldForceRefresh); static const auto fieldCacheKey = clazz->getField("cacheKey"); @@ -57,7 +55,7 @@ namespace margelo::nitro::web::image { static const auto fieldProgressive = clazz->getField("progressive"); jni::local_ref progressive = this->getFieldValue(fieldProgressive); return AsyncImageLoadOptions( - priority != nullptr ? std::make_optional(priority->toCpp()) : std::nullopt, + priority != nullptr ? std::make_optional(priority->value()) : std::nullopt, forceRefresh != nullptr ? std::make_optional(static_cast(forceRefresh->value())) : std::nullopt, cacheKey != nullptr ? std::make_optional(cacheKey->toStdString()) : std::nullopt, continueInBackground != nullptr ? std::make_optional(static_cast(continueInBackground->value())) : std::nullopt, @@ -77,12 +75,12 @@ namespace margelo::nitro::web::image { */ [[maybe_unused]] static jni::local_ref fromCpp(const AsyncImageLoadOptions& value) { - using JSignature = JAsyncImageLoadOptions(jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref); + using JSignature = JAsyncImageLoadOptions(jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref, jni::alias_ref); static const auto clazz = javaClassStatic(); static const auto create = clazz->getStaticMethod("fromCpp"); return create( clazz, - value.priority.has_value() ? JAsyncImagePriority::fromCpp(value.priority.value()) : nullptr, + value.priority.has_value() ? jni::JDouble::valueOf(value.priority.value()) : nullptr, value.forceRefresh.has_value() ? jni::JBoolean::valueOf(value.forceRefresh.value()) : nullptr, value.cacheKey.has_value() ? jni::make_jstring(value.cacheKey.value()) : nullptr, value.continueInBackground.has_value() ? jni::JBoolean::valueOf(value.continueInBackground.value()) : nullptr, diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JAsyncImagePriority.hpp b/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JAsyncImagePriority.hpp deleted file mode 100644 index 54816844..00000000 --- a/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JAsyncImagePriority.hpp +++ /dev/null @@ -1,61 +0,0 @@ -/// -/// JAsyncImagePriority.hpp -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © Marc Rousavy @ Margelo -/// - -#pragma once - -#include -#include "AsyncImagePriority.hpp" - -namespace margelo::nitro::web::image { - - using namespace facebook; - - /** - * The C++ JNI bridge between the C++ enum "AsyncImagePriority" and the the Kotlin enum "AsyncImagePriority". - */ - struct JAsyncImagePriority final: public jni::JavaClass { - public: - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/web/image/AsyncImagePriority;"; - - public: - /** - * Convert this Java/Kotlin-based enum to the C++ enum AsyncImagePriority. - */ - [[maybe_unused]] - [[nodiscard]] - AsyncImagePriority toCpp() const { - static const auto clazz = javaClassStatic(); - static const auto fieldOrdinal = clazz->getField("value"); - int ordinal = this->getFieldValue(fieldOrdinal); - return static_cast(ordinal); - } - - public: - /** - * Create a Java/Kotlin-based enum with the given C++ enum's value. - */ - [[maybe_unused]] - static jni::alias_ref fromCpp(AsyncImagePriority value) { - static const auto clazz = javaClassStatic(); - switch (value) { - case AsyncImagePriority::LOW: - static const auto fieldLOW = clazz->getStaticField("LOW"); - return clazz->getStaticFieldValue(fieldLOW); - case AsyncImagePriority::DEFAULT: - static const auto fieldDEFAULT = clazz->getStaticField("DEFAULT"); - return clazz->getStaticFieldValue(fieldDEFAULT); - case AsyncImagePriority::HIGH: - static const auto fieldHIGH = clazz->getStaticField("HIGH"); - return clazz->getStaticFieldValue(fieldHIGH); - default: - std::string stringValue = std::to_string(static_cast(value)); - throw std::invalid_argument("Invalid enum value (" + stringValue + "!"); - } - } - }; - -} // namespace margelo::nitro::web::image diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JHybridWebImageFactorySpec.cpp b/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JHybridWebImageFactorySpec.cpp index 891f71ab..feefded3 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JHybridWebImageFactorySpec.cpp +++ b/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JHybridWebImageFactorySpec.cpp @@ -13,8 +13,6 @@ namespace margelo::nitro::image { class HybridImageLoaderSpec; } namespace margelo::nitro::image { class HybridImageSpec; } // Forward declaration of `AsyncImageLoadOptions` to properly resolve imports. namespace margelo::nitro::web::image { struct AsyncImageLoadOptions; } -// Forward declaration of `AsyncImagePriority` to properly resolve imports. -namespace margelo::nitro::web::image { enum class AsyncImagePriority; } #include #include @@ -27,8 +25,6 @@ namespace margelo::nitro::web::image { enum class AsyncImagePriority; } #include "AsyncImageLoadOptions.hpp" #include #include "JAsyncImageLoadOptions.hpp" -#include "AsyncImagePriority.hpp" -#include "JAsyncImagePriority.hpp" namespace margelo::nitro::web::image { diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JHybridWebImageFactorySpec.hpp b/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JHybridWebImageFactorySpec.hpp index 2b72b176..b3c16bad 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JHybridWebImageFactorySpec.hpp +++ b/packages/react-native-nitro-web-image/nitrogen/generated/android/c++/JHybridWebImageFactorySpec.hpp @@ -21,11 +21,11 @@ namespace margelo::nitro::web::image { class JHybridWebImageFactorySpec: public virtual HybridWebImageFactorySpec, public virtual JHybridObject { public: struct JavaPart: public jni::JavaClass { - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/web/image/HybridWebImageFactorySpec;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/web/image/HybridWebImageFactorySpec;"; std::shared_ptr getJHybridWebImageFactorySpec(); }; struct CxxPart: public jni::HybridClass { - static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/web/image/HybridWebImageFactorySpec$CxxPart;"; + static auto constexpr kJavaDescriptor = "Lcom/margelo/nitro/web/image/HybridWebImageFactorySpec$CxxPart;"; static jni::local_ref initHybrid(jni::alias_ref jThis); static void registerNatives(); using HybridBase::HybridBase; diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/android/kotlin/com/margelo/nitro/web/image/AsyncImageLoadOptions.kt b/packages/react-native-nitro-web-image/nitrogen/generated/android/kotlin/com/margelo/nitro/web/image/AsyncImageLoadOptions.kt index 737c13c5..00ca5535 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/android/kotlin/com/margelo/nitro/web/image/AsyncImageLoadOptions.kt +++ b/packages/react-native-nitro-web-image/nitrogen/generated/android/kotlin/com/margelo/nitro/web/image/AsyncImageLoadOptions.kt @@ -9,7 +9,6 @@ package com.margelo.nitro.web.image import androidx.annotation.Keep import com.facebook.proguard.annotations.DoNotStrip -import java.util.Objects /** @@ -20,7 +19,7 @@ import java.util.Objects data class AsyncImageLoadOptions( @DoNotStrip @Keep - val priority: AsyncImagePriority?, + val priority: Double?, @DoNotStrip @Keep val forceRefresh: Boolean?, @@ -54,38 +53,6 @@ data class AsyncImageLoadOptions( ) { /* primary constructor */ - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is AsyncImageLoadOptions) return false - return Objects.deepEquals(this.priority, other.priority) - && Objects.deepEquals(this.forceRefresh, other.forceRefresh) - && Objects.deepEquals(this.cacheKey, other.cacheKey) - && Objects.deepEquals(this.continueInBackground, other.continueInBackground) - && Objects.deepEquals(this.allowInvalidSSLCertificates, other.allowInvalidSSLCertificates) - && Objects.deepEquals(this.scaleDownLargeImages, other.scaleDownLargeImages) - && Objects.deepEquals(this.queryMemoryDataSync, other.queryMemoryDataSync) - && Objects.deepEquals(this.queryDiskDataSync, other.queryDiskDataSync) - && Objects.deepEquals(this.decodeImage, other.decodeImage) - && Objects.deepEquals(this.allowHardware, other.allowHardware) - && Objects.deepEquals(this.progressive, other.progressive) - } - - override fun hashCode(): Int { - return arrayOf( - priority, - forceRefresh, - cacheKey, - continueInBackground, - allowInvalidSSLCertificates, - scaleDownLargeImages, - queryMemoryDataSync, - queryDiskDataSync, - decodeImage, - allowHardware, - progressive - ).contentDeepHashCode() - } - companion object { /** * Constructor called from C++ @@ -94,7 +61,7 @@ data class AsyncImageLoadOptions( @Keep @Suppress("unused") @JvmStatic - private fun fromCpp(priority: AsyncImagePriority?, forceRefresh: Boolean?, cacheKey: String?, continueInBackground: Boolean?, allowInvalidSSLCertificates: Boolean?, scaleDownLargeImages: Boolean?, queryMemoryDataSync: Boolean?, queryDiskDataSync: Boolean?, decodeImage: Boolean?, allowHardware: Boolean?, progressive: Boolean?): AsyncImageLoadOptions { + private fun fromCpp(priority: Double?, forceRefresh: Boolean?, cacheKey: String?, continueInBackground: Boolean?, allowInvalidSSLCertificates: Boolean?, scaleDownLargeImages: Boolean?, queryMemoryDataSync: Boolean?, queryDiskDataSync: Boolean?, decodeImage: Boolean?, allowHardware: Boolean?, progressive: Boolean?): AsyncImageLoadOptions { return AsyncImageLoadOptions(priority, forceRefresh, cacheKey, continueInBackground, allowInvalidSSLCertificates, scaleDownLargeImages, queryMemoryDataSync, queryDiskDataSync, decodeImage, allowHardware, progressive) } } diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/android/kotlin/com/margelo/nitro/web/image/AsyncImagePriority.kt b/packages/react-native-nitro-web-image/nitrogen/generated/android/kotlin/com/margelo/nitro/web/image/AsyncImagePriority.kt deleted file mode 100644 index 55815ee0..00000000 --- a/packages/react-native-nitro-web-image/nitrogen/generated/android/kotlin/com/margelo/nitro/web/image/AsyncImagePriority.kt +++ /dev/null @@ -1,24 +0,0 @@ -/// -/// AsyncImagePriority.kt -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © Marc Rousavy @ Margelo -/// - -package com.margelo.nitro.web.image - -import androidx.annotation.Keep -import com.facebook.proguard.annotations.DoNotStrip - -/** - * Represents the JavaScript enum/union "AsyncImagePriority". - */ -@DoNotStrip -@Keep -enum class AsyncImagePriority(@DoNotStrip @Keep val value: Int) { - LOW(0), - DEFAULT(1), - HIGH(2); - - companion object -} diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/ios/NitroWebImage+autolinking.rb b/packages/react-native-nitro-web-image/nitrogen/generated/ios/NitroWebImage+autolinking.rb index 54895d66..4c9ee8bd 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/ios/NitroWebImage+autolinking.rb +++ b/packages/react-native-nitro-web-image/nitrogen/generated/ios/NitroWebImage+autolinking.rb @@ -56,7 +56,5 @@ def add_nitrogen_files(spec) "SWIFT_OBJC_INTEROP_MODE" => "objcxx", # Enables stricter modular headers "DEFINES_MODULE" => "YES", - # Disable auto-generated ObjC header for Swift (Static linkage on Xcode 26.4 breaks here) - "SWIFT_INSTALL_OBJC_HEADER" => "NO", }) end diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/ios/NitroWebImage-Swift-Cxx-Bridge.hpp b/packages/react-native-nitro-web-image/nitrogen/generated/ios/NitroWebImage-Swift-Cxx-Bridge.hpp index f4198886..18320820 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/ios/NitroWebImage-Swift-Cxx-Bridge.hpp +++ b/packages/react-native-nitro-web-image/nitrogen/generated/ios/NitroWebImage-Swift-Cxx-Bridge.hpp @@ -10,8 +10,6 @@ // Forward declarations of C++ defined types // Forward declaration of `AsyncImageLoadOptions` to properly resolve imports. namespace margelo::nitro::web::image { struct AsyncImageLoadOptions; } -// Forward declaration of `AsyncImagePriority` to properly resolve imports. -namespace margelo::nitro::web::image { enum class AsyncImagePriority; } // Forward declaration of `HybridImageLoaderSpec` to properly resolve imports. namespace margelo::nitro::image { class HybridImageLoaderSpec; } // Forward declaration of `HybridImageSpec` to properly resolve imports. @@ -29,7 +27,6 @@ namespace NitroWebImage { class HybridWebImageFactorySpec_cxx; } // Include C++ defined types #include "AsyncImageLoadOptions.hpp" -#include "AsyncImagePriority.hpp" #include "HybridWebImageFactorySpec.hpp" #include #include @@ -60,18 +57,18 @@ namespace margelo::nitro::web::image::bridge::swift { using std__weak_ptr_margelo__nitro__image__HybridImageLoaderSpec_ = std::weak_ptr; inline std__weak_ptr_margelo__nitro__image__HybridImageLoaderSpec_ weakify_std__shared_ptr_margelo__nitro__image__HybridImageLoaderSpec_(const std::shared_ptr& strong) noexcept { return strong; } - // pragma MARK: std::optional + // pragma MARK: std::optional /** - * Specialized version of `std::optional`. + * Specialized version of `std::optional`. */ - using std__optional_AsyncImagePriority_ = std::optional; - inline std::optional create_std__optional_AsyncImagePriority_(const AsyncImagePriority& value) noexcept { - return std::optional(value); + using std__optional_double_ = std::optional; + inline std::optional create_std__optional_double_(const double& value) noexcept { + return std::optional(value); } - inline bool has_value_std__optional_AsyncImagePriority_(const std::optional& optional) noexcept { + inline bool has_value_std__optional_double_(const std::optional& optional) noexcept { return optional.has_value(); } - inline AsyncImagePriority get_std__optional_AsyncImagePriority_(const std::optional& optional) noexcept { + inline double get_std__optional_double_(const std::optional& optional) noexcept { return optional.value(); } diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/ios/NitroWebImage-Swift-Cxx-Umbrella.hpp b/packages/react-native-nitro-web-image/nitrogen/generated/ios/NitroWebImage-Swift-Cxx-Umbrella.hpp index 9946e7c7..1c0ec837 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/ios/NitroWebImage-Swift-Cxx-Umbrella.hpp +++ b/packages/react-native-nitro-web-image/nitrogen/generated/ios/NitroWebImage-Swift-Cxx-Umbrella.hpp @@ -10,8 +10,6 @@ // Forward declarations of C++ defined types // Forward declaration of `AsyncImageLoadOptions` to properly resolve imports. namespace margelo::nitro::web::image { struct AsyncImageLoadOptions; } -// Forward declaration of `AsyncImagePriority` to properly resolve imports. -namespace margelo::nitro::web::image { enum class AsyncImagePriority; } // Forward declaration of `HybridImageLoaderSpec` to properly resolve imports. namespace margelo::nitro::image { class HybridImageLoaderSpec; } // Forward declaration of `HybridImageSpec` to properly resolve imports. @@ -21,7 +19,6 @@ namespace margelo::nitro::web::image { class HybridWebImageFactorySpec; } // Include C++ defined types #include "AsyncImageLoadOptions.hpp" -#include "AsyncImagePriority.hpp" #include "HybridWebImageFactorySpec.hpp" #include #include diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/ios/c++/HybridWebImageFactorySpecSwift.hpp b/packages/react-native-nitro-web-image/nitrogen/generated/ios/c++/HybridWebImageFactorySpecSwift.hpp index dccacced..6df066d1 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/ios/c++/HybridWebImageFactorySpecSwift.hpp +++ b/packages/react-native-nitro-web-image/nitrogen/generated/ios/c++/HybridWebImageFactorySpecSwift.hpp @@ -16,8 +16,6 @@ namespace NitroWebImage { class HybridWebImageFactorySpec_cxx; } namespace margelo::nitro::image { class HybridImageLoaderSpec; } // Forward declaration of `AsyncImageLoadOptions` to properly resolve imports. namespace margelo::nitro::web::image { struct AsyncImageLoadOptions; } -// Forward declaration of `AsyncImagePriority` to properly resolve imports. -namespace margelo::nitro::web::image { enum class AsyncImagePriority; } // Forward declaration of `HybridImageSpec` to properly resolve imports. namespace margelo::nitro::image { class HybridImageSpec; } @@ -26,7 +24,6 @@ namespace margelo::nitro::image { class HybridImageSpec; } #include #include "AsyncImageLoadOptions.hpp" #include -#include "AsyncImagePriority.hpp" #include #include diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/AsyncImageLoadOptions.swift b/packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/AsyncImageLoadOptions.swift index 9982e367..6978ae78 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/AsyncImageLoadOptions.swift +++ b/packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/AsyncImageLoadOptions.swift @@ -18,10 +18,10 @@ public extension AsyncImageLoadOptions { /** * Create a new instance of `AsyncImageLoadOptions`. */ - init(priority: AsyncImagePriority?, forceRefresh: Bool?, cacheKey: String?, continueInBackground: Bool?, allowInvalidSSLCertificates: Bool?, scaleDownLargeImages: Bool?, queryMemoryDataSync: Bool?, queryDiskDataSync: Bool?, decodeImage: Bool?, allowHardware: Bool?, progressive: Bool?) { - self.init({ () -> bridge.std__optional_AsyncImagePriority_ in + init(priority: Double?, forceRefresh: Bool?, cacheKey: String?, continueInBackground: Bool?, allowInvalidSSLCertificates: Bool?, scaleDownLargeImages: Bool?, queryMemoryDataSync: Bool?, queryDiskDataSync: Bool?, decodeImage: Bool?, allowHardware: Bool?, progressive: Bool?) { + self.init({ () -> bridge.std__optional_double_ in if let __unwrappedValue = priority { - return bridge.create_std__optional_AsyncImagePriority_(__unwrappedValue) + return bridge.create_std__optional_double_(__unwrappedValue) } else { return .init() } @@ -89,8 +89,15 @@ public extension AsyncImageLoadOptions { } @inline(__always) - var priority: AsyncImagePriority? { - return self.__priority.value + var priority: Double? { + return { () -> Double? in + if bridge.has_value_std__optional_double_(self.__priority) { + let __unwrapped = bridge.get_std__optional_double_(self.__priority) + return __unwrapped + } else { + return nil + } + }() } @inline(__always) diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/AsyncImagePriority.swift b/packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/AsyncImagePriority.swift deleted file mode 100644 index 207afd7d..00000000 --- a/packages/react-native-nitro-web-image/nitrogen/generated/ios/swift/AsyncImagePriority.swift +++ /dev/null @@ -1,44 +0,0 @@ -/// -/// AsyncImagePriority.swift -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © Marc Rousavy @ Margelo -/// - -/** - * Represents the JS union `AsyncImagePriority`, backed by a C++ enum. - */ -public typealias AsyncImagePriority = margelo.nitro.web.image.AsyncImagePriority - -public extension AsyncImagePriority { - /** - * Get a AsyncImagePriority for the given String value, or - * return `nil` if the given value was invalid/unknown. - */ - init?(fromString string: String) { - switch string { - case "low": - self = .low - case "default": - self = .default - case "high": - self = .high - default: - return nil - } - } - - /** - * Get the String value this AsyncImagePriority represents. - */ - var stringValue: String { - switch self { - case .low: - return "low" - case .default: - return "default" - case .high: - return "high" - } - } -} diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/AsyncImageLoadOptions.hpp b/packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/AsyncImageLoadOptions.hpp index bb55bfd1..1397cdd0 100644 --- a/packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/AsyncImageLoadOptions.hpp +++ b/packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/AsyncImageLoadOptions.hpp @@ -28,10 +28,8 @@ #error NitroModules cannot be found! Are you sure you installed NitroModules properly? #endif -// Forward declaration of `AsyncImagePriority` to properly resolve imports. -namespace margelo::nitro::web::image { enum class AsyncImagePriority; } -#include "AsyncImagePriority.hpp" + #include #include @@ -42,7 +40,7 @@ namespace margelo::nitro::web::image { */ struct AsyncImageLoadOptions final { public: - std::optional priority SWIFT_PRIVATE; + std::optional priority SWIFT_PRIVATE; std::optional forceRefresh SWIFT_PRIVATE; std::optional cacheKey SWIFT_PRIVATE; std::optional continueInBackground SWIFT_PRIVATE; @@ -56,7 +54,7 @@ namespace margelo::nitro::web::image { public: AsyncImageLoadOptions() = default; - explicit AsyncImageLoadOptions(std::optional priority, std::optional forceRefresh, std::optional cacheKey, std::optional continueInBackground, std::optional allowInvalidSSLCertificates, std::optional scaleDownLargeImages, std::optional queryMemoryDataSync, std::optional queryDiskDataSync, std::optional decodeImage, std::optional allowHardware, std::optional progressive): priority(priority), forceRefresh(forceRefresh), cacheKey(cacheKey), continueInBackground(continueInBackground), allowInvalidSSLCertificates(allowInvalidSSLCertificates), scaleDownLargeImages(scaleDownLargeImages), queryMemoryDataSync(queryMemoryDataSync), queryDiskDataSync(queryDiskDataSync), decodeImage(decodeImage), allowHardware(allowHardware), progressive(progressive) {} + explicit AsyncImageLoadOptions(std::optional priority, std::optional forceRefresh, std::optional cacheKey, std::optional continueInBackground, std::optional allowInvalidSSLCertificates, std::optional scaleDownLargeImages, std::optional queryMemoryDataSync, std::optional queryDiskDataSync, std::optional decodeImage, std::optional allowHardware, std::optional progressive): priority(priority), forceRefresh(forceRefresh), cacheKey(cacheKey), continueInBackground(continueInBackground), allowInvalidSSLCertificates(allowInvalidSSLCertificates), scaleDownLargeImages(scaleDownLargeImages), queryMemoryDataSync(queryMemoryDataSync), queryDiskDataSync(queryDiskDataSync), decodeImage(decodeImage), allowHardware(allowHardware), progressive(progressive) {} public: friend bool operator==(const AsyncImageLoadOptions& lhs, const AsyncImageLoadOptions& rhs) = default; @@ -72,7 +70,7 @@ namespace margelo::nitro { static inline margelo::nitro::web::image::AsyncImageLoadOptions fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { jsi::Object obj = arg.asObject(runtime); return margelo::nitro::web::image::AsyncImageLoadOptions( - JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "priority"))), + JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "priority"))), JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "forceRefresh"))), JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "cacheKey"))), JSIConverter>::fromJSI(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "continueInBackground"))), @@ -87,7 +85,7 @@ namespace margelo::nitro { } static inline jsi::Value toJSI(jsi::Runtime& runtime, const margelo::nitro::web::image::AsyncImageLoadOptions& arg) { jsi::Object obj(runtime); - obj.setProperty(runtime, PropNameIDCache::get(runtime, "priority"), JSIConverter>::toJSI(runtime, arg.priority)); + obj.setProperty(runtime, PropNameIDCache::get(runtime, "priority"), JSIConverter>::toJSI(runtime, arg.priority)); obj.setProperty(runtime, PropNameIDCache::get(runtime, "forceRefresh"), JSIConverter>::toJSI(runtime, arg.forceRefresh)); obj.setProperty(runtime, PropNameIDCache::get(runtime, "cacheKey"), JSIConverter>::toJSI(runtime, arg.cacheKey)); obj.setProperty(runtime, PropNameIDCache::get(runtime, "continueInBackground"), JSIConverter>::toJSI(runtime, arg.continueInBackground)); @@ -108,7 +106,7 @@ namespace margelo::nitro { if (!nitro::isPlainObject(runtime, obj)) { return false; } - if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "priority")))) return false; + if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "priority")))) return false; if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "forceRefresh")))) return false; if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "cacheKey")))) return false; if (!JSIConverter>::canConvert(runtime, obj.getProperty(runtime, PropNameIDCache::get(runtime, "continueInBackground")))) return false; diff --git a/packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/AsyncImagePriority.hpp b/packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/AsyncImagePriority.hpp deleted file mode 100644 index 1f831a21..00000000 --- a/packages/react-native-nitro-web-image/nitrogen/generated/shared/c++/AsyncImagePriority.hpp +++ /dev/null @@ -1,80 +0,0 @@ -/// -/// AsyncImagePriority.hpp -/// This file was generated by nitrogen. DO NOT MODIFY THIS FILE. -/// https://github.com/mrousavy/nitro -/// Copyright © Marc Rousavy @ Margelo -/// - -#pragma once - -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif -#if __has_include() -#include -#else -#error NitroModules cannot be found! Are you sure you installed NitroModules properly? -#endif - -namespace margelo::nitro::web::image { - - /** - * An enum which can be represented as a JavaScript union (AsyncImagePriority). - */ - enum class AsyncImagePriority { - LOW SWIFT_NAME(low) = 0, - DEFAULT SWIFT_NAME(default) = 1, - HIGH SWIFT_NAME(high) = 2, - } CLOSED_ENUM; - -} // namespace margelo::nitro::web::image - -namespace margelo::nitro { - - // C++ AsyncImagePriority <> JS AsyncImagePriority (union) - template <> - struct JSIConverter final { - static inline margelo::nitro::web::image::AsyncImagePriority fromJSI(jsi::Runtime& runtime, const jsi::Value& arg) { - std::string unionValue = JSIConverter::fromJSI(runtime, arg); - switch (hashString(unionValue.c_str(), unionValue.size())) { - case hashString("low"): return margelo::nitro::web::image::AsyncImagePriority::LOW; - case hashString("default"): return margelo::nitro::web::image::AsyncImagePriority::DEFAULT; - case hashString("high"): return margelo::nitro::web::image::AsyncImagePriority::HIGH; - default: [[unlikely]] - throw std::invalid_argument("Cannot convert \"" + unionValue + "\" to enum AsyncImagePriority - invalid value!"); - } - } - static inline jsi::Value toJSI(jsi::Runtime& runtime, margelo::nitro::web::image::AsyncImagePriority arg) { - switch (arg) { - case margelo::nitro::web::image::AsyncImagePriority::LOW: return JSIConverter::toJSI(runtime, "low"); - case margelo::nitro::web::image::AsyncImagePriority::DEFAULT: return JSIConverter::toJSI(runtime, "default"); - case margelo::nitro::web::image::AsyncImagePriority::HIGH: return JSIConverter::toJSI(runtime, "high"); - default: [[unlikely]] - throw std::invalid_argument("Cannot convert AsyncImagePriority to JS - invalid value: " - + std::to_string(static_cast(arg)) + "!"); - } - } - static inline bool canConvert(jsi::Runtime& runtime, const jsi::Value& value) { - if (!value.isString()) { - return false; - } - std::string unionValue = JSIConverter::fromJSI(runtime, value); - switch (hashString(unionValue.c_str(), unionValue.size())) { - case hashString("low"): - case hashString("default"): - case hashString("high"): - return true; - default: - return false; - } - } - }; - -} // namespace margelo::nitro diff --git a/packages/react-native-nitro-web-image/src/specs/WebImageFactory.nitro.ts b/packages/react-native-nitro-web-image/src/specs/WebImageFactory.nitro.ts index 7f3bd8dd..e025e5ec 100644 --- a/packages/react-native-nitro-web-image/src/specs/WebImageFactory.nitro.ts +++ b/packages/react-native-nitro-web-image/src/specs/WebImageFactory.nitro.ts @@ -1,14 +1,13 @@ import type { Image, ImageLoader } from 'react-native-nitro-image' import type { HybridObject } from 'react-native-nitro-modules' -export type AsyncImagePriority = 'low' | 'default' | 'high' - export interface AsyncImageLoadOptions { /** * Specifies the priority of the image download. - * @default 'default' + * Use the {@linkcode AsyncImagePriority} type from the package entry for typed values. + * @default 1 */ - priority?: AsyncImagePriority + priority?: number /** * Forces a cache refresh even if the URL is changed.