package com.unitreactnativecomponents.nativeModules.sharefile import android.content.Intent import android.net.Uri import android.util.Base64 import androidx.core.content.FileProvider import com.facebook.react.bridge.Promise import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReactContextBaseJavaModule import com.facebook.react.bridge.ReactMethod import java.io.File import java.io.FileOutputStream import java.io.IOException class UNShareFile(var reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) { @ReactMethod fun share(base64Data: String, filename: String, promise: Promise) { try { cleanSharedFiles() val file = writeFile(base64Data, File(filename).name) val mimeType = getMimeType(filename) shareFile(file, mimeType) promise.resolve(true) } catch (e: IOException) { promise.reject(e) } } private fun cleanSharedFiles() { val directoryPath = directoryPath if (directoryPath.isDirectory) { for (file in directoryPath.list()) { File(directoryPath, file).delete() } } } @Throws(IOException::class) private fun writeFile(base64Data: String, filename: String): File { val directoryPath = directoryPath directoryPath.mkdir() val newFilePath = File(directoryPath.path, filename) val bytes = Base64.decode(base64Data, Base64.DEFAULT) FileOutputStream(newFilePath, false).use { os -> os.write(bytes) os.flush() } return newFilePath } private fun shareFile(file: File, mimeType: String) { val outputFileUri: Uri = FileProvider.getUriForFile(reactContext, reactContext.packageName + ".provider", file) val intentShareFile = Intent(Intent.ACTION_SEND) intentShareFile.type = mimeType intentShareFile.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intentShareFile.putExtra(Intent.EXTRA_STREAM, outputFileUri) intentShareFile.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) intentShareFile.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) val currentActivity = reactContext.currentActivity currentActivity!!.startActivity(Intent.createChooser(intentShareFile, "")) } private fun getMimeType(filename: String): String { return when { filename.endsWith(".csv", ignoreCase = true) -> TYPE_CSV else -> TYPE_PDF } } override fun getName(): String { return MODULE_NAME } private val directoryPath: File private get() = File(reactContext.currentActivity!!.filesDir, PDF_CACHE_DIR) companion object { private const val MODULE_NAME = "UNShareFileModule" private const val TYPE_PDF: String = "application/pdf" private const val TYPE_CSV: String = "text/csv" private const val PDF_CACHE_DIR = "pdf_documents_for_sharing" } }