package expo.modules.ayasofyazilimprinter import android.content.Context import android.net.Uri import com.google.mlkit.vision.common.InputImage import com.google.mlkit.vision.text.TextRecognition import com.google.mlkit.vision.text.latin.TextRecognizerOptions import expo.modules.kotlin.Promise import expo.modules.kotlin.modules.Module import expo.modules.kotlin.modules.ModuleDefinition import java.io.IOException class AyasofyazilimPrinterModule : Module() { override fun definition() = ModuleDefinition { Name("AyasofyazilimPrinter") // Defines an async function for text recognition from image path AsyncFunction("recognizeTextFromPath") { imagePath: String, promise: Promise -> recognizeTextFromImagePath(appContext.reactContext!!, imagePath, promise) } // Defines an async function for text recognition from URI AsyncFunction("recognizeTextFromUri") { imageUri: String, promise: Promise -> recognizeTextFromImageUri(appContext.reactContext!!, imageUri, promise) } // Optional: Keep events if you need them Events("onTextRecognized", "onError") } private fun recognizeTextFromImagePath(context: Context, imagePath: String, promise: Promise) { try { val image = InputImage.fromFilePath(context, Uri.parse(imagePath)) processImage(image, promise) } catch (e: IOException) { promise.reject("IMAGE_LOAD_ERROR", "Failed to load image from path: $imagePath", e) } catch (e: Exception) { promise.reject("UNKNOWN_ERROR", "An unexpected error occurred", e) } } private fun recognizeTextFromImageUri(context: Context, imageUri: String, promise: Promise) { try { val uri = Uri.parse(imageUri) val image = InputImage.fromFilePath(context, uri) processImage(image, promise) } catch (e: IOException) { promise.reject("IMAGE_LOAD_ERROR", "Failed to load image from URI: $imageUri", e) } catch (e: Exception) { promise.reject("UNKNOWN_ERROR", "An unexpected error occurred", e) } } private fun processImage(image: InputImage, promise: Promise) { val recognizer = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS) recognizer.process(image) .addOnSuccessListener { visionText -> val resultText = visionText.text promise.resolve(resultText) } .addOnFailureListener { exception -> val errorMessage = exception.message ?: "Text recognition failed" promise.reject("TEXT_RECOGNITION_ERROR", errorMessage, exception) // Optional: Send error event sendEvent("onError", mapOf("error" to errorMessage)) } } }