react-native-iap 8.5.3 → 8.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/README.md +4 -20
  2. package/RNIap.podspec +33 -18
  3. package/android/build.gradle +137 -38
  4. package/android/gradle.properties +8 -0
  5. package/ios/RNIapIos-Bridging-Header.h +2 -0
  6. package/ios/RNIapIos.m +13 -0
  7. package/ios/RNIapIos.swift +84 -36
  8. package/ios/{RNIap.xcodeproj → RNIapIos.xcodeproj}/project.pbxproj +29 -116
  9. package/lib/commonjs/__test__/iap.test.js +21 -0
  10. package/lib/commonjs/__test__/iap.test.js.map +1 -0
  11. package/lib/commonjs/hooks/useIAP.js +78 -0
  12. package/lib/commonjs/hooks/useIAP.js.map +1 -0
  13. package/lib/commonjs/hooks/withIAPContext.js +92 -0
  14. package/lib/commonjs/hooks/withIAPContext.js.map +1 -0
  15. package/lib/commonjs/iap.js +577 -0
  16. package/lib/commonjs/iap.js.map +1 -0
  17. package/lib/commonjs/index.js +59 -0
  18. package/lib/commonjs/index.js.map +1 -0
  19. package/lib/commonjs/types/amazon.js +2 -0
  20. package/lib/commonjs/types/amazon.js.map +1 -0
  21. package/lib/commonjs/types/android.js +55 -0
  22. package/lib/commonjs/types/android.js.map +1 -0
  23. package/lib/commonjs/types/apple.js +165 -0
  24. package/lib/commonjs/types/apple.js.map +1 -0
  25. package/lib/commonjs/types/index.js +59 -0
  26. package/lib/commonjs/types/index.js.map +1 -0
  27. package/lib/module/__test__/iap.test.js +17 -0
  28. package/lib/module/__test__/iap.test.js.map +1 -0
  29. package/lib/module/hooks/useIAP.js +68 -0
  30. package/lib/module/hooks/useIAP.js.map +1 -0
  31. package/lib/module/hooks/withIAPContext.js +76 -0
  32. package/lib/module/hooks/withIAPContext.js.map +1 -0
  33. package/lib/module/iap.js +488 -0
  34. package/lib/module/iap.js.map +1 -0
  35. package/lib/module/index.js +6 -0
  36. package/lib/module/index.js.map +1 -0
  37. package/lib/module/types/amazon.js +2 -0
  38. package/lib/module/types/amazon.js.map +1 -0
  39. package/lib/module/types/android.js +44 -0
  40. package/lib/module/types/android.js.map +1 -0
  41. package/lib/module/types/apple.js +153 -0
  42. package/lib/module/types/apple.js.map +1 -0
  43. package/lib/module/types/index.js +48 -0
  44. package/lib/module/types/index.js.map +1 -0
  45. package/lib/typescript/__test__/iap.test.d.ts +1 -0
  46. package/lib/typescript/hooks/useIAP.d.ts +22 -0
  47. package/lib/typescript/hooks/withIAPContext.d.ts +22 -0
  48. package/lib/typescript/iap.d.ts +195 -0
  49. package/lib/typescript/index.d.ts +5 -0
  50. package/lib/typescript/types/amazon.d.ts +23 -0
  51. package/lib/typescript/types/android.d.ts +47 -0
  52. package/lib/typescript/types/apple.d.ts +424 -0
  53. package/lib/typescript/types/index.d.ts +146 -0
  54. package/package.json +80 -47
  55. package/src/__test__/iap.test.ts +20 -0
  56. package/src/hooks/useIAP.ts +130 -0
  57. package/src/hooks/withIAPContext.tsx +160 -0
  58. package/src/iap.ts +686 -0
  59. package/src/index.ts +7 -0
  60. package/src/types/amazon.ts +23 -0
  61. package/src/types/android.ts +51 -0
  62. package/src/types/apple.ts +467 -0
  63. package/src/types/index.ts +185 -0
  64. package/.editorconfig +0 -10
  65. package/.flowconfig +0 -11
  66. package/.monolinterrc +0 -3
  67. package/.prettierignore +0 -6
  68. package/.swiftlint.yml +0 -11
  69. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  70. package/android/gradle/wrapper/gradle-wrapper.properties +0 -6
  71. package/android/gradlew +0 -160
  72. package/android/gradlew.bat +0 -90
  73. package/babel.config.js +0 -12
  74. package/index.ts +0 -5
  75. package/ios/RNIap.xcodeproj/xcshareddata/xcschemes/RNIap.xcscheme +0 -80
  76. package/jest.config.js +0 -190
  77. package/test/mocks/react-native-modules.js +0 -14
package/README.md CHANGED
@@ -5,14 +5,14 @@
5
5
 
6
6
  [![Download](http://img.shields.io/npm/dm/react-native-iap.svg?style=flat-square)](https://npmjs.org/package/react-native-iap)
7
7
  [![CI](https://github.com/dooboolab/react-native-iap/actions/workflows/ci.yml/badge.svg)](https://github.com/dooboolab/react-native-iap/actions/workflows/ci.yml)
8
- [![document](https://github.com/dooboolab/react-native-iap/actions/workflows/deploy-document.yml/badge.svg)](https://github.com/dooboolab/react-native-iap/actions/workflows/deploy-document.yml)
8
+ [![document](https://github.com/dooboolab/react-native-iap/actions/workflows/deploy-documentation.yml/badge.svg)](https://github.com/dooboolab/react-native-iap/actions/workflows/deploy-documentation.yml)
9
9
  [![License](https://img.shields.io/npm/l/react-native-iap.svg)](https://npmjs.org/package/react-native-iap)
10
10
  [![Vulnerabilities](https://img.shields.io/snyk/vulnerabilities/github/dooboolab/react-native-iap.svg)](https://github.com/dooboolab/react-native-iap)
11
11
  [![Issue Opened](https://img.shields.io/opencollective/all/react-native-iap.svg)](https://opencollective.com/react-native-iap#backers)
12
12
  [![Issue Opened](https://img.shields.io/github/issues/dooboolab/react-native-iap.svg)](https://github.com/dooboolab/react-native-iap/issues)
13
13
  [![Issue Closed](https://img.shields.io/github/issues-closed/dooboolab/react-native-iap.svg)](https://github.com/dooboolab/react-native-iap/issues?q=is%3Aissue+is%3Aclosed)
14
14
  [![PR Opened](https://img.shields.io/github/issues-pr/dooboolab/react-native-iap.svg)](https://github.com/dooboolab/react-native-iap/pulls)
15
- [![PR Closed](https://img.shields.io/github/issues-pr-closed/dooboolab/react-native-iap.svg)](https://github.com/dooboolab/react-native-iap/pulls?q=is%3Apr+is%3Aclosed) [![Greenkeeper badge](https://badges.greenkeeper.io/dooboolab/react-native-iap.svg)](https://greenkeeper.io/)
15
+ [![PR Closed](https://img.shields.io/github/issues-pr-closed/dooboolab/react-native-iap.svg)](https://github.com/dooboolab/react-native-iap/pulls?q=is%3Apr+is%3Aclosed)
16
16
  [![FOSSA Status](https://app.fossa.com/api/projects/git%2Bgithub.com%2Fdooboolab%2Freact-native-iap.svg?type=shield)](https://app.fossa.com/projects/git%2Bgithub.com%2Fdooboolab%2Freact-native-iap?ref=badge_shield)
17
17
 
18
18
  ## Documentation
@@ -141,25 +141,9 @@ If you're looking for a module going further than react-native-iap, we recommend
141
141
 
142
142
  - Please refer to [Blog][blog-config-steps].
143
143
 
144
- ## [Deprecated README][readme-deprecated]
144
+ ## Example
145
145
 
146
- - If you are using `react-native-iap@^2.*`, please follow the above README.
147
-
148
- ## Usage
149
-
150
- You can look in the [`RNIapExample/`][example] folder to try the example.
151
-
152
- NOTE: To run `RNIapExample` on Android use the variant flag as follows:
153
-
154
- ```
155
- yarn android --variant=MY_VARIANT
156
- ```
157
-
158
- where `MY_VARIANT` is `PlayDebug` or `AmazonDebug`
159
-
160
- Below is basic implementation which is also provided in `RNIapExample` project.
161
-
162
- If you want more advanced one please refer to [dooboolab.com/sponsor.tsx](https://github.com/hyochan/dooboolab.com/blob/main/src/components/pages/Sponsor.tsx)
146
+ Follow [this guide](./IapExample/README.md) to get the example running.
163
147
 
164
148
  ## Sponsoring
165
149
 
package/RNIap.podspec CHANGED
@@ -1,23 +1,38 @@
1
- require 'json'
2
- package = JSON.parse(File.read(File.join(__dir__, 'package.json')))
1
+ require "json"
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, "package.json")))
4
+ folly_version = '2021.06.28.00-v2'
5
+ folly_compiler_flags = '-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32'
3
6
 
4
7
  Pod::Spec.new do |s|
5
- s.name = "RNIap"
6
- s.version = package['version']
7
- s.summary = package['description']
8
- s.homepage = "https://github.com/dooboolab/react-native-iap"
9
- s.license = "MIT"
10
- s.author = package['author']
11
- s.platforms = { :ios => "9.0", :tvos => "9.0" }
12
- s.source = { :git => "https://github.com/dooboolab/react-native-iap.git", :tag => "#{s.version}" }
13
- s.source_files = "ios/*.{h,m,swift}"
14
- s.script_phase = {
15
- :name => 'Copy Swift Header',
16
- :script => 'ditto "${DERIVED_SOURCES_DIR}/${PRODUCT_MODULE_NAME}-Swift.h" "${PODS_ROOT}/Headers/Public/${PRODUCT_MODULE_NAME}/${PRODUCT_MODULE_NAME}-Swift.h"',
17
- :execution_position => :after_compile
18
- }
19
- s.swift_version = "4.2"
8
+ s.name = "RNIap"
9
+ s.version = package["version"]
10
+ s.summary = package["description"]
11
+ s.homepage = package["homepage"]
12
+ s.license = package["license"]
13
+ s.authors = package["author"]
14
+
15
+ s.platforms = { :ios => "10.0" }
16
+ s.source = { :git => "https://github.com/dooboolab/react-native-iap.git", :tag => "#{s.version}" }
17
+
18
+ s.source_files = "ios/*.{h,m,mm,swift}"
19
+
20
20
  s.requires_arc = true
21
21
 
22
- s.dependency 'React-Core'
22
+ s.dependency "React-Core"
23
+
24
+ # Don't install the dependencies when we run `pod install` in the old architecture.
25
+ if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then
26
+ s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1"
27
+ s.pod_target_xcconfig = {
28
+ "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"",
29
+ "CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
30
+ }
31
+
32
+ s.dependency "React-Codegen"
33
+ s.dependency "RCT-Folly", folly_version
34
+ s.dependency "RCTRequired"
35
+ s.dependency "RCTTypeSafety"
36
+ s.dependency "ReactCommon/turbomodule/core"
37
+ end
23
38
  end
@@ -1,91 +1,190 @@
1
1
  buildscript {
2
- ext.DEFAULT_KOTLIN_VERSION = '1.5.10'
3
- ext.safeExtGet={prop, fallback->
4
- return rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
5
- }
6
- repositories {
2
+ // Buildscript is evaluated before everything else so we can't use getExtOrDefault
3
+ def kotlinVersion = rootProject.ext.has("kotlinVersion") ? rootProject.ext.get("kotlinVersion") : project.properties["RNIap_kotlinVersion"]
4
+
5
+ repositories {
7
6
  google()
8
7
  mavenCentral()
9
8
  }
10
9
 
11
-
12
10
  dependencies {
13
- classpath 'com.android.tools.build:gradle:4.2.2'
14
- classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${safeExtGet('kotlinVersion',DEFAULT_KOTLIN_VERSION)}"
11
+ classpath "com.android.tools.build:gradle:4.2.2"
12
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"
15
13
  }
16
14
  }
17
15
 
18
- apply plugin: 'com.android.library'
19
- apply plugin: 'kotlin-android'
16
+ def isNewArchitectureEnabled() {
17
+ return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true"
18
+ }
20
19
 
20
+ apply plugin: "com.android.library"
21
+ apply plugin: "kotlin-android"
21
22
 
22
- def DEFAULT_COMPILE_SDK_VERSION = 30
23
- def DEFAULT_BUILD_TOOLS_VERSION = "30.0.2"
24
- def DEFAULT_MIN_SDK_VERSION = 16
25
- def DEFAULT_TARGET_SDK_VERSION = 30
26
- def DEFAULT_PLAY_SERVICES_VERSION = "17.6.0"
23
+ if (isNewArchitectureEnabled()) {
24
+ apply plugin: "com.facebook.react"
25
+ }
26
+
27
+ def getExtOrDefault(name) {
28
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties["RNIap_" + name]
29
+ }
30
+
31
+ def getExtOrIntegerDefault(name) {
32
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["RNIap_" + name]).toInteger()
33
+ }
27
34
 
28
35
  android {
29
- compileSdkVersion safeExtGet("compileSdkVersion", DEFAULT_COMPILE_SDK_VERSION)
36
+ compileSdkVersion getExtOrIntegerDefault("compileSdkVersion")
30
37
 
31
38
  defaultConfig {
32
- minSdkVersion safeExtGet('minSdkVersion', DEFAULT_MIN_SDK_VERSION)
33
- targetSdkVersion safeExtGet('targetSdkVersion', DEFAULT_TARGET_SDK_VERSION)
34
- versionCode 3
35
- versionName "3.0.0"
39
+ minSdkVersion getExtOrIntegerDefault("minSdkVersion")
40
+ targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
41
+ buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
42
+ }
43
+
44
+ buildTypes {
45
+ release {
46
+ minifyEnabled false
47
+ }
36
48
  }
49
+
37
50
  lintOptions {
38
51
  abortOnError false
52
+ disable "GradleCompatible"
39
53
  }
54
+
40
55
  compileOptions {
41
56
  sourceCompatibility JavaVersion.VERSION_1_8
42
57
  targetCompatibility JavaVersion.VERSION_1_8
43
58
  }
59
+
44
60
  flavorDimensions "store"
61
+
45
62
  productFlavors {
46
- amazon{
63
+ amazon {
47
64
  dimension "store"
48
65
  }
49
- play{
66
+
67
+ play {
50
68
  dimension "store"
51
69
  }
52
70
  }
71
+
53
72
  testOptions {
54
73
  unitTests.returnDefaultValues = true
55
74
  }
56
75
  }
57
76
 
58
77
  repositories {
59
- maven {
60
- // All of React Native (JS, Android binaries) is installed from npm
61
- url "$rootDir/../node_modules/react-native/android"
62
- }
63
- google()
64
78
  mavenCentral()
79
+ google()
80
+
81
+ def found = false
82
+ def defaultDir = null
83
+ def androidSourcesName = "React Native sources"
84
+
85
+ if (rootProject.ext.has("reactNativeAndroidRoot")) {
86
+ defaultDir = rootProject.ext.get("reactNativeAndroidRoot")
87
+ } else {
88
+ defaultDir = new File(
89
+ projectDir,
90
+ "/../../../node_modules/react-native/android"
91
+ )
92
+ }
93
+
94
+ if (defaultDir.exists()) {
95
+ maven {
96
+ url defaultDir.toString()
97
+ name androidSourcesName
98
+ }
99
+
100
+ logger.info(":${project.name}:reactNativeAndroidRoot ${defaultDir.canonicalPath}")
101
+ found = true
102
+ } else {
103
+ def parentDir = rootProject.projectDir
104
+
105
+ 1.upto(5, {
106
+ if (found) return true
107
+ parentDir = parentDir.parentFile
108
+
109
+ def androidSourcesDir = new File(
110
+ parentDir,
111
+ "node_modules/react-native"
112
+ )
113
+
114
+ def androidPrebuiltBinaryDir = new File(
115
+ parentDir,
116
+ "node_modules/react-native/android"
117
+ )
118
+
119
+ if (androidPrebuiltBinaryDir.exists()) {
120
+ maven {
121
+ url androidPrebuiltBinaryDir.toString()
122
+ name androidSourcesName
123
+ }
124
+
125
+ logger.info(":${project.name}:reactNativeAndroidRoot ${androidPrebuiltBinaryDir.canonicalPath}")
126
+ found = true
127
+ } else if (androidSourcesDir.exists()) {
128
+ maven {
129
+ url androidSourcesDir.toString()
130
+ name androidSourcesName
131
+ }
132
+
133
+ logger.info(":${project.name}:reactNativeAndroidRoot ${androidSourcesDir.canonicalPath}")
134
+ found = true
135
+ }
136
+ })
137
+ }
138
+
139
+ if (!found) {
140
+ throw new GradleException(
141
+ "${project.name}: unable to locate React Native android sources. " +
142
+ "Ensure you have you installed React Native as a dependency in your project and try again."
143
+ )
144
+ }
65
145
  }
66
146
 
147
+ def kotlinVersion = getExtOrDefault("kotlinVersion")
148
+ def playServicesVersion = getExtOrDefault("playServicesVersion")
149
+ def supportLibVersion = getExtOrDefault("supportLibVersion")
150
+ def androidXVersion = getExtOrDefault("androidXVersion")
151
+ def androidXAnnotation = getExtOrDefault("androidXAnnotation")
152
+ def androidXBrowser = getExtOrDefault("androidXBrowser")
153
+
67
154
  dependencies {
68
- implementation 'com.facebook.react:react-native:+'
69
- testImplementation 'junit:junit:4.13.1'
155
+ implementation "com.facebook.react:react-native:+"
156
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
157
+
158
+ testImplementation "junit:junit:4.13.1"
70
159
  testImplementation "io.mockk:mockk:1.12.4"
71
- playImplementation 'com.android.billingclient:billing:4.0.0'
72
- def playServicesVersion = safeExtGet('playServicesVersion', DEFAULT_PLAY_SERVICES_VERSION)
160
+
161
+ playImplementation "com.android.billingclient:billing:4.0.0"
73
162
  playImplementation "com.google.android.gms:play-services-base:$playServicesVersion"
74
- amazonImplementation fileTree(dir: 'libs', include: ['*.jar'])
75
163
 
76
- def supportLibVersion = safeExtGet('supportLibVersion', safeExtGet('supportVersion', null))
77
- def androidXVersion = safeExtGet('androidXVersion', null)
164
+ amazonImplementation fileTree(dir: "libs", include: ["*.jar"])
165
+
78
166
  if (supportLibVersion && androidXVersion == null) {
79
167
  implementation "com.android.support:support-annotations:$supportLibVersion"
80
168
  implementation "com.android.support:customtabs:$supportLibVersion"
81
169
  } else {
82
170
  def defaultAndroidXVersion = "1.2.0"
171
+
83
172
  if (androidXVersion == null) {
84
173
  androidXVersion = defaultAndroidXVersion
85
174
  }
86
- def androidXAnnotation = safeExtGet('androidXAnnotation', androidXVersion)
87
- def androidXBrowser = safeExtGet('androidXBrowser', androidXVersion)
88
- implementation "androidx.annotation:annotation:$androidXAnnotation"
89
- implementation "androidx.browser:browser:$androidXBrowser"
175
+
176
+ def annotationVersion = androidXAnnotation ? androidXAnnotation : androidXVersion
177
+ def browserVersion = androidXBrowser ? androidXBrowser : androidXVersion
178
+
179
+ implementation "androidx.annotation:annotation:$annotationVersion"
180
+ implementation "androidx.browser:browser:$browserVersion"
181
+ }
182
+ }
183
+
184
+ if (isNewArchitectureEnabled()) {
185
+ react {
186
+ jsRootDir = file("../src/")
187
+ libraryName = "RNIap"
188
+ codegenJavaPackageName = "com.reactnativeiap"
90
189
  }
91
190
  }
@@ -1,2 +1,10 @@
1
+ RNIap_kotlinVersion=1.7.0
2
+ RNIap_minSdkVersion=21
3
+ RNIap_targetSdkVersion=31
4
+ RNIap_compileSdkVersion=31
5
+ RNIap_buildToolsVersion=30.0.2
6
+ RNIap_ndkversion=21.4.7075529
7
+ RNIap_playServicesVersion=17.6.0
8
+
1
9
  android.useAndroidX=true
2
10
  android.enableJetifier=true
@@ -0,0 +1,2 @@
1
+ #import <React/RCTBridgeModule.h>
2
+ #import <React/RCTViewManager.h>
package/ios/RNIapIos.m CHANGED
@@ -3,19 +3,24 @@
3
3
  #import <React/RCTBridgeModule.h>
4
4
 
5
5
  @interface RCT_EXTERN_MODULE (RNIapIos, NSObject)
6
+
6
7
  RCT_EXTERN_METHOD(initConnection:
7
8
  (RCTPromiseResolveBlock)resolve
8
9
  reject:(RCTPromiseRejectBlock)reject)
10
+
9
11
  RCT_EXTERN_METHOD(endConnection:
10
12
  (RCTPromiseResolveBlock)resolve
11
13
  reject:(RCTPromiseRejectBlock)reject)
14
+
12
15
  RCT_EXTERN_METHOD(getItems:
13
16
  (NSArray*)skus
14
17
  resolve:(RCTPromiseResolveBlock)resolve
15
18
  reject:(RCTPromiseRejectBlock)reject)
19
+
16
20
  RCT_EXTERN_METHOD(getAvailableItems:
17
21
  (RCTPromiseResolveBlock)resolve
18
22
  reject:(RCTPromiseRejectBlock)reject)
23
+
19
24
  RCT_EXTERN_METHOD(buyProduct:
20
25
  (NSString*)sku
21
26
  andDangerouslyFinishTransactionAutomatically:(BOOL)andDangerouslyFinishTransactionAutomatically
@@ -33,17 +38,22 @@ RCT_EXTERN_METHOD(buyProductWithQuantityIOS:
33
38
  quantity:(NSInteger)quantity
34
39
  resolve:(RCTPromiseResolveBlock)resolve
35
40
  reject:(RCTPromiseRejectBlock)reject)
41
+
36
42
  RCT_EXTERN_METHOD(clearTransaction:
37
43
  (RCTPromiseResolveBlock)resolve
38
44
  reject:(RCTPromiseRejectBlock)reject)
45
+
39
46
  RCT_EXTERN_METHOD(clearProducts:
40
47
  (RCTPromiseResolveBlock)resolve
41
48
  reject:(RCTPromiseRejectBlock)reject)
49
+
42
50
  RCT_EXTERN_METHOD(promotedProduct:
43
51
  (RCTPromiseResolveBlock)resolve
44
52
  reject:(RCTPromiseRejectBlock)reject)
53
+
45
54
  RCT_EXTERN_METHOD(buyPromotedProduct:(RCTPromiseResolveBlock)resolve
46
55
  reject:(RCTPromiseRejectBlock)reject)
56
+
47
57
  RCT_EXTERN_METHOD(requestReceipt:
48
58
  (BOOL)refresh
49
59
  resolve:(RCTPromiseResolveBlock)resolve
@@ -52,10 +62,13 @@ RCT_EXTERN_METHOD(finishTransaction:
52
62
  (NSString*)transactionIdentifier
53
63
  resolve:(RCTPromiseResolveBlock)resolve
54
64
  reject:(RCTPromiseRejectBlock)reject)
65
+
55
66
  RCT_EXTERN_METHOD(getPendingTransactions:
56
67
  (RCTPromiseResolveBlock)resolve
57
68
  reject:(RCTPromiseRejectBlock)reject)
69
+
58
70
  RCT_EXTERN_METHOD(presentCodeRedemptionSheet:
59
71
  (RCTPromiseResolveBlock)resolve
60
72
  reject:(RCTPromiseRejectBlock)reject)
73
+
61
74
  @end