diff --git a/android/src/main/java/com/margelo/nitro/rive/HybridViewModel.kt b/android/src/main/java/com/margelo/nitro/rive/HybridViewModel.kt index b5af4ead..0222cd40 100644 --- a/android/src/main/java/com/margelo/nitro/rive/HybridViewModel.kt +++ b/android/src/main/java/com/margelo/nitro/rive/HybridViewModel.kt @@ -53,6 +53,14 @@ class HybridViewModel(private val viewModel: ViewModel) : HybridViewModelSpec() } } + override fun getPropertyCountAsync(): Promise { + return Promise.async { propertyCount } + } + + override fun getInstanceCountAsync(): Promise { + return Promise.async { instanceCount } + } + override fun createInstanceByNameAsync(name: String): Promise { return Promise.async { createInstanceByName(name) } } diff --git a/example/__tests__/databinding-advanced.harness.ts b/example/__tests__/databinding-advanced.harness.ts index 5162576a..e0e903a8 100644 --- a/example/__tests__/databinding-advanced.harness.ts +++ b/example/__tests__/databinding-advanced.harness.ts @@ -73,9 +73,8 @@ describe('ViewModel Properties Metadata', () => { const file = await loadFile(DATABINDING); const vm = file.viewModelByName('Person'); expectDefined(vm); - // Legacy returns 8/2, experimental returns 0/0 - expect(vm.propertyCount).toBeGreaterThanOrEqual(0); - expect(vm.instanceCount).toBeGreaterThanOrEqual(0); + expect(await vm.getPropertyCountAsync()).toBeGreaterThanOrEqual(0); + expect(await vm.getInstanceCountAsync()).toBeGreaterThanOrEqual(0); }); }); diff --git a/ios/HybridViewModel.swift b/ios/HybridViewModel.swift index 52e789b2..bc5e2d11 100644 --- a/ios/HybridViewModel.swift +++ b/ios/HybridViewModel.swift @@ -41,6 +41,14 @@ class HybridViewModel: HybridViewModelSpec { return HybridViewModelInstance(viewModelInstance: vmi) } + func getPropertyCountAsync() throws -> Promise { + return Promise.async { self.propertyCount } + } + + func getInstanceCountAsync() throws -> Promise { + return Promise.async { self.instanceCount } + } + func createInstanceByNameAsync(name: String) throws -> Promise<(any HybridViewModelInstanceSpec)?> { return Promise.async { try self.createInstanceByName(name: name) } } diff --git a/nitrogen/generated/android/c++/JHybridViewModelSpec.cpp b/nitrogen/generated/android/c++/JHybridViewModelSpec.cpp index e105963c..66512d85 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelSpec.cpp +++ b/nitrogen/generated/android/c++/JHybridViewModelSpec.cpp @@ -11,12 +11,12 @@ namespace margelo::nitro::rive { class HybridViewModelInstanceSpec; } #include +#include +#include #include #include "HybridViewModelInstanceSpec.hpp" #include #include "JHybridViewModelInstanceSpec.hpp" -#include -#include namespace margelo::nitro::rive { @@ -65,6 +65,38 @@ namespace margelo::nitro::rive { } // Methods + std::shared_ptr> JHybridViewModelSpec::getPropertyCountAsync() { + static const auto method = _javaPart->javaClassStatic()->getMethod()>("getPropertyCountAsync"); + auto __result = method(_javaPart); + return [&]() { + auto __promise = Promise::create(); + __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) { + auto __result = jni::static_ref_cast(__boxedResult); + __promise->resolve(__result->value()); + }); + __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) { + jni::JniException __jniError(__throwable); + __promise->reject(std::make_exception_ptr(__jniError)); + }); + return __promise; + }(); + } + std::shared_ptr> JHybridViewModelSpec::getInstanceCountAsync() { + static const auto method = _javaPart->javaClassStatic()->getMethod()>("getInstanceCountAsync"); + auto __result = method(_javaPart); + return [&]() { + auto __promise = Promise::create(); + __result->cthis()->addOnResolvedListener([=](const jni::alias_ref& __boxedResult) { + auto __result = jni::static_ref_cast(__boxedResult); + __promise->resolve(__result->value()); + }); + __result->cthis()->addOnRejectedListener([=](const jni::alias_ref& __throwable) { + jni::JniException __jniError(__throwable); + __promise->reject(std::make_exception_ptr(__jniError)); + }); + return __promise; + }(); + } std::optional> JHybridViewModelSpec::createInstanceByIndex(double index) { static const auto method = _javaPart->javaClassStatic()->getMethod(double /* index */)>("createInstanceByIndex"); auto __result = method(_javaPart, index); diff --git a/nitrogen/generated/android/c++/JHybridViewModelSpec.hpp b/nitrogen/generated/android/c++/JHybridViewModelSpec.hpp index 41bd0779..ad4583da 100644 --- a/nitrogen/generated/android/c++/JHybridViewModelSpec.hpp +++ b/nitrogen/generated/android/c++/JHybridViewModelSpec.hpp @@ -56,6 +56,8 @@ namespace margelo::nitro::rive { public: // Methods + std::shared_ptr> getPropertyCountAsync() override; + std::shared_ptr> getInstanceCountAsync() override; std::optional> createInstanceByIndex(double index) override; std::optional> createInstanceByName(const std::string& name) override; std::optional> createDefaultInstance() override; diff --git a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelSpec.kt b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelSpec.kt index 99922fa0..087a3e82 100644 --- a/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelSpec.kt +++ b/nitrogen/generated/android/kotlin/com/margelo/nitro/rive/HybridViewModelSpec.kt @@ -39,6 +39,14 @@ abstract class HybridViewModelSpec: HybridObject() { abstract val modelName: String // Methods + @DoNotStrip + @Keep + abstract fun getPropertyCountAsync(): Promise + + @DoNotStrip + @Keep + abstract fun getInstanceCountAsync(): Promise + @DoNotStrip @Keep abstract fun createInstanceByIndex(index: Double): HybridViewModelInstanceSpec? diff --git a/nitrogen/generated/ios/c++/HybridViewModelSpecSwift.hpp b/nitrogen/generated/ios/c++/HybridViewModelSpecSwift.hpp index 7d18ce1f..be193603 100644 --- a/nitrogen/generated/ios/c++/HybridViewModelSpecSwift.hpp +++ b/nitrogen/generated/ios/c++/HybridViewModelSpecSwift.hpp @@ -16,10 +16,10 @@ namespace RNRive { class HybridViewModelSpec_cxx; } namespace margelo::nitro::rive { class HybridViewModelInstanceSpec; } #include +#include #include #include "HybridViewModelInstanceSpec.hpp" #include -#include #include "RNRive-Swift-Cxx-Umbrella.hpp" @@ -80,6 +80,22 @@ namespace margelo::nitro::rive { public: // Methods + inline std::shared_ptr> getPropertyCountAsync() override { + auto __result = _swiftPart.getPropertyCountAsync(); + if (__result.hasError()) [[unlikely]] { + std::rethrow_exception(__result.error()); + } + auto __value = std::move(__result.value()); + return __value; + } + inline std::shared_ptr> getInstanceCountAsync() override { + auto __result = _swiftPart.getInstanceCountAsync(); + if (__result.hasError()) [[unlikely]] { + std::rethrow_exception(__result.error()); + } + auto __value = std::move(__result.value()); + return __value; + } inline std::optional> createInstanceByIndex(double index) override { auto __result = _swiftPart.createInstanceByIndex(std::forward(index)); if (__result.hasError()) [[unlikely]] { diff --git a/nitrogen/generated/ios/swift/HybridViewModelSpec.swift b/nitrogen/generated/ios/swift/HybridViewModelSpec.swift index b699f291..0bcb3cc4 100644 --- a/nitrogen/generated/ios/swift/HybridViewModelSpec.swift +++ b/nitrogen/generated/ios/swift/HybridViewModelSpec.swift @@ -15,6 +15,8 @@ public protocol HybridViewModelSpec_protocol: HybridObject { var modelName: String { get } // Methods + func getPropertyCountAsync() throws -> Promise + func getInstanceCountAsync() throws -> Promise func createInstanceByIndex(index: Double) throws -> (any HybridViewModelInstanceSpec)? func createInstanceByName(name: String) throws -> (any HybridViewModelInstanceSpec)? func createDefaultInstance() throws -> (any HybridViewModelInstanceSpec)? diff --git a/nitrogen/generated/ios/swift/HybridViewModelSpec_cxx.swift b/nitrogen/generated/ios/swift/HybridViewModelSpec_cxx.swift index 6a5ef9d1..c963c12a 100644 --- a/nitrogen/generated/ios/swift/HybridViewModelSpec_cxx.swift +++ b/nitrogen/generated/ios/swift/HybridViewModelSpec_cxx.swift @@ -143,6 +143,44 @@ open class HybridViewModelSpec_cxx { } // Methods + @inline(__always) + public final func getPropertyCountAsync() -> bridge.Result_std__shared_ptr_Promise_double___ { + do { + let __result = try self.__implementation.getPropertyCountAsync() + let __resultCpp = { () -> bridge.std__shared_ptr_Promise_double__ in + let __promise = bridge.create_std__shared_ptr_Promise_double__() + let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_double__(__promise) + __result + .then({ __result in __promiseHolder.resolve(__result) }) + .catch({ __error in __promiseHolder.reject(__error.toCpp()) }) + return __promise + }() + return bridge.create_Result_std__shared_ptr_Promise_double___(__resultCpp) + } catch (let __error) { + let __exceptionPtr = __error.toCpp() + return bridge.create_Result_std__shared_ptr_Promise_double___(__exceptionPtr) + } + } + + @inline(__always) + public final func getInstanceCountAsync() -> bridge.Result_std__shared_ptr_Promise_double___ { + do { + let __result = try self.__implementation.getInstanceCountAsync() + let __resultCpp = { () -> bridge.std__shared_ptr_Promise_double__ in + let __promise = bridge.create_std__shared_ptr_Promise_double__() + let __promiseHolder = bridge.wrap_std__shared_ptr_Promise_double__(__promise) + __result + .then({ __result in __promiseHolder.resolve(__result) }) + .catch({ __error in __promiseHolder.reject(__error.toCpp()) }) + return __promise + }() + return bridge.create_Result_std__shared_ptr_Promise_double___(__resultCpp) + } catch (let __error) { + let __exceptionPtr = __error.toCpp() + return bridge.create_Result_std__shared_ptr_Promise_double___(__exceptionPtr) + } + } + @inline(__always) public final func createInstanceByIndex(index: Double) -> bridge.Result_std__optional_std__shared_ptr_HybridViewModelInstanceSpec___ { do { diff --git a/nitrogen/generated/shared/c++/HybridViewModelSpec.cpp b/nitrogen/generated/shared/c++/HybridViewModelSpec.cpp index 78f51ba0..f6605533 100644 --- a/nitrogen/generated/shared/c++/HybridViewModelSpec.cpp +++ b/nitrogen/generated/shared/c++/HybridViewModelSpec.cpp @@ -17,6 +17,8 @@ namespace margelo::nitro::rive { prototype.registerHybridGetter("propertyCount", &HybridViewModelSpec::getPropertyCount); prototype.registerHybridGetter("instanceCount", &HybridViewModelSpec::getInstanceCount); prototype.registerHybridGetter("modelName", &HybridViewModelSpec::getModelName); + prototype.registerHybridMethod("getPropertyCountAsync", &HybridViewModelSpec::getPropertyCountAsync); + prototype.registerHybridMethod("getInstanceCountAsync", &HybridViewModelSpec::getInstanceCountAsync); prototype.registerHybridMethod("createInstanceByIndex", &HybridViewModelSpec::createInstanceByIndex); prototype.registerHybridMethod("createInstanceByName", &HybridViewModelSpec::createInstanceByName); prototype.registerHybridMethod("createDefaultInstance", &HybridViewModelSpec::createDefaultInstance); diff --git a/nitrogen/generated/shared/c++/HybridViewModelSpec.hpp b/nitrogen/generated/shared/c++/HybridViewModelSpec.hpp index 2ef01abe..5564cc5c 100644 --- a/nitrogen/generated/shared/c++/HybridViewModelSpec.hpp +++ b/nitrogen/generated/shared/c++/HybridViewModelSpec.hpp @@ -17,10 +17,10 @@ namespace margelo::nitro::rive { class HybridViewModelInstanceSpec; } #include +#include #include #include "HybridViewModelInstanceSpec.hpp" #include -#include namespace margelo::nitro::rive { @@ -55,6 +55,8 @@ namespace margelo::nitro::rive { public: // Methods + virtual std::shared_ptr> getPropertyCountAsync() = 0; + virtual std::shared_ptr> getInstanceCountAsync() = 0; virtual std::optional> createInstanceByIndex(double index) = 0; virtual std::optional> createInstanceByName(const std::string& name) = 0; virtual std::optional> createDefaultInstance() = 0; diff --git a/src/specs/ViewModel.nitro.ts b/src/specs/ViewModel.nitro.ts index 4b241102..6f80f782 100644 --- a/src/specs/ViewModel.nitro.ts +++ b/src/specs/ViewModel.nitro.ts @@ -8,12 +8,16 @@ import type { BindableArtboard } from './BindableArtboard.nitro'; */ export interface ViewModel extends HybridObject<{ ios: 'swift'; android: 'kotlin' }> { - /** The number of properties in the view model */ + /** @deprecated Use getPropertyCountAsync instead */ readonly propertyCount: number; - /** The number of view model instances in the view model */ + /** @deprecated Use getInstanceCountAsync instead */ readonly instanceCount: number; /** The name of the view model */ readonly modelName: string; + /** The number of properties in the view model */ + getPropertyCountAsync(): Promise; + /** The number of view model instances in the view model */ + getInstanceCountAsync(): Promise; /** @deprecated Use createInstanceByNameAsync instead */ createInstanceByIndex(index: number): ViewModelInstance | undefined; /** @deprecated Use createInstanceByNameAsync instead */