@@ -782,48 +782,78 @@ public void onValidateInAppFailure(String error) {
782782 @ ReactMethod
783783 public void validateAndLogInAppPurchaseV2 (ReadableMap purchaseDetails , ReadableMap additionalParameters ) {
784784 try {
785+ // Extract and validate required fields
785786 String purchaseType = purchaseDetails .getString ("purchaseType" );
786787 String purchaseToken = purchaseDetails .getString ("transactionId" );
787788 String productId = purchaseDetails .getString ("productId" );
788789
789- // Convert purchaseType string to AFPurchaseType enum
790- AFPurchaseType afPurchaseType ;
791- if ("subscription" .equals (purchaseType )) {
792- afPurchaseType = AFPurchaseType .SUBSCRIPTION ;
793- } else {
794- afPurchaseType = AFPurchaseType .ONE_TIME_PURCHASE ;
790+ if (purchaseType == null || purchaseToken == null || productId == null ) {
791+ sendValidationError ("Missing required fields: purchaseType, transactionId, or productId" );
792+ return ;
795793 }
796794
797- // Create AFPurchaseDetails object
795+ // Convert purchase type
796+ AFPurchaseType afPurchaseType = "subscription" .equals (purchaseType )
797+ ? AFPurchaseType .SUBSCRIPTION
798+ : AFPurchaseType .ONE_TIME_PURCHASE ;
799+
800+ // Create purchase details
798801 AFPurchaseDetails afPurchaseDetails = new AFPurchaseDetails (afPurchaseType , purchaseToken , productId );
799802
800- // Convert additionalParameters to Map
801- Map <String , String > additionalParamsMap = null ;
802- if (additionalParameters != null ) {
803- additionalParamsMap = RNUtil .toMap (additionalParameters );
804- }
803+ // Convert additional parameters to string map
804+ Map <String , String > additionalParams = convertReadableMapToStringMap (additionalParameters );
805805
806+ // Validate purchase
806807 AppsFlyerLib .getInstance ().validateAndLogInAppPurchase (
807- afPurchaseDetails ,
808- additionalParamsMap ,
809- new AppsFlyerInAppPurchaseValidationCallback () {
810- @ Override
811- public void onInAppPurchaseValidationFinished (Map <String , Object > validationResult ) {
812- sendEvent (reactContext , "onValidationResult" , validationResult .toString ());
813- }
814-
815- @ Override
816- public void onInAppPurchaseValidationError (Map <String , Object > validationError ) {
817- sendEvent (reactContext , "onValidationResult" , validationError .toString ());
818- }
819- });
808+ afPurchaseDetails ,
809+ additionalParams ,
810+ new AppsFlyerInAppPurchaseValidationCallback () {
811+ @ Override
812+ public void onInAppPurchaseValidationFinished (@ NonNull Map <String , ?> result ) {
813+ sendValidationResult (result );
814+ }
815+
816+ @ Override
817+ public void onInAppPurchaseValidationError (@ NonNull Map <String , ?> error ) {
818+ sendValidationResult (error );
819+ }
820+ }
821+ );
822+ } catch (Exception e ) {
823+ sendValidationError ("Validation failed: " + e .getMessage ());
824+ }
825+ }
826+
827+ private Map <String , String > convertReadableMapToStringMap (ReadableMap readableMap ) {
828+ Map <String , String > result = new HashMap <>();
829+ if (readableMap == null ) {
830+ return result ;
831+ }
832+
833+ ReadableMapKeySetIterator iterator = readableMap .keySetIterator ();
834+ while (iterator .hasNextKey ()) {
835+ String key = iterator .nextKey ();
836+ Object value = readableMap .getDynamic (key );
837+ result .put (key , value != null ? value .toString () : null );
838+ }
839+ return result ;
840+ }
841+
842+ private void sendValidationResult (Map <String , ?> data ) {
843+ try {
844+ JSONObject json = new JSONObject (data );
845+ sendEvent (reactContext , afOnValidationResult , json .toString ());
820846 } catch (Exception e ) {
821- Map <String , Object > error = new HashMap <>();
822- error .put ("error" , e .getMessage ());
823- sendEvent (reactContext , "onValidationResult" , error .toString ());
847+ sendEvent (reactContext , afOnValidationResult , data .toString ());
824848 }
825849 }
826850
851+ private void sendValidationError (String errorMessage ) {
852+ Map <String , Object > error = new HashMap <>();
853+ error .put ("error" , errorMessage );
854+ sendValidationResult (error );
855+ }
856+
827857 @ ReactMethod
828858 public void sendPushNotificationData (ReadableMap pushPayload , Callback errorCallback ) {
829859 JSONObject payload = RNUtil .readableMapToJson (pushPayload );
0 commit comments