From 3c74a1ca8dba02653ed54b0be5b49a6fb1aad303 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 4 Jun 2026 15:42:43 +0000 Subject: [PATCH] refactor(ios): move rejectPromiseWithMessage helper into RNMLKit core The rejectPromiseWithMessage Swift helper was duplicated verbatim in the face-detection, object-detection, and image-labeling modules. Move it to RNMLKitCore as a public function so it can be shared across modules (including the upcoming barcode scanning module) instead of being copied into each one. Closes #254 --- .changeset/move-reject-promise-to-core.md | 8 ++++++++ modules/react-native-mlkit-core/README.md | 17 +++++++++++++++++ .../ios/RNMLKitPromise.swift | 11 +++++++++++ .../ios/RNMLKitFaceDetectionModule.swift | 7 ------- .../ios/RNMLKitImageLabelingModule.swift | 8 +------- .../ios/RNMLKitObjectDetectionModule.swift | 8 +------- 6 files changed, 38 insertions(+), 21 deletions(-) create mode 100644 .changeset/move-reject-promise-to-core.md create mode 100644 modules/react-native-mlkit-core/ios/RNMLKitPromise.swift diff --git a/.changeset/move-reject-promise-to-core.md b/.changeset/move-reject-promise-to-core.md new file mode 100644 index 00000000..a83e3fb2 --- /dev/null +++ b/.changeset/move-reject-promise-to-core.md @@ -0,0 +1,8 @@ +--- +"@infinitered/react-native-mlkit-core": minor +"@infinitered/react-native-mlkit-face-detection": patch +"@infinitered/react-native-mlkit-object-detection": patch +"@infinitered/react-native-mlkit-image-labeling": patch +--- + +Move the `rejectPromiseWithMessage` Swift helper into RNMLKit core so it can be shared across modules instead of being duplicated in each one. diff --git a/modules/react-native-mlkit-core/README.md b/modules/react-native-mlkit-core/README.md index ae820e2f..57fdec99 100644 --- a/modules/react-native-mlkit-core/README.md +++ b/modules/react-native-mlkit-core/README.md @@ -50,6 +50,23 @@ var image:InputImage = RNMLKitImage(imagePath, appContext.reactContext!!).image ImagePickerAsset. - `appContext` is the AppContext from your expo module -- it's accessible as a property on the Module class. +### rejectPromiseWithMessage + +#### Swift + +A shared helper for rejecting an Expo `Promise` with a consistent `NSError` shape. Use it from any RNMLKit module to +surface errors back to JavaScript. + +```swift +import RNMLKitCore + +rejectPromiseWithMessage(promise: promise, message: "Something went wrong", domain: ERROR_DOMAIN) +``` + +- `promise` is the Expo `Promise` to reject. +- `message` is the localized description attached to the error. +- `domain` is the error domain (e.g. a module-specific error domain constant). + ### React Components #### BoundingBoxView diff --git a/modules/react-native-mlkit-core/ios/RNMLKitPromise.swift b/modules/react-native-mlkit-core/ios/RNMLKitPromise.swift new file mode 100644 index 00000000..2ae21339 --- /dev/null +++ b/modules/react-native-mlkit-core/ios/RNMLKitPromise.swift @@ -0,0 +1,11 @@ +import ExpoModulesCore + +/// Rejects a promise with a specified message and domain. +/// +/// Shared helper used across the React Native MLKit modules to surface +/// errors back to JavaScript with a consistent `NSError` shape. +public func rejectPromiseWithMessage(promise: Promise, message: String, domain: String) { + promise.reject( + NSError(domain: domain, code: 1, userInfo: [NSLocalizedDescriptionKey: message]) + ) +} diff --git a/modules/react-native-mlkit-face-detection/ios/RNMLKitFaceDetectionModule.swift b/modules/react-native-mlkit-face-detection/ios/RNMLKitFaceDetectionModule.swift index 63ebb9a9..36e0ac93 100644 --- a/modules/react-native-mlkit-face-detection/ios/RNMLKitFaceDetectionModule.swift +++ b/modules/react-native-mlkit-face-detection/ios/RNMLKitFaceDetectionModule.swift @@ -3,13 +3,6 @@ import ExpoModulesCore import MLKitFaceDetection import RNMLKitCore -// Function to reject a promise with a specified message and domain -func rejectPromiseWithMessage(promise: Promise, message: String, domain: String) { - promise.reject( - NSError(domain: domain, code: 1, userInfo: [NSLocalizedDescriptionKey: message]) - ) -} - let ERROR_DOMAIN: String = "red.infinite.reactnativemlkit.FaceDetectorErrorDomain" diff --git a/modules/react-native-mlkit-image-labeling/ios/RNMLKitImageLabelingModule.swift b/modules/react-native-mlkit-image-labeling/ios/RNMLKitImageLabelingModule.swift index 87db9b8b..be307bb4 100644 --- a/modules/react-native-mlkit-image-labeling/ios/RNMLKitImageLabelingModule.swift +++ b/modules/react-native-mlkit-image-labeling/ios/RNMLKitImageLabelingModule.swift @@ -2,6 +2,7 @@ import ExpoModulesCore import MLKitCommon import MLKitImageLabelingCustom import MLKitVision +import RNMLKitCore // Structure to represent the result of image labeling struct RNMLKitImageLabelResult: Record { @@ -23,13 +24,6 @@ struct RNMLKitImageLabelerOptionsRecord: Record { var maxResultCount: Int = 10 } -// Function to reject a promise with a specified message and domain -func rejectPromiseWithMessage(promise: Promise, message: String, domain: String) { - promise.reject( - NSError(domain: domain, code: 1, userInfo: [NSLocalizedDescriptionKey: message]) - ) -} - struct RNMLKitImageLabelerSpec: Record { @Field var modelName: String = "" diff --git a/modules/react-native-mlkit-object-detection/ios/RNMLKitObjectDetectionModule.swift b/modules/react-native-mlkit-object-detection/ios/RNMLKitObjectDetectionModule.swift index 4ed138d0..34d15e10 100644 --- a/modules/react-native-mlkit-object-detection/ios/RNMLKitObjectDetectionModule.swift +++ b/modules/react-native-mlkit-object-detection/ios/RNMLKitObjectDetectionModule.swift @@ -1,11 +1,5 @@ import ExpoModulesCore - -// Function to reject a promise with a specified message and domain -func rejectPromiseWithMessage(promise: Promise, message: String, domain: String) { - promise.reject( - NSError(domain: domain, code: 1, userInfo: [NSLocalizedDescriptionKey: message]) - ) -} +import RNMLKitCore public struct RNMLKitObjectDetectionModelSpec: Record { public init() {}