package com.reactnativesmspngmeandroid import android.content.Context import android.graphics.Color import android.util.Log import androidx.appcompat.app.AppCompatActivity import com.facebook.react.bridge.* import com.pngme.sdk.library.PngmeSdk import com.pngme.sdk.library.views.PngmeDialogStyle class SDKWrapper(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) { private val mReactContext: ReactContext = reactContext companion object { private const val TAG = "SDKWrapper" lateinit var context: Context // Response constants private const val E_ACTIVITY_DOES_NOT_EXIST = "E_ACTIVITY_DOES_NOT_EXIST" private const val SDK_SUCCESS = "success" private const val SDK_ERROR = "E_ON_SDK" } init { context = reactContext.applicationContext } override fun getName(): String = "SDKWrapper" @ReactMethod fun go(params: ReadableMap, onCompleteCallback: Callback) { try { Log.d(TAG, "go() called") val currentActivity = currentActivity as? AppCompatActivity if (currentActivity == null) { onCompleteCallback.invoke(E_ACTIVITY_DOES_NOT_EXIST, "No current activity available") return } // Extract and validate required parameters val clientKey = params.getString("clientKey") if (clientKey.isNullOrEmpty()) { onCompleteCallback.invoke("E_INVALID_PARAMS", "ClientKey is required") return } val externalId = params.getString("externalId") if (externalId.isNullOrEmpty()) { onCompleteCallback.invoke("E_INVALID_PARAMS", "ExternalId is required") return } val companyName = params.getString("companyName") if (companyName.isNullOrEmpty()) { onCompleteCallback.invoke("E_INVALID_PARAMS", "CompanyName is required") return } // Extract optional parameters val firstName = params.getString("firstName") ?: "" val lastName = params.getString("lastName") ?: "" val email = params.getString("email") ?: "" val phoneNumber = params.getString("phoneNumber") ?: "" Log.d(TAG, "Calling PngmeSdk.go() - this should show the dialog") // Call the SDK PngmeSdk.go( activity = currentActivity, clientKey = clientKey, firstName = firstName, lastName = lastName, email = email, phoneNumber = phoneNumber, externalId = externalId, companyName = companyName, onComplete = { onCompleteCallback.invoke(SDK_SUCCESS) } ) } catch (error: Exception) { Log.e(TAG, "Error calling PngmeSdk.go()", error) onCompleteCallback.invoke("E_ON_SDK", error.message ?: "Unknown error") } } @ReactMethod fun goWithCustomDialog(params: ReadableMap, onCompleteCallback: Callback) { // Just delegate to go() go(params, onCompleteCallback) } @ReactMethod fun goWithStyle(params: ReadableMap, styleParams: ReadableMap, onCompleteCallback: Callback) { try { val currentActivity = currentActivity as? AppCompatActivity if (currentActivity == null) { onCompleteCallback.invoke(E_ACTIVITY_DOES_NOT_EXIST, "No current activity available") return } // Extract and validate required parameters val clientKey = params.getString("clientKey") if (clientKey.isNullOrEmpty()) { onCompleteCallback.invoke("E_INVALID_PARAMS", "ClientKey is required") return } val externalId = params.getString("externalId") if (externalId.isNullOrEmpty()) { onCompleteCallback.invoke("E_INVALID_PARAMS", "ExternalId is required") return } val companyName = params.getString("companyName") if (companyName.isNullOrEmpty()) { onCompleteCallback.invoke("E_INVALID_PARAMS", "CompanyName is required") return } // Extract optional parameters val firstName = params.getString("firstName") ?: "" val lastName = params.getString("lastName") ?: "" val email = params.getString("email") ?: "" val phoneNumber = params.getString("phoneNumber") ?: "" val dialogStyle = createDialogStyleFromParams(styleParams) PngmeSdk.go( activity = currentActivity, clientKey = clientKey, firstName = firstName, lastName = lastName, email = email, phoneNumber = phoneNumber, externalId = externalId, companyName = companyName, onComplete = { onCompleteCallback.invoke(SDK_SUCCESS) }, dialogStyle = dialogStyle ) } catch (error: Exception) { Log.e(TAG, "Error calling PngmeSdk.goWithStyle()", error) onCompleteCallback.invoke("E_ON_SDK", error.message ?: "Unknown error") } } @ReactMethod fun setDefaultStyle(styleParams: ReadableMap) { try { val dialogStyle = createDialogStyleFromParams(styleParams) PngmeSdk.setDefaultStyle(dialogStyle) } catch (ex: Exception) { Log.e(TAG, "Error setting default style", ex) } } @ReactMethod fun clearDefaultStyle() { try { PngmeSdk.clearDefaultStyle() } catch (ex: Exception) { Log.e(TAG, "Error clearing default style", ex) } } @ReactMethod fun isPermissionGranted(promise: Promise) { try { val permissionGranted = PngmeSdk.isPermissionGranted(context) promise.resolve(permissionGranted) } catch (error: Throwable) { promise.reject(error) } } @ReactMethod fun getUserUuid(promise: Promise) { try { val userUuid = PngmeSdk.getUserUuid(context) promise.resolve(userUuid) } catch (error: Throwable) { promise.reject(error) } } private fun getFloatOrNull(map: ReadableMap, key: String): Float? { return try { if (map.hasKey(key) && !map.isNull(key)) { map.getDouble(key).toFloat() } else null } catch (e: Exception) { Log.w(TAG, "Invalid $key value") null } } private fun createDialogStyleFromParams(styleParams: ReadableMap): PngmeDialogStyle { return PngmeDialogStyle( primaryColor = styleParams.getString("primaryColor")?.let { try { Color.parseColor(it) } catch (e: Exception) { Log.w(TAG, "Invalid primaryColor: $it") null } }, backgroundColor = styleParams.getString("backgroundColor")?.let { try { Color.parseColor(it) } catch (e: Exception) { Log.w(TAG, "Invalid backgroundColor: $it") null } }, textColor = styleParams.getString("textColor")?.let { try { Color.parseColor(it) } catch (e: Exception) { Log.w(TAG, "Invalid textColor: $it") null } }, buttonBackgroundColor = styleParams.getString("buttonBackgroundColor")?.let { try { Color.parseColor(it) } catch (e: Exception) { Log.w(TAG, "Invalid buttonBackgroundColor: $it") null } }, buttonTextColor = styleParams.getString("buttonTextColor")?.let { try { Color.parseColor(it) } catch (e: Exception) { Log.w(TAG, "Invalid buttonTextColor: $it") null } }, titleTextSize = getFloatOrNull(styleParams, "titleTextSize"), bodyTextSize = getFloatOrNull(styleParams, "bodyTextSize"), buttonTextSize = getFloatOrNull(styleParams, "buttonTextSize"), buttonCornerRadius = getFloatOrNull(styleParams, "buttonCornerRadius"), buttonElevation = getFloatOrNull(styleParams, "buttonElevation"), customTitle = styleParams.getString("customTitle"), customSmsDescription = styleParams.getString("customSmsDescription"), customPrivacyDescription = styleParams.getString("customPrivacyDescription"), customButtonText = styleParams.getString("customButtonText"), privacyPolicyUrl = styleParams.getString("privacyPolicyUrl"), eulaUrl = styleParams.getString("eulaUrl") ) } }