react-native-nami-sdk 3.0.25 → 3.0.26

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.
package/src/types.ts CHANGED
@@ -1,3 +1,109 @@
1
+ export type NamiConfiguration = {
2
+ 'appPlatformID-apple': string;
3
+ 'appPlatformID-android': string;
4
+ logLevel: string;
5
+ namiLanguageCode?: NamiLanguageCodes;
6
+ initialConfig?: string;
7
+ };
8
+
9
+ export type NamiLanguageCodes =
10
+ | 'af'
11
+ | 'ar'
12
+ | 'ar-dz'
13
+ | 'ast'
14
+ | 'az'
15
+ | 'bg'
16
+ | 'be'
17
+ | 'bn'
18
+ | 'br'
19
+ | 'bs'
20
+ | 'ca'
21
+ | 'cs'
22
+ | 'cy'
23
+ | 'da'
24
+ | 'de'
25
+ | 'dsb'
26
+ | 'el'
27
+ | 'en'
28
+ | 'en-au'
29
+ | 'en-gb'
30
+ | 'eo'
31
+ | 'es'
32
+ | 'es-ar'
33
+ | 'es-co'
34
+ | 'es-mx'
35
+ | 'es-ni'
36
+ | 'es-ve'
37
+ | 'et'
38
+ | 'eu'
39
+ | 'fa'
40
+ | 'fi'
41
+ | 'fr'
42
+ | 'fy'
43
+ | 'ga'
44
+ | 'gd'
45
+ | 'gl'
46
+ | 'he'
47
+ | 'hi'
48
+ | 'hr'
49
+ | 'hsb'
50
+ | 'hu'
51
+ | 'hy'
52
+ | 'ia'
53
+ | 'id'
54
+ | 'ig'
55
+ | 'io'
56
+ | 'is'
57
+ | 'it'
58
+ | 'ja'
59
+ | 'ka'
60
+ | 'kab'
61
+ | 'kk'
62
+ | 'km'
63
+ | 'kn'
64
+ | 'ko'
65
+ | 'ky'
66
+ | 'lb'
67
+ | 'lt'
68
+ | 'lv'
69
+ | 'mk'
70
+ | 'ml'
71
+ | 'mn'
72
+ | 'mr'
73
+ | 'my'
74
+ | 'nb'
75
+ | 'ne'
76
+ | 'nl'
77
+ | 'nn'
78
+ | 'os'
79
+ | 'pa'
80
+ | 'pl'
81
+ | 'pt'
82
+ | 'pt-br'
83
+ | 'ro'
84
+ | 'ru'
85
+ | 'sk'
86
+ | 'sl'
87
+ | 'sq'
88
+ | 'sr'
89
+ | 'sr-latn'
90
+ | 'sv'
91
+ | 'sw'
92
+ | 'ta'
93
+ | 'te'
94
+ | 'tg'
95
+ | 'th'
96
+ | 'tk'
97
+ | 'tr'
98
+ | 'tt'
99
+ | 'udm'
100
+ | 'uk'
101
+ | 'ur'
102
+ | 'uz'
103
+ | 'vi'
104
+ | 'zh-hans'
105
+ | 'zh-hant';
106
+
1
107
  export type NamiSKU = {
2
108
  id: string;
3
109
  name?: string;
@@ -11,24 +117,24 @@ export type NamiSKU = {
11
117
  };
12
118
 
13
119
  export enum NamiPurchaseState {
14
- PENDING = "pending",
15
- PURCHASED = "purchased",
16
- CONSUMED = "consumed",
17
- RESUBSCRIBED = "resubscribed",
18
- UNSUBSCRIBED = "unsubscribed",
19
- DEFERRED = "deferred",
20
- FAILED = "failed",
21
- CANCELLED = "cancelled",
22
- UNKNOWN = "unknown",
120
+ PENDING = 'pending',
121
+ PURCHASED = 'purchased',
122
+ CONSUMED = 'consumed',
123
+ RESUBSCRIBED = 'resubscribed',
124
+ UNSUBSCRIBED = 'unsubscribed',
125
+ DEFERRED = 'deferred',
126
+ FAILED = 'failed',
127
+ CANCELLED = 'cancelled',
128
+ UNKNOWN = 'unknown',
23
129
  }
24
130
 
25
131
  export enum NamiRestorePurchasesState {
26
- STARTED = "started",
27
- FINISHED = "finished",
28
- ERROR = "error",
132
+ STARTED = 'started',
133
+ FINISHED = 'finished',
134
+ ERROR = 'error',
29
135
  }
30
136
 
31
- export type NamiSKUType = "unknown" | "one_time_purchase" | "subscription";
137
+ export type NamiSKUType = 'unknown' | 'one_time_purchase' | 'subscription';
32
138
 
33
139
  export type AppleProduct = {
34
140
  localizedDescription: string;
@@ -43,3 +149,139 @@ export type AppleProduct = {
43
149
  export type GoogleProduct = {};
44
150
 
45
151
  export type AmazonProduct = {};
152
+
153
+ // NameCampaignManager
154
+ export type NamiCampaign = {
155
+ id: string;
156
+ rule: string;
157
+ segment: string;
158
+ paywall: string;
159
+ type: NamiCampaignRuleType;
160
+ value?: string | null;
161
+ };
162
+
163
+ export enum NamiCampaignRuleType {
164
+ DEFAULT = 'default',
165
+ LABEL = 'label',
166
+ UNKNOWN = 'unknown',
167
+ }
168
+
169
+ export enum LaunchCampaignError {
170
+ DEFAULT_CAMPAIGN_NOT_FOUND = 0,
171
+ LABELED_CAMPAIGN_NOT_FOUND = 1,
172
+ CAMPAIGN_DATA_NOT_FOUND = 2,
173
+ PAYWALL_ALREADY_DISPLAYED = 3,
174
+ SDK_NOT_INITIALIZED = 4,
175
+ }
176
+
177
+ export enum LaunchCampaignResultAction {
178
+ FAILURE = 'FAILURE',
179
+ SUCCESS = 'SUCCESS',
180
+ }
181
+
182
+ export type FailureResultObject = {
183
+ error: string;
184
+ };
185
+
186
+ export type PaywallLaunchContext = {
187
+ // Can contain multiple product group identifiers
188
+ productGroups?: string[];
189
+ // Key-value pairs used to override template values
190
+ customAttributes: {
191
+ [key: string]: string;
192
+ };
193
+ };
194
+
195
+ // NamiCustomerManager
196
+ export type CustomerJourneyState = {
197
+ formerSubscriber: boolean;
198
+ inGracePeriod: boolean;
199
+ inTrialPeriod: boolean;
200
+ inIntroOfferPeriod: boolean;
201
+ isCancelled: boolean;
202
+ inPause: boolean;
203
+ inAccountHold: boolean;
204
+ };
205
+
206
+ export type AccountStateAction = 'login' | 'logout';
207
+
208
+ // NamiEntitlementManager
209
+ export type NamiEntitlement = {
210
+ activePurchases: NamiPurchase[];
211
+ desc: string;
212
+ name: string;
213
+ namiId: string;
214
+ purchasedSkus: NamiSKU[];
215
+ referenceId: string;
216
+ relatedSkus: NamiSKU[];
217
+ };
218
+
219
+ // NamiPayWallManager
220
+ export type NamiPurchaseSuccessApple = {
221
+ product: NamiSKU;
222
+ transactionID: string;
223
+ originalTransactionID: string;
224
+ originalPurchaseDate: number;
225
+ purchaseDate: number;
226
+ expiresDate?: number;
227
+ price: string;
228
+ currencyCode: string;
229
+ locale: string;
230
+ };
231
+
232
+ export type NamiPurchaseSuccessGooglePlay = {
233
+ product: NamiSKU;
234
+ orderId: string;
235
+ purchaseDate: number;
236
+ expiresDate?: number;
237
+ purchaseToken: string;
238
+ purchaseSource: 'CAMPAIGN' | 'MARKETPLACE' | 'UNKNOWN';
239
+ };
240
+
241
+ export type NamiPurchaseSuccessAmazon = {
242
+ product: NamiSKU;
243
+ purchaseDate: number;
244
+ expiresDate?: number;
245
+ purchaseSource: 'CAMPAIGN' | 'MARKETPLACE' | 'UNKNOWN';
246
+ receiptId: string;
247
+ localizedPrice: string;
248
+ userId: string;
249
+ marketplace: string;
250
+ };
251
+
252
+ export enum NamiPaywallAction {
253
+ BUY_SKU = 'BUY_SKU',
254
+ SELECT_SKU = 'SELECT_SKU',
255
+ RESTORE_PURCHASES = 'RESTORE_PURCHASES',
256
+ SIGN_IN = 'SIGN_IN',
257
+ CLOSE_PAYWALL = 'CLOSE_PAYWALL',
258
+ SHOW_PAYWALL = 'SHOW_PAYWALL',
259
+ PURCHASE_SELECTED_SKU = 'PURCHASE_SELECTED_SKU',
260
+ PURCHASE_SUCCESS = 'PURCHASE_SUCCESS',
261
+ PURCHASE_FAILED = 'PURCHASE_FAILED',
262
+ PURCHASE_CANCELLED = 'PURCHASE_CANCELLED',
263
+ PURCHASE_PENDING = 'PURCHASE_PENDING',
264
+ PURCHASE_UNKNOWN = 'PURCHASE_UNKNOWN',
265
+ PURCHASE_DEFERRED = 'PURCHASE_DEFERRED',
266
+ }
267
+
268
+ // NamiPurchaseManager
269
+ export type NamiPurchase = {
270
+ sku?: NamiSKU;
271
+ skuId: string;
272
+ transactionIdentifier?: string;
273
+ expires?: Date;
274
+ purchaseInitiatedTimestamp: Date;
275
+ purchaseSource?: 'CAMPAIGN' | 'MARKETPLACE' | 'UNKNOWN';
276
+ };
277
+
278
+ export type NamiPurchasesState =
279
+ | 'pending'
280
+ | 'purchased'
281
+ | 'consumed'
282
+ | 'resubscribed'
283
+ | 'unsubscribed'
284
+ | 'deferred'
285
+ | 'failed'
286
+ | 'cancelled'
287
+ | 'unknown';
package/tsconfig.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "esnext", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
4
+ "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
5
+ "lib": ["es2017"], /* Specify library files to be included in the compilation. */
6
+ "allowJs": true, /* Allow javascript files to be compiled. */
7
+ // "checkJs": true, /* Report errors in .js files. */
8
+ "jsx": "react-native", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */
9
+ "declaration": true, /* Generates corresponding '.d.ts' file. */
10
+ // "sourceMap": true, /* Generates corresponding '.map' file. */
11
+ // "outFile": "./", /* Concatenate and emit output to single file. */
12
+ "outDir": "dist", /* Redirect output structure to the directory. */
13
+ "rootDir": "src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
14
+ // "removeComments": true, /* Do not emit comments to output. */
15
+ "noEmit": true, /* Do not emit outputs. */
16
+ // "incremental": true, /* Enable incremental compilation */
17
+ // "importHelpers": true, /* Import emit helpers from 'tslib'. */
18
+ // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
19
+ "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
20
+ "useDefineForClassFields": true,
21
+
22
+ /* Strict Type-Checking Options */
23
+ "strict": true, /* Enable all strict type-checking options. */
24
+ "noImplicitAny": false, /* Raise error on expressions and declarations with an implied 'any' type. */
25
+ // "strictNullChecks": true, /* Enable strict null checks. */
26
+ // "strictFunctionTypes": true, /* Enable strict checking of function types. */
27
+ // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
28
+ // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
29
+ // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
30
+
31
+ /* Additional Checks */
32
+ // "noUnusedLocals": true, /* Report errors on unused locals. */
33
+ // "noUnusedParameters": true, /* Report errors on unused parameters. */
34
+ // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
35
+ // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
36
+
37
+ /* Module Resolution Options */
38
+ "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
39
+ // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
40
+ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
41
+ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
42
+ // "typeRoots": [""], /* List of folders to include type definitions from. */
43
+ // "types": [], /* Type declaration files to be included in compilation. */
44
+ "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
45
+ "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
46
+ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
47
+ "skipLibCheck": true, /* Skip type checking of declaration files. */
48
+ "resolveJsonModule": true,
49
+ /* Source Map Options */
50
+ // "sourceRoot": "./", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
51
+ // "mapRoot": "./", /* Specify the location where debugger should locate map files instead of generated locations. */
52
+ // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
53
+ // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
54
+
55
+ /* Experimental Options */
56
+ "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
57
+ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
58
+ },
59
+ "include": [
60
+ "./src",
61
+ ".eslintrc.js"
62
+ ],
63
+ "exclude": [
64
+ "node_modules",
65
+ "./examples",
66
+ "./build-utils",
67
+ "**/*.spec.*"
68
+ ]
69
+ }
package/index.js DELETED
@@ -1,7 +0,0 @@
1
- export { Nami } from "./src/Nami";
2
- export { NamiMLManager } from "./src/NamiMLManager";
3
- export { NamiCampaignManager } from "./src/NamiCampaignManager";
4
- export { NamiCustomerManager } from "./src/NamiCustomerManager";
5
- export { NamiEntitlementManager } from "./src/NamiEntitlementManager";
6
- export { NamiPurchaseManager } from "./src/NamiPurchaseManager";
7
- export { NamiPaywallManager } from "./src/NamiPaywallManager";
package/src/Nami.js DELETED
@@ -1,10 +0,0 @@
1
- import {NativeModules} from 'react-native';
2
-
3
- export const {NamiBridge} = NativeModules;
4
-
5
- export const Nami = {
6
- ...NamiBridge,
7
- configure(configureObj, resultCallback) {
8
- NamiBridge.configure(configureObj, resultCallback ?? (() => {}));
9
- },
10
- };
@@ -1,76 +0,0 @@
1
- import { NativeModules, NativeEventEmitter } from "react-native";
2
-
3
- export const { RNNamiCampaignManager } = NativeModules;
4
-
5
- export const NamiCampaignManager = {
6
- launchSubscription: undefined,
7
- emitter: new NativeEventEmitter(RNNamiCampaignManager),
8
- ...RNNamiCampaignManager,
9
- launch(label, withUrl, context, resultCallback, actionCallback) {
10
- this.launchSubscription?.remove();
11
- this.launchSubscription = this.emitter.addListener(
12
- "ResultCampaign",
13
- (body) => {
14
- body.action = body.action.startsWith("NAMI_")
15
- ? body.action.substring(5, body.action.length)
16
- : body.action;
17
-
18
- const {
19
- action,
20
- campaignId,
21
- paywallId,
22
- campaignName,
23
- campaignType,
24
- campaignLabel,
25
- campaignUrl,
26
- paywallName,
27
- segmentId,
28
- externalSegmentId,
29
- deeplinkUrl,
30
- skuId,
31
- componentChangeId,
32
- componentChangeName,
33
- purchaseError,
34
- purchases
35
- } = body;
36
- actionCallback(
37
- action,
38
- campaignId,
39
- paywallId,
40
- campaignName,
41
- campaignType,
42
- campaignLabel,
43
- campaignUrl,
44
- paywallName,
45
- segmentId,
46
- externalSegmentId,
47
- deeplinkUrl,
48
- skuId,
49
- componentChangeId,
50
- componentChangeName,
51
- purchaseError,
52
- purchases,
53
- );
54
- }
55
- );
56
-
57
- RNNamiCampaignManager.launch(
58
- label,
59
- withUrl ?? null,
60
- context ?? null,
61
- resultCallback ?? (() => {}),
62
- actionCallback ?? (() => {})
63
- );
64
- },
65
- isCampaignAvailable: (campaignSource) => {
66
- return RNNamiCampaignManager.isCampaignAvailable(campaignSource ?? null);
67
- },
68
- registerAvailableCampaignsHandler(callback) {
69
- const subscription = this.emitter.addListener(
70
- "AvailableCampaignsChanged",
71
- callback
72
- );
73
- RNNamiCampaignManager.registerAvailableCampaignsHandler();
74
- return subscription.remove;
75
- },
76
- };
@@ -1,35 +0,0 @@
1
- import { NativeModules, NativeEventEmitter } from 'react-native';
2
-
3
- export const { RNNamiCustomerManager } = NativeModules;
4
-
5
- export const NamiCustomerManager = {
6
- emitter: new NativeEventEmitter(RNNamiCustomerManager),
7
- ...RNNamiCustomerManager,
8
- login: customerId => {
9
- RNNamiCustomerManager.login(customerId);
10
- },
11
- logout: () => {
12
- RNNamiCustomerManager.logout();
13
- },
14
- registerJourneyStateHandler(callback) {
15
- const subscription = this.emitter.addListener(
16
- 'JourneyStateChanged',
17
- callback,
18
- );
19
- RNNamiCustomerManager.registerJourneyStateHandler();
20
- return subscription.remove;
21
- },
22
- registerAccountStateHandler(callback) {
23
- const subscription = this.emitter.addListener(
24
- 'AccountStateChanged',
25
- body => {
26
- var action = body.action.toLowerCase();
27
- var error = body.error;
28
- var success = body.success;
29
- callback(action, success, error);
30
- },
31
- );
32
- RNNamiCustomerManager.registerAccountStateHandler();
33
- return subscription.remove;
34
- },
35
- };
@@ -1,23 +0,0 @@
1
- import { NativeModules, NativeEventEmitter, Platform } from "react-native";
2
-
3
- export const { RNNamiEntitlementManager } = NativeModules;
4
-
5
- export const NamiEntitlementManager = {
6
- emitter: new NativeEventEmitter(RNNamiEntitlementManager),
7
- ...RNNamiEntitlementManager,
8
- refresh(resultCallback) {
9
- if (Platform.OS === "android") {
10
- RNNamiEntitlementManager.refresh(resultCallback ?? (() => {}));
11
- } else {
12
- RNNamiEntitlementManager.refresh();
13
- }
14
- },
15
- registerActiveEntitlementsHandler(callback) {
16
- const subscription = this.emitter.addListener(
17
- "EntitlementsChanged",
18
- callback
19
- );
20
- RNNamiEntitlementManager.registerActiveEntitlementsHandler();
21
- return subscription.remove;
22
- },
23
- };
@@ -1,7 +0,0 @@
1
- import { NativeModules } from "react-native";
2
-
3
- export const { NamiMLManagerBridge } = NativeModules;
4
-
5
- export const NamiMLManager = {
6
- ...NamiMLManagerBridge,
7
- };
@@ -1,73 +0,0 @@
1
- import { NativeModules, NativeEventEmitter } from "react-native";
2
-
3
- const { NamiPaywallManagerBridge, RNNamiPaywallManager } = NativeModules;
4
-
5
- export const NamiPaywallManager = {
6
- paywallEmitter: new NativeEventEmitter(RNNamiPaywallManager),
7
- ...RNNamiPaywallManager,
8
- ...NamiPaywallManagerBridge,
9
- buySkuCompleteApple(purchaseSuccess) {
10
- RNNamiPaywallManager.buySkuComplete(purchaseSuccess);
11
- },
12
- buySkuCompleteAmazon(purchaseSuccess) {
13
- RNNamiPaywallManager.buySkuComplete(purchaseSuccess, "Amazon");
14
- },
15
- buySkuCompleteGooglePlay(purchaseSuccess) {
16
- RNNamiPaywallManager.buySkuComplete(purchaseSuccess, "GooglePlay");
17
- },
18
- registerBuySkuHandler(callback) {
19
- var subscription = this.paywallEmitter.addListener(
20
- "RegisterBuySKU",
21
- (sku) => {
22
- callback(sku);
23
- }
24
- );
25
- RNNamiPaywallManager.registerBuySkuHandler();
26
- return subscription.remove;
27
- },
28
- registerCloseHandler(callback) {
29
- var subscription;
30
- subscription = this.paywallEmitter.addListener(
31
- "PaywallCloseRequested",
32
- (body) => {
33
- callback(body);
34
- }
35
- );
36
- RNNamiPaywallManager.registerCloseHandler();
37
- return subscription.remove;
38
- },
39
- registerSignInHandler(callback) {
40
- var subscription;
41
- subscription = this.paywallEmitter.addListener(
42
- "PaywallSignInRequested",
43
- (body) => {
44
- callback(body);
45
- }
46
- );
47
- RNNamiPaywallManager.registerSignInHandler();
48
- return subscription.remove;
49
- },
50
- registerRestoreHandler(callback) {
51
- var subscription;
52
- subscription = this.paywallEmitter.addListener(
53
- "PaywallRestoreRequested",
54
- (body) => {
55
- callback(body);
56
- }
57
- );
58
- RNNamiPaywallManager.registerRestoreHandler();
59
- return subscription.remove;
60
- },
61
- dismiss(animated) {
62
- RNNamiPaywallManager.dismiss(animated ?? true);
63
- },
64
- show: () => {
65
- RNNamiPaywallManager.show();
66
- },
67
- hide: () => {
68
- RNNamiPaywallManager.hide();
69
- },
70
- isHidden: () => {
71
- return RNNamiPaywallManager.isHidden();
72
- },
73
- };
@@ -1,37 +0,0 @@
1
- import { NativeModules, NativeEventEmitter, Platform } from "react-native";
2
-
3
- const { NamiPurchaseManagerBridge, RNNamiPurchaseManager } = NativeModules;
4
-
5
- export const NamiPurchaseManager = {
6
- emitter: new NativeEventEmitter(RNNamiPurchaseManager),
7
- ...NamiPurchaseManagerBridge,
8
- ...RNNamiPurchaseManager,
9
- registerPurchasesChangedHandler(callback) {
10
- const subscription = this.emitter.addListener(
11
- "PurchasesChanged",
12
- (body) => {
13
- var purchases = body.purchases;
14
- var purchaseState = body.purchaseState.toLowerCase();
15
- var error = body.error;
16
- callback(purchaseState, purchases, error);
17
- }
18
- );
19
- RNNamiPurchaseManager.registerPurchasesChangedHandler();
20
- return subscription.remove;
21
- },
22
- registerRestorePurchasesHandler(callback) {
23
- if (Platform.OS === "ios") {
24
- const subscription = this.emitter.addListener(
25
- "RestorePurchasesStateChanged",
26
- (body) => {
27
- var state = body.state.toLowerCase();
28
- var newPurchases = body.newPurchases;
29
- var oldPurchases = body.oldPurchases;
30
- callback(state, newPurchases, oldPurchases);
31
- }
32
- );
33
- RNNamiPurchaseManager.registerRestorePurchasesHandler();
34
- return subscription.remove;
35
- }
36
- },
37
- };