@24i/bigscreen-sdk 1.0.54-alpha.2835 → 1.1.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 (105) hide show
  1. package/.vscode/settings.json +6 -0
  2. package/README.md +3 -2
  3. package/package.json +10 -10
  4. package/packages/analytics/src/clients/GoogleAnalytics/GoogleAnalytics.ts +14 -10
  5. package/packages/analytics/src/clients/GoogleAnalytics/constants.ts +2 -10
  6. package/packages/analytics/src/clients/GoogleAnalytics/interface.ts +1 -6
  7. package/packages/analytics/src/clients/GoogleAnalytics/mapPayload.ts +0 -1
  8. package/packages/analytics/src/clients/TealiumAnalytics/TealiumAnalytics.ts +24 -36
  9. package/packages/analytics/src/clients/TealiumAnalytics/constants.ts +1 -5
  10. package/packages/analytics/src/clients/TealiumAnalytics/findIdForLanguage.ts +9 -0
  11. package/packages/analytics/src/clients/TealiumAnalytics/index.ts +1 -1
  12. package/packages/analytics/src/clients/TealiumAnalytics/interface.ts +1 -3
  13. package/packages/analytics/src/clients/TealiumAnalytics/mappers/__mocks__/mediaPayload.ts +14 -16
  14. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapSceneView.ts +1 -1
  15. package/packages/analytics/src/clients/TealiumAnalytics/types.ts +14 -19
  16. package/packages/analytics/src/clients/TwentyFourIQ/TwentyFourIQClient.ts +22 -13
  17. package/packages/analytics/src/clients/TwentyFourIQ/constants.ts +3 -15
  18. package/packages/analytics/src/clients/TwentyFourIQ/interface.ts +4 -7
  19. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapAdLoaded.ts +13 -0
  20. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapAdSkipped.ts +16 -0
  21. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapBase.ts +3 -6
  22. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapBuffering.ts +2 -2
  23. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapPlayerClose.ts +3 -4
  24. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapPlayerOpen.ts +3 -2
  25. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapSceneView.ts +2 -2
  26. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapScroll.ts +2 -2
  27. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoComplete.ts +3 -4
  28. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoPause.ts +3 -4
  29. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoProgress.ts +3 -4
  30. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoStart.ts +2 -2
  31. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapVideoStop.ts +2 -2
  32. package/packages/analytics/src/clients/TwentyFourIQ/types.ts +28 -45
  33. package/packages/create-package/dist/createPackage.js +66 -0
  34. package/packages/create-package/dist/createPackage.js.map +1 -0
  35. package/packages/create-package/dist/index.js +5 -0
  36. package/packages/create-package/dist/index.js.map +1 -0
  37. package/packages/create-package/dist/questionnaire/questions.js +35 -0
  38. package/packages/create-package/dist/questionnaire/questions.js.map +1 -0
  39. package/packages/create-package/dist/settings/Settings.js +10 -0
  40. package/packages/create-package/dist/settings/Settings.js.map +1 -0
  41. package/packages/create-package/dist/types.js +3 -0
  42. package/packages/create-package/dist/types.js.map +1 -0
  43. package/packages/developer-tools/src/TechnicalInfo/TechnicalInfoProvider.ts +2 -23
  44. package/packages/developer-tools/src/TechnicalInfo/__mocks__/Device.ts +0 -8
  45. package/packages/developer-tools/src/TechnicalInfo/translations.ts +0 -4
  46. package/packages/driver-androidtv/src/DeviceAndroidTV.ts +0 -38
  47. package/packages/driver-androidtv/src/__mocks__/javaScriptBridge.ts +0 -9
  48. package/packages/driver-androidtv/src/index.ts +0 -1
  49. package/packages/driver-androidtv/src/types.ts +0 -42
  50. package/packages/driver-base/src/DeviceBase.ts +0 -19
  51. package/packages/driver-base/src/__mocks__/DeviceBase.ts +0 -24
  52. package/packages/driver-base/src/index.ts +0 -3
  53. package/packages/driver-browser/src/DeviceBrowser.ts +0 -26
  54. package/packages/driver-entone/src/DeviceEntone.ts +1 -31
  55. package/packages/driver-firetv/src/DeviceFireTV.ts +1 -74
  56. package/packages/driver-firetv/src/__mocks__/javaScriptBridge.ts +0 -9
  57. package/packages/driver-hbbtv/src/DeviceHbbTV.ts +0 -26
  58. package/packages/driver-kreatv/src/DeviceKreaTV.ts +0 -26
  59. package/packages/driver-saphi/src/DeviceSaphi.ts +0 -26
  60. package/packages/driver-smartcast/src/DeviceSmartCast.ts +1 -78
  61. package/packages/driver-smartcast/src/__mocks__/api.ts +2 -32
  62. package/packages/driver-smartcast/src/types.ts +2 -48
  63. package/packages/driver-tizen/src/DeviceTizen.ts +7 -126
  64. package/packages/driver-tizen/src/ITizen.ts +202 -15116
  65. package/packages/driver-tizen/src/IWebapis.ts +87 -8643
  66. package/packages/driver-tizen/src/TizenKeys.ts +2 -2
  67. package/packages/driver-tizen/src/__mocks__/tizen.ts +8 -7
  68. package/packages/driver-tizen/src/constants.ts +195 -1
  69. package/packages/driver-tizen/src/types.ts +14 -0
  70. package/packages/driver-vidaa/src/DeviceVidaa.ts +0 -26
  71. package/packages/driver-webos/src/DeviceWebos.ts +0 -47
  72. package/packages/driver-webos/src/__mocks__/webos.ts +0 -33
  73. package/packages/driver-webos/src/constants.ts +0 -1
  74. package/packages/driver-webos/src/types.ts +0 -30
  75. package/packages/driver-xbox/src/DeviceXbox.ts +1 -30
  76. package/packages/grid/src/UnifiedGridController/UnifiedGridController.ts +6 -6
  77. package/packages/input/README.md +3 -0
  78. package/packages/input/src/Input.tsx +62 -26
  79. package/packages/input/src/utils.ts +71 -0
  80. package/packages/keyboard/src/WhitelabelKeyboard/layouts/index.ts +0 -1
  81. package/packages/keyboard/src/utils/caret.ts +8 -5
  82. package/packages/keyboard/src/utils/input.ts +6 -5
  83. package/packages/list/src/BasicList/BasicList.tsx +7 -7
  84. package/packages/list/src/CenteredList/CenteredList.tsx +2 -2
  85. package/packages/list/src/EdgeOffsetList/EdgeOffsetList.tsx +7 -7
  86. package/packages/list/src/FirstOnlyList/FirstOnlyList.tsx +2 -2
  87. package/packages/list/src/FirstOnlyVariedList/FirstOnlyVariedList.tsx +2 -2
  88. package/packages/list/src/FixedToEndList/FixedToEndList.tsx +2 -2
  89. package/packages/list/src/interface.ts +2 -2
  90. package/packages/logger/src/loggers/ConsoleLogger/ConsoleLogger.ts +1 -7
  91. package/packages/logger/src/loggers/SentryLogger/SentryLogger.ts +1 -3
  92. package/packages/router/README.md +0 -1
  93. package/packages/router/src/Router.tsx +1 -4
  94. package/packages/router/src/utils.ts +1 -1
  95. package/utils/release/release.ts +5 -7
  96. package/ci/is_ci_job_skippable.sh +0 -153
  97. package/packages/analytics/src/clients/TealiumAnalytics/findForLanguage.ts +0 -9
  98. package/packages/analytics/src/clients/TealiumAnalytics/mappers/mapAppOpen.ts +0 -13
  99. package/packages/analytics/src/clients/TwentyFourIQ/mappers/mapAdEvent.ts +0 -20
  100. package/packages/driver-base/src/types/AdInfo.ts +0 -5
  101. package/packages/driver-base/src/types/InAppPurchase.ts +0 -25
  102. package/packages/driver-firetv/src/types.ts +0 -1
  103. package/packages/input/src/handleOverflow.ts +0 -29
  104. package/packages/keyboard/src/WhitelabelKeyboard/layouts/spanish.ts +0 -26
  105. package/packages/keyboard/src/utils/setInputSelectionRange.ts +0 -10
@@ -1,20 +1,10 @@
1
1
  import {
2
2
  DeviceBase, ConnectionType, ScreenSaverStatus, VolumeRange,
3
- IAPSuccessPayload,
4
- IAPPurchaseProductData,
5
3
  } from '@24i/bigscreen-sdk/driver-base';
6
4
  import { runAsync } from '@24i/bigscreen-sdk/utils/timers';
7
5
  import { ipify } from '@24i/bigscreen-sdk/ipify';
8
- import { VendorType } from '@24i/smartapps-datalayer/api';
9
6
  import { getKeyMap } from './keymap';
10
- import {
11
- ISmartCastApi,
12
- IFA,
13
- DEFAULT_TTS_TIMEOUT,
14
- DevicePlaybackQuality,
15
- DeviceLanguage,
16
- PurchaseData,
17
- } from './types';
7
+ import { ISmartCastApi, IFA, DEFAULT_TTS_TIMEOUT, DevicePlaybackQuality } from './types';
18
8
 
19
9
  declare const window: Window & { VIZIO: ISmartCastApi };
20
10
 
@@ -39,8 +29,6 @@ export class DeviceSmartCast extends DeviceBase {
39
29
 
40
30
  lastTextToSpeechItem?: { delay: number, text: string } | null;
41
31
 
42
- deviceLanguage?: DeviceLanguage;
43
-
44
32
  API?: ISmartCastApi;
45
33
 
46
34
  IFA?: IFA;
@@ -52,7 +40,6 @@ export class DeviceSmartCast extends DeviceBase {
52
40
  this.initVisibilityChangeListener();
53
41
  this.initMouseActiveListener();
54
42
  await this.initPlatformApiListeners();
55
- this.setSubscriptionFeaturesConfiguration();
56
43
  }
57
44
 
58
45
  async initPlatformApiListeners(): Promise<void> {
@@ -97,13 +84,6 @@ export class DeviceSmartCast extends DeviceBase {
97
84
  });
98
85
  }));
99
86
 
100
- promises.push(new Promise<void>((r) => {
101
- API.setDeviceLanguageHandler((deviceLanguage: DeviceLanguage) => {
102
- this.deviceLanguage = deviceLanguage;
103
- r();
104
- });
105
- }));
106
-
107
87
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
108
88
  API.setContentChangeHandler(this.handleDeeplink);
109
89
 
@@ -249,12 +229,6 @@ export class DeviceSmartCast extends DeviceBase {
249
229
  .replace('{{us_privacy}}', IFAObject.LMT ? '1YYN' : '1YNN');
250
230
  }
251
231
 
252
- async getUserMetadata() {
253
- await this.checkAndLinkTv();
254
- const result = await this.API!.Account.getUserMetadata();
255
- return result?.data || null;
256
- }
257
-
258
232
  async getManufacturerName() {
259
233
  return 'VIZIO';
260
234
  }
@@ -291,19 +265,6 @@ export class DeviceSmartCast extends DeviceBase {
291
265
  return this.deviceId;
292
266
  }
293
267
 
294
- async getAdInfo() {
295
- const adId = this.IFA?.IFA ?? null;
296
- const type = this.IFA?.IFA_TYPE ?? 'vida';
297
- const latEnabled = (this.IFA?.LMT !== null || this.IFA?.LMT !== undefined)
298
- ? Boolean(this.IFA?.LMT)
299
- : true;
300
- return { adId, type, latEnabled };
301
- }
302
-
303
- async getOsLanguage() {
304
- return this.deviceLanguage?.code || '';
305
- }
306
-
307
268
  async getVolume() {
308
269
  return VolumeRange.UNSUPPORTED;
309
270
  }
@@ -353,42 +314,4 @@ export class DeviceSmartCast extends DeviceBase {
353
314
  // not supported on SmartCast platform
354
315
  return '';
355
316
  }
356
-
357
- setSubscriptionFeaturesConfiguration() {
358
- try {
359
- this.subscriptionFeaturesConfiguration.purchase = this.API?.Account.isSVODEnabled?.()
360
- || false;
361
- } catch {}
362
- }
363
-
364
- registerPartner(callback: (challenge: string) => Promise<string>, appKeyId: string) {
365
- this.API!.Account.registerPartner(callback, appKeyId);
366
- }
367
-
368
- async checkAndLinkTv() {
369
- const isLinked = await this.API!.Account.getLinkStatus();
370
- if (!isLinked) await this.API!.Account.startTVLink();
371
- }
372
-
373
- async purchaseProduct({ sku, serviceId }: IAPPurchaseProductData): Promise<IAPSuccessPayload> {
374
- await this.checkAndLinkTv();
375
- await this.API!.Account.getPlans({ includeBundlePlans: true });
376
- const purchaseResult = await this.API!.Account.startSVODPurchase(
377
- sku!, serviceId ?? '',
378
- );
379
- const receiptPayload: PurchaseData = {
380
- customerId: purchaseResult.data.customerId,
381
- partnerAccountId: purchaseResult.data.partnerAccountId,
382
- planCode: purchaseResult.data.planCode,
383
- addOnCodes: purchaseResult.data.addOnCodes,
384
- subscriptionId: purchaseResult.data.subscriptionId,
385
- };
386
- return { platform: VendorType.VIZIO, receiptPayload };
387
- }
388
-
389
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
390
- async cancelSubscription(data: IAPPurchaseProductData): Promise<void> {
391
- // not supported
392
- throw new Error('Not supported');
393
- }
394
317
  }
@@ -1,4 +1,4 @@
1
- import { IFA, ISmartCastApi, DevicePlaybackQuality, DeviceLanguage } from '../types';
1
+ import { IFA, ISmartCastApi, DevicePlaybackQuality } from '../types';
2
2
 
3
3
  export const deviceId = '2bd671ef-02cd-445f-9295-b3565dbaf1e8';
4
4
  export const deviceModel = 'D24f4-J01';
@@ -31,16 +31,12 @@ export const SmartCastMockApi: ISmartCastApi = {
31
31
  setAdvertiserIDListener: (callback: (advertiserID: IFA) => void): void => callback({
32
32
  IFA: deviceId,
33
33
  IFA_TYPE: 'vida',
34
- LMT: 0,
34
+ LMT: false,
35
35
  }),
36
36
 
37
37
  setContentChangeHandler:
38
38
  (callback: (contentUrl: string) => void): void => callback(deeplinkUrl),
39
39
 
40
- setDeviceLanguageHandler: (
41
- callback: (deviceLanguage: DeviceLanguage) => void,
42
- ): void => callback({ code: 'en', name: 'English' }),
43
-
44
40
  Chromevox: {
45
41
  cancel: (): void => {
46
42
  throw new Error('Function not implemented.');
@@ -50,30 +46,4 @@ export const SmartCastMockApi: ISmartCastApi = {
50
46
  console.log(text);
51
47
  },
52
48
  },
53
-
54
- Account: {
55
- isSVODEnabled: () => true,
56
- startSVODPurchase: async () => ({
57
- id: 'id',
58
- data: {
59
- customerId: 'customerId',
60
- partnerAccountId: 'partnerAccountId',
61
- planCode: 'planCode',
62
- subscriptionId: 'subscriptionId',
63
- },
64
- }),
65
- registerPartner: jest.fn(),
66
- getLinkStatus: async () => true,
67
- getUserMetadata: async () => ({
68
- id: 'id',
69
- data: {
70
- customerId: 'customerId',
71
- email: 'email@example.com',
72
- firstName: 'First',
73
- lastName: 'Last',
74
- },
75
- }),
76
- startTVLink: async () => ({}),
77
- getPlans: async () => ({ id: 'id', data: [] }),
78
- },
79
49
  };
@@ -34,29 +34,6 @@ export type ISmartCastApi = {
34
34
  */
35
35
  setContentChangeHandler: (callback: (contentUrl: string) => void) => void;
36
36
 
37
- /**
38
- * Sets the callback to receive device language object.
39
- */
40
- setDeviceLanguageHandler: (callback: (deviceLanguage: DeviceLanguage) => void) => void;
41
-
42
- Account: {
43
- isSVODEnabled: () => boolean,
44
- startSVODPurchase: (
45
- planCode: string,
46
- partnerAccountId: string,
47
- couponCode?: string,
48
- addOnCodes?: string[],
49
- noFreeTrial?: boolean,
50
- ) => Promise<{ id: string, data: PurchaseData }>
51
- registerPartner: (callback:(challenge: string) => Promise<string>, keyId: string) => void
52
- getLinkStatus: () => Promise<boolean>
53
- getUserMetadata: () => Promise<{ id: string, data: UserMetadata }>
54
- startTVLink: () => Promise<object>
55
- getPlans: (options: { includeBundlePlans?: boolean }) => Promise<{
56
- id: string, data: object[]
57
- }>
58
- }
59
-
60
37
  /**
61
38
  * Device model.
62
39
  */
@@ -70,24 +47,6 @@ export type ISmartCastApi = {
70
47
  play: (text: string) => void,
71
48
  };
72
49
  };
73
- /**
74
- * Data type when purchase successfull.
75
- */
76
-
77
- export type PurchaseData = {
78
- customerId: string,
79
- partnerAccountId: string,
80
- planCode: string,
81
- addOnCodes?: string[],
82
- subscriptionId: string
83
- };
84
-
85
- export type UserMetadata = {
86
- customerId: string;
87
- email: string;
88
- firstName: string;
89
- lastName: string;
90
- };
91
50
 
92
51
  /**
93
52
  * Identifier For Advertising (IFA) and Limited Tracking parameter object
@@ -97,15 +56,10 @@ export type IFA = {
97
56
  IFA: string,
98
57
  /** String value for IFA type ("vida") */
99
58
  IFA_TYPE: string,
100
- /** 0=Limited tracking not enabled, 1=Limited tracking enabled */
101
- LMT: 0 | 1,
59
+ /** true=Limited tracking enabled, false=Limited tracking disabled */
60
+ LMT: boolean,
102
61
  };
103
62
 
104
63
  export type DevicePlaybackQuality = 'UHD' | 'HD' | 'SD';
105
64
 
106
65
  export const DEFAULT_TTS_TIMEOUT = 3000;
107
-
108
- export type DeviceLanguage = {
109
- code: string,
110
- name: string,
111
- };
@@ -4,29 +4,20 @@ import {
4
4
  ScreenSaverStatus,
5
5
  VolumeRange,
6
6
  ExitOptions,
7
- IAPSuccessPayload,
8
- IAPPurchaseProductData,
9
7
  } from '@24i/bigscreen-sdk/driver-base';
10
8
  import { Storage } from '@24i/bigscreen-sdk/storage';
11
9
  import { runAsync } from '@24i/bigscreen-sdk/utils/timers';
12
- import { VendorType } from '@24i/smartapps-datalayer/api';
10
+ import { TizenKeys } from './TizenKeys';
13
11
  import {
14
- type Webapis,
15
- BillingBuyData,
12
+ VENDOR,
16
13
  NetworkState,
17
14
  NetworkActiveConnectionType,
18
15
  AppCommonScreenSaverState,
19
- CancelSubscriptionData,
20
- CancelSubscriptionAPIResult,
21
- } from './IWebapis';
22
- import { Tizen, Application } from './ITizen';
23
- import { TizenKeys } from './TizenKeys';
24
- import {
25
- VENDOR,
26
16
  } from './constants';
17
+ import { IWebapis, ITizen, TizenApplication } from './types';
27
18
 
28
- declare const webapis: Webapis;
29
- declare const tizen: Tizen;
19
+ declare const webapis: IWebapis;
20
+ declare const tizen: ITizen;
30
21
 
31
22
  const isNetworkConnected = (state: NetworkState) => {
32
23
  switch (state) {
@@ -45,7 +36,7 @@ const isNetworkConnected = (state: NetworkState) => {
45
36
  export class DeviceTizen extends DeviceBase {
46
37
  // MARK: Properties
47
38
 
48
- application: Application = tizen.application.getCurrentApplication();
39
+ application: TizenApplication = tizen.application.getCurrentApplication();
49
40
 
50
41
  keys: TizenKeys = new TizenKeys();
51
42
 
@@ -55,11 +46,6 @@ export class DeviceTizen extends DeviceBase {
55
46
 
56
47
  screenSaverStatus: AppCommonScreenSaverState = AppCommonScreenSaverState.SCREEN_SAVER_OFF;
57
48
 
58
- subscriptionFeaturesConfiguration = {
59
- purchase: true,
60
- management: true,
61
- };
62
-
63
49
  // MARK: Initialization
64
50
 
65
51
  async initDevice(): Promise<void> {
@@ -211,30 +197,6 @@ export class DeviceTizen extends DeviceBase {
211
197
  return '';
212
198
  }
213
199
 
214
- async getAdInfo() {
215
- let adId = null;
216
- let latEnabled = null;
217
- const type = 'tifa';
218
- try {
219
- adId = webapis.adinfo.getTIFA() ?? null;
220
- latEnabled = webapis.adinfo.isLATEnabled() ?? true;
221
- } catch (e) {
222
- latEnabled = true;
223
- console.error('[DeviceTizen] Failed getAdInfo', e);
224
- }
225
- return { adId, type, latEnabled };
226
- }
227
-
228
- async getOsLanguage() {
229
- return new Promise<string>((resolve) => {
230
- tizen.systeminfo.getPropertyValue(
231
- 'LOCALE',
232
- ({ language }) => resolve(language),
233
- () => resolve(''),
234
- );
235
- });
236
- }
237
-
238
200
  async getVolume() {
239
201
  try {
240
202
  const volume = tizen.tvaudiocontrol.getVolume();
@@ -284,7 +246,7 @@ export class DeviceTizen extends DeviceBase {
284
246
  ? AppCommonScreenSaverState.SCREEN_SAVER_ON
285
247
  : AppCommonScreenSaverState.SCREEN_SAVER_OFF;
286
248
  return new Promise((resolve) => {
287
- webapis.appcommon.setScreenSaver(
249
+ webapis.appCommon.setScreenSaver(
288
250
  status,
289
251
  () => {
290
252
  this.screenSaverStatus = status;
@@ -333,85 +295,4 @@ export class DeviceTizen extends DeviceBase {
333
295
  async getMacAddress() {
334
296
  return webapis.network.getMac();
335
297
  }
336
-
337
- async purchaseProduct({
338
- sku, product, appId,
339
- }: IAPPurchaseProductData): Promise<IAPSuccessPayload> {
340
- return new Promise((resolve, reject) => {
341
- if (!product || !appId) reject(new Error('Missing product or appId'));
342
- const paymentDetails = {
343
- OrderItemID: sku,
344
- OrderTitle: product!.title,
345
- OrderTotal: product!.price![0].amount,
346
- OrderCurrencyID: product!.price![0].currency,
347
- OrderCustomID: webapis.sso.getLoginUid(),
348
- };
349
- const onSuccess = (data: BillingBuyData) => {
350
- try {
351
- if (data.payResult !== 'SUCCESS') throw new Error('Purchase failed');
352
- const countryCode = webapis.productinfo.getSystemConfig(
353
- webapis.productinfo.ProductInfoConfigKey.CONFIG_KEY_SERVICE_COUNTRY,
354
- );
355
- const detail = JSON.parse(data.payDetail);
356
- resolve({
357
- platform: VendorType.SAMSUNG,
358
- receiptPayload: {
359
- appId,
360
- samsungInvoiceId: detail.InvoiceID,
361
- samsungCustomId: paymentDetails.OrderCustomID,
362
- countryCode,
363
- },
364
- });
365
- } catch (e) {
366
- reject(e);
367
- }
368
- };
369
- webapis.billing.buyItem(
370
- appId!, 'PRD', JSON.stringify(paymentDetails), onSuccess, reject,
371
- );
372
- });
373
- }
374
-
375
- async cancelSubscription(
376
- { product, appId }: IAPPurchaseProductData,
377
- ): Promise<void> {
378
- return new Promise((resolve, reject) => {
379
- if (!product || !appId) {
380
- reject(new Error('Missing product or appId'));
381
- }
382
- const UID = webapis.sso.getLoginUid();
383
- const countryCode = webapis.productinfo.getSystemConfig(
384
- webapis.productinfo.ProductInfoConfigKey.CONFIG_KEY_SERVICE_COUNTRY,
385
- );
386
- try {
387
- const vendorTransactionId = product?.vendorTransactionId;
388
- if (!vendorTransactionId) {
389
- reject(new Error('Missing vendorTransactionId'));
390
- }
391
- const onSuccess = (data: CancelSubscriptionData) => {
392
- try {
393
- const result: CancelSubscriptionAPIResult = JSON.parse(data.apiResult);
394
- if (result.CPStatus === '100000') {
395
- resolve();
396
- } else {
397
- reject(new Error(`Cancel subscription failed: ${result.CPStatus}`));
398
- }
399
- } catch (e) {
400
- reject(e);
401
- }
402
- };
403
- webapis.billing.cancelSubscription(
404
- appId!,
405
- product!.vendorTransactionId!.toString(),
406
- UID,
407
- countryCode,
408
- 'PRD',
409
- onSuccess,
410
- reject,
411
- );
412
- } catch (e) {
413
- reject(e);
414
- }
415
- });
416
- }
417
298
  }