vk-payments 0.2.13 → 0.2.15

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.
@@ -5,12 +5,15 @@
5
5
  */
6
6
  import * as tslib_1 from "tslib";
7
7
  import { Component, EventEmitter, Input, Output } from '@angular/core';
8
+ import { ActivatedRoute } from '@angular/router';
8
9
  import { ModoApiService } from '../../services/modo-api.service';
9
10
  var ModoComponent = /** @class */ (function () {
10
- function ModoComponent(modoApi) {
11
+ function ModoComponent(modoApi, route) {
11
12
  this.modoApi = modoApi;
13
+ this.route = route;
12
14
  this.statusPay = new EventEmitter();
13
15
  this.isLoading = false;
16
+ this.executionEnv = 'desktop';
14
17
  }
15
18
  /**
16
19
  * @return {?}
@@ -19,7 +22,47 @@ var ModoComponent = /** @class */ (function () {
19
22
  * @return {?}
20
23
  */
21
24
  function () {
22
- this.loadModoScript();
25
+ this.detectEnvironment();
26
+ if (this.executionEnv === 'desktop') {
27
+ this.loadModoScript();
28
+ }
29
+ };
30
+ /**
31
+ * @private
32
+ * @return {?}
33
+ */
34
+ ModoComponent.prototype.detectEnvironment = /**
35
+ * @private
36
+ * @return {?}
37
+ */
38
+ function () {
39
+ try {
40
+ /** @type {?} */
41
+ var params = this.route.snapshot.params;
42
+ /** @type {?} */
43
+ var guid = params['guid'];
44
+ /** @type {?} */
45
+ var platform = (/** @type {?} */ (params['platform']));
46
+ if (platform === 'iOS' || platform === 'Android' || guid === 'app') {
47
+ this.executionEnv = 'native-app';
48
+ this.devicePlatform = platform;
49
+ console.log("MODO Payment: Entorno detectado -> Nativo (" + (this.devicePlatform || 'app') + ")");
50
+ return;
51
+ }
52
+ }
53
+ catch (error) {
54
+ console.warn('MODO Payment: No se pudo leer los parámetros de la ruta. Se continuará con la detección por User Agent.');
55
+ }
56
+ /** @type {?} */
57
+ var userAgent = navigator.userAgent || navigator.vendor || ((/** @type {?} */ (window))).opera;
58
+ if (/android/i.test(userAgent) || /iPad|iPhone|iPod/.test(userAgent)) {
59
+ this.executionEnv = 'mobile-browser';
60
+ console.log('MODO Payment: Entorno detectado -> Navegador Móvil');
61
+ }
62
+ else {
63
+ this.executionEnv = 'desktop';
64
+ console.log('MODO Payment: Entorno detectado -> Desktop');
65
+ }
23
66
  };
24
67
  /**
25
68
  * @return {?}
@@ -29,8 +72,7 @@ var ModoComponent = /** @class */ (function () {
29
72
  */
30
73
  function () {
31
74
  return tslib_1.__awaiter(this, void 0, void 0, function () {
32
- var initialData_1, modalObject, error_1;
33
- var _this = this;
75
+ var initialData, error_1;
34
76
  return tslib_1.__generator(this, function (_a) {
35
77
  switch (_a.label) {
36
78
  case 0:
@@ -40,49 +82,23 @@ var ModoComponent = /** @class */ (function () {
40
82
  _a.trys.push([1, 3, , 4]);
41
83
  return [4 /*yield*/, this.createModoPayment()];
42
84
  case 2:
43
- initialData_1 = _a.sent();
85
+ initialData = _a.sent();
44
86
  this.isLoading = false;
45
- modalObject = {
46
- version: '2',
47
- qrString: initialData_1.qrString,
48
- checkoutId: initialData_1.checkoutId,
49
- deeplink: {
50
- url: initialData_1.deeplink,
51
- callbackURL: this.callbackUrl,
52
- callbackURLSuccess: this.callbackUrlSuccess
53
- },
54
- callbackURL: this.callbackUrl,
55
- refreshData: (/**
56
- * @return {?}
57
- */
58
- function () { return _this.createModoPayment(); }),
59
- onSuccess: (/**
60
- * @return {?}
61
- */
62
- function () {
63
- _this.statusPay.emit({ success: true, paymentId: initialData_1.checkoutId });
64
- }),
65
- onFailure: (/**
66
- * @return {?}
67
- */
68
- function () {
69
- _this.statusPay.emit({ success: false, paymentId: initialData_1.checkoutId });
70
- }),
71
- onCancel: (/**
72
- * @return {?}
73
- */
74
- function () {
75
- console.log('Pago cancelado por el usuario en el celular.');
76
- }),
77
- onClose: (/**
78
- * @return {?}
79
- */
80
- function () {
81
- console.log('Modal de MODO cerrado.');
82
- }),
83
- };
84
- // 3. Inicia el SDK de MODO
85
- ModoSDK.modoInitPayment(modalObject);
87
+ switch (this.executionEnv) {
88
+ case 'native-app':
89
+ // Llama a la función nativa para abrir en un navegador externo
90
+ this.openOnNativeNavigator(initialData.deeplink);
91
+ break;
92
+ case 'mobile-browser':
93
+ // Abre el deeplink en una nueva pestaña
94
+ window.open(initialData.deeplink, '_blank');
95
+ break;
96
+ case 'desktop':
97
+ default:
98
+ // Abrir el modal del SDK
99
+ this.initModoSdkModal(initialData);
100
+ break;
101
+ }
86
102
  return [3 /*break*/, 4];
87
103
  case 3:
88
104
  error_1 = _a.sent();
@@ -96,18 +112,92 @@ var ModoComponent = /** @class */ (function () {
96
112
  });
97
113
  };
98
114
  /**
99
- * Esta función se encarga de llamar a tu backend.
100
- * Se usa tanto para la carga inicial como para el refresco del SDK.
115
+ * @private
116
+ * @param {?} url
117
+ * @return {?}
118
+ */
119
+ ModoComponent.prototype.openOnNativeNavigator = /**
120
+ * @private
121
+ * @param {?} url
122
+ * @return {?}
101
123
  */
124
+ function (url) {
125
+ try {
126
+ if (this.devicePlatform === 'iOS') {
127
+ ((/** @type {?} */ (window))).webkit.messageHandlers.externalURL.postMessage(url);
128
+ }
129
+ else if (this.devicePlatform === 'Android') {
130
+ ((/** @type {?} */ (window))).externalURL.postMessage(url);
131
+ }
132
+ else {
133
+ // Fallback si por alguna razón no se detectó la plataforma pero sí el entorno nativo
134
+ window.open(url, '_blank');
135
+ }
136
+ }
137
+ catch (e) {
138
+ console.error('Error al intentar invocar el message handler nativo:', e);
139
+ }
140
+ };
141
+ /**
142
+ * @private
143
+ * @param {?} initialData
144
+ * @return {?}
145
+ */
146
+ ModoComponent.prototype.initModoSdkModal = /**
147
+ * @private
148
+ * @param {?} initialData
149
+ * @return {?}
150
+ */
151
+ function (initialData) {
152
+ var _this = this;
153
+ /** @type {?} */
154
+ var modalObject = {
155
+ version: '2',
156
+ qrString: initialData.qrString,
157
+ checkoutId: initialData.checkoutId,
158
+ deeplink: {
159
+ url: initialData.deeplink,
160
+ callbackURL: this.callbackUrl,
161
+ callbackURLSuccess: this.callbackUrlSuccess
162
+ },
163
+ callbackURL: this.callbackUrl,
164
+ refreshData: (/**
165
+ * @return {?}
166
+ */
167
+ function () { return _this.createModoPayment(); }),
168
+ onSuccess: (/**
169
+ * @return {?}
170
+ */
171
+ function () {
172
+ _this.statusPay.emit({ success: true, paymentId: initialData.checkoutId });
173
+ }),
174
+ onFailure: (/**
175
+ * @return {?}
176
+ */
177
+ function () {
178
+ _this.statusPay.emit({ success: false, paymentId: initialData.checkoutId });
179
+ }),
180
+ onCancel: (/**
181
+ * @return {?}
182
+ */
183
+ function () {
184
+ console.log('Pago cancelado por el usuario en el celular.');
185
+ }),
186
+ onClose: (/**
187
+ * @return {?}
188
+ */
189
+ function () {
190
+ console.log('Modal de MODO cerrado.');
191
+ }),
192
+ };
193
+ // 3. Inicia el SDK de MODO
194
+ ModoSDK.modoInitPayment(modalObject);
195
+ };
102
196
  /**
103
- * Esta función se encarga de llamar a tu backend.
104
- * Se usa tanto para la carga inicial como para el refresco del SDK.
105
197
  * @private
106
198
  * @return {?}
107
199
  */
108
200
  ModoComponent.prototype.createModoPayment = /**
109
- * Esta función se encarga de llamar a tu backend.
110
- * Se usa tanto para la carga inicial como para el refresco del SDK.
111
201
  * @private
112
202
  * @return {?}
113
203
  */
@@ -169,7 +259,8 @@ var ModoComponent = /** @class */ (function () {
169
259
  ];
170
260
  /** @nocollapse */
171
261
  ModoComponent.ctorParameters = function () { return [
172
- { type: ModoApiService }
262
+ { type: ModoApiService },
263
+ { type: ActivatedRoute }
173
264
  ]; };
174
265
  ModoComponent.propDecorators = {
175
266
  accessToken: [{ type: Input }],
@@ -209,10 +300,25 @@ if (false) {
209
300
  ModoComponent.prototype.statusPay;
210
301
  /** @type {?} */
211
302
  ModoComponent.prototype.isLoading;
303
+ /**
304
+ * @type {?}
305
+ * @private
306
+ */
307
+ ModoComponent.prototype.executionEnv;
308
+ /**
309
+ * @type {?}
310
+ * @private
311
+ */
312
+ ModoComponent.prototype.devicePlatform;
212
313
  /**
213
314
  * @type {?}
214
315
  * @private
215
316
  */
216
317
  ModoComponent.prototype.modoApi;
318
+ /**
319
+ * @type {?}
320
+ * @private
321
+ */
322
+ ModoComponent.prototype.route;
217
323
  }
218
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly92ay1wYXltZW50cy8iLCJzb3VyY2VzIjpbImxpYi9tb2RvL2NvbXBvbmVudHMvbW9kby9tb2RvLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQU1qRTtJQW9CRSx1QkFBb0IsT0FBdUI7UUFBdkIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFKakMsY0FBUyxHQUFHLElBQUksWUFBWSxFQUEyQyxDQUFDO1FBRWxGLGNBQVMsR0FBRyxLQUFLLENBQUM7SUFFNkIsQ0FBQzs7OztJQUVoRCxnQ0FBUTs7O0lBQVI7UUFDRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQzs7OztJQUVLLHdDQUFnQjs7O0lBQXRCOzs7Ozs7O3dCQUNFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDOzs7O3dCQUdBLHFCQUFNLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFBOzt3QkFBNUMsZ0JBQWMsU0FBOEI7d0JBQ2xELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO3dCQUVqQixXQUFXLEdBQUc7NEJBQ2xCLE9BQU8sRUFBRSxHQUFHOzRCQUNaLFFBQVEsRUFBRSxhQUFXLENBQUMsUUFBUTs0QkFDOUIsVUFBVSxFQUFFLGFBQVcsQ0FBQyxVQUFVOzRCQUNsQyxRQUFRLEVBQUU7Z0NBQ1IsR0FBRyxFQUFFLGFBQVcsQ0FBQyxRQUFRO2dDQUN6QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7Z0NBQzdCLGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0I7NkJBQzVDOzRCQUVELFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVzs0QkFFN0IsV0FBVzs7OzRCQUFF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OEJBQ0wsS0FBSztxQ0FDTCxLQUFLOzRCQUNMLE1BQU07O0lBeUZULG9CQUFDO0NBQUEsQUF6R0QsSUF5R0M7U0FwR1ksYUFBYTs7O0lBRXhCLG9DQUE4Qjs7SUFDOUIsZ0NBQXlCOztJQUN6Qiw4QkFBdUI7O0lBQ3ZCLDZCQUFzQjs7SUFDdEIsK0JBQXdCOztJQUN4QixnQ0FBeUI7O0lBQ3pCLGlDQUEwQjs7SUFDMUIsb0NBQTZCOztJQUM3QiwyQ0FBb0M7O0lBQ3BDLGtDQUFrRjs7SUFFbEYsa0NBQWtCOzs7OztJQUVOLGdDQUErQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1vZG9BcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9kby1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBDcmVhdGVQYXltZW50UmVxdWVzdCB9IGZyb20gJy4uLy4uL21vZGVscy9tb2RvLm1vZGVscyc7XG5cbi8vIERlY2xhcmEgbGEgdmFyaWFibGUgZ2xvYmFsIGRlbCBTREtcbmRlY2xhcmUgdmFyIE1vZG9TREs6IGFueTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmstbW9kby1wYXltZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL21vZG8uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tb2RvLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgTW9kb0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgYWNjZXNzVG9rZW4hOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHN0b3JlSWQ6IHN0cmluZztcbiAgQElucHV0KCkgaWRWZW46IG51bWJlcjtcbiAgQElucHV0KCkgZGF0YTogc3RyaW5nO1xuICBASW5wdXQoKSBhbW91bnQ6IG51bWJlcjtcbiAgQElucHV0KCkgb3JkZXJJZDogc3RyaW5nO1xuICBASW5wdXQoKSB2a1VybEFwaTogc3RyaW5nO1xuICBASW5wdXQoKSBjYWxsYmFja1VybDogc3RyaW5nO1xuICBASW5wdXQoKSBjYWxsYmFja1VybFN1Y2Nlc3M6IHN0cmluZztcbiAgQE91dHB1dCgpIHN0YXR1c1BheSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzdWNjZXNzOiBib29sZWFuOyBwYXltZW50SWQ6IHN0cmluZyB9PigpO1xuXG4gIGlzTG9hZGluZyA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbW9kb0FwaTogTW9kb0FwaVNlcnZpY2UpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMubG9hZE1vZG9TY3JpcHQoKTtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0TW9kb1BheW1lbnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGluaXRpYWxEYXRhID0gYXdhaXQgdGhpcy5jcmVhdGVNb2RvUGF5bWVudCgpO1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgY29uc3QgbW9kYWxPYmplY3QgPSB7XG4gICAgICAgIHZlcnNpb246ICcyJyxcbiAgICAgICAgcXJTdHJpbmc6IGluaXRpYWxEYXRhLnFyU3RyaW5nLFxuICAgICAgICBjaGVja291dElkOiBpbml0aWFsRGF0YS5jaGVja291dElkLFxuICAgICAgICBkZWVwbGluazoge1xuICAgICAgICAgIHVybDogaW5pdGlhbERhdGEuZGVlcGxpbmssXG4gICAgICAgICAgY2FsbGJhY2tVUkw6IHRoaXMuY2FsbGJhY2tVcmwsXG4gICAgICAgICAgY2FsbGJhY2tVUkxTdWNjZXNzOiB0aGlzLmNhbGxiYWNrVXJsU3VjY2Vzc1xuICAgICAgICB9LFxuXG4gICAgICAgIGNhbGxiYWNrVVJMOiB0aGlzLmNhbGxiYWNrVXJsLFxuXG4gICAgICAgIHJlZnJlc2hEYXRhOiAoKSA9PiB0aGlzLmNyZWF0ZU1vZG9QYXltZW50KCksXG5cbiAgICAgICAgb25TdWNjZXNzOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdGF0dXNQYXkuZW1pdCh7IHN1Y2Nlc3M6IHRydWUsIHBheW1lbnRJZDogaW5pdGlhbERhdGEuY2hlY2tvdXRJZCB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25GYWlsdXJlOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zdGF0dXNQYXkuZW1pdCh7IHN1Y2Nlc3M6IGZhbHNlLCBwYXltZW50SWQ6IGluaXRpYWxEYXRhLmNoZWNrb3V0SWQgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1BhZ28gY2FuY2VsYWRvIHBvciBlbCB1c3VhcmlvIGVuIGVsIGNlbHVsYXIuJyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2xvc2U6ICgpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnTW9kYWwgZGUgTU9ETyBjZXJyYWRvLicpO1xuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgLy8gMy4gSW5pY2lhIGVsIFNESyBkZSBNT0RPXG4gICAgICBNb2RvU0RLLm1vZG9Jbml0UGF5bWVudChtb2RhbE9iamVjdCk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuc3RhdHVzUGF5LmVtaXQoeyBzdWNjZXNzOiBmYWxzZSwgcGF5bWVudElkOiAnJyB9KTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBhbCBpbmljaWFyIGVsIHBhZ28gY29uIE1PRE9cIiwgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RhIGZ1bmNpw7NuIHNlIGVuY2FyZ2EgZGUgbGxhbWFyIGEgdHUgYmFja2VuZC5cbiAgICogU2UgdXNhIHRhbnRvIHBhcmEgbGEgY2FyZ2EgaW5pY2lhbCBjb21vIHBhcmEgZWwgcmVmcmVzY28gZGVsIFNESy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlTW9kb1BheW1lbnQoKTogUHJvbWlzZTx7IHFyU3RyaW5nOiBzdHJpbmc7IGNoZWNrb3V0SWQ6IHN0cmluZzsgZGVlcGxpbms6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgcGF5bWVudFJlcXVlc3Q6IENyZWF0ZVBheW1lbnRSZXF1ZXN0ID0ge1xuICAgICAgYW1vdW50OiB0aGlzLmFtb3VudCxcbiAgICAgIG9yZGVySWQ6IHRoaXMub3JkZXJJZCxcbiAgICAgIHN0b3JlSWQ6IHRoaXMuc3RvcmVJZCxcbiAgICAgIGlkVmVuOiB0aGlzLmlkVmVuLFxuICAgICAgZGF0YTogdGhpcy5kYXRhXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5tb2RvQXBpLmNyZWF0ZVBheW1lbnQodGhpcy5hY2Nlc3NUb2tlbiwgcGF5bWVudFJlcXVlc3QsIHRoaXMudmtVcmxBcGkpLnRvUHJvbWlzZSgpO1xuXG4gICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuZGF0YSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcXJTdHJpbmc6IHJlc3BvbnNlLmRhdGEucXJTdHJpbmcsXG4gICAgICAgIGNoZWNrb3V0SWQ6IHJlc3BvbnNlLmRhdGEuaW50ZXJuYWxQYXltZW50SWQsXG4gICAgICAgIGRlZXBsaW5rOiByZXNwb25zZS5kYXRhLmRlZXBsaW5rXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xhIHJlc3B1ZXN0YSBkZSBsYSBBUEkgbm8gZnVlIGV4aXRvc2EuJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkTW9kb1NjcmlwdCgpOiB2b2lkIHtcbiAgICBjb25zdCBzY3JpcHRVcmwgPSAnaHR0cHM6Ly9lY29tbWVyY2UtbW9kYWwubW9kby5jb20uYXIvYnVuZGxlLmpzJztcbiAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHNjcmlwdFtzcmM9XCIke3NjcmlwdFVybH1cIl1gKSkge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICBzY3JpcHQuc3JjID0gc2NyaXB0VXJsO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgIH1cbiAgfVxufSJdfQ==
324
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly92ay1wYXltZW50cy8iLCJzb3VyY2VzIjpbImxpYi9tb2RvL2NvbXBvbmVudHMvbW9kby9tb2RvLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFRakU7SUFzQkUsdUJBQ1UsT0FBdUIsRUFDdkIsS0FBcUI7UUFEckIsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDdkIsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFSckIsY0FBUyxHQUFHLElBQUksWUFBWSxFQUEyQyxDQUFDO1FBRWxGLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDVixpQkFBWSxHQUF5QixTQUFTLENBQUM7SUFNbkQsQ0FBQzs7OztJQUVMLGdDQUFROzs7SUFBUjtRQUNFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUU7WUFDbkMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZCO0lBQ0gsQ0FBQzs7Ozs7SUFFTyx5Q0FBaUI7Ozs7SUFBekI7UUFDRSxJQUFJOztnQkFDSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTTs7Z0JBQ25DLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDOztnQkFDckIsUUFBUSxHQUFHLG1CQUFBLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBcUI7WUFFeEQsSUFBSSxRQUFRLEtBQUssS0FBSyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRTtnQkFDbEUs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Yzs7OzhCQWdCcEIsS0FBSzswQkFDTCxLQUFLO3dCQUNMLEtBQUs7dUJBQ0wsS0FBSzt5QkFDTCxLQUFLOzBCQUNMLEtBQUs7MkJBQ0wsS0FBSzs4QkFDTCxLQUFLO3FDQUNMLEtBQUs7NEJBQ0wsTUFBTTs7SUE0SlQsb0JBQUM7Q0FBQSxBQTVLRCxJQTRLQztTQXZLWSxhQUFhOzs7SUFFeEIsb0NBQThCOztJQUM5QixnQ0FBeUI7O0lBQ3pCLDhCQUF1Qjs7SUFDdkIsNkJBQXNCOztJQUN0QiwrQkFBd0I7O0lBQ3hCLGdDQUF5Qjs7SUFDekIsaUNBQTBCOztJQUMxQixvQ0FBNkI7O0lBQzdCLDJDQUFvQzs7SUFDcEMsa0NBQWtGOztJQUVsRixrQ0FBa0I7Ozs7O0lBQ2xCLHFDQUF1RDs7Ozs7SUFDdkQsdUNBQXNEOzs7OztJQUdwRCxnQ0FBK0I7Ozs7O0lBQy9CLDhCQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE1vZG9BcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbW9kby1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBDcmVhdGVQYXltZW50UmVxdWVzdCB9IGZyb20gJy4uLy4uL21vZGVscy9tb2RvLm1vZGVscyc7XG5cbi8vIERlY2xhcmEgbGEgdmFyaWFibGUgZ2xvYmFsIGRlbCBTREtcbmRlY2xhcmUgdmFyIE1vZG9TREs6IGFueTtcblxudHlwZSBFeGVjdXRpb25FbnZpcm9ubWVudCA9ICdkZXNrdG9wJyB8ICdtb2JpbGUtYnJvd3NlcicgfCAnbmF0aXZlLWFwcCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZrLW1vZG8tcGF5bWVudCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tb2RvLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbW9kby5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIE1vZG9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpIGFjY2Vzc1Rva2VuITogc3RyaW5nO1xuICBASW5wdXQoKSBzdG9yZUlkOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGlkVmVuOiBudW1iZXI7XG4gIEBJbnB1dCgpIGRhdGE6IHN0cmluZztcbiAgQElucHV0KCkgYW1vdW50OiBudW1iZXI7XG4gIEBJbnB1dCgpIG9yZGVySWQ6IHN0cmluZztcbiAgQElucHV0KCkgdmtVcmxBcGk6IHN0cmluZztcbiAgQElucHV0KCkgY2FsbGJhY2tVcmw6IHN0cmluZztcbiAgQElucHV0KCkgY2FsbGJhY2tVcmxTdWNjZXNzOiBzdHJpbmc7XG4gIEBPdXRwdXQoKSBzdGF0dXNQYXkgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3VjY2VzczogYm9vbGVhbjsgcGF5bWVudElkOiBzdHJpbmcgfT4oKTtcblxuICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBleGVjdXRpb25FbnY6IEV4ZWN1dGlvbkVudmlyb25tZW50ID0gJ2Rlc2t0b3AnO1xuICBwcml2YXRlIGRldmljZVBsYXRmb3JtOiAnaU9TJyB8ICdBbmRyb2lkJyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG1vZG9BcGk6IE1vZG9BcGlTZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5kZXRlY3RFbnZpcm9ubWVudCgpO1xuICAgIGlmICh0aGlzLmV4ZWN1dGlvbkVudiA9PT0gJ2Rlc2t0b3AnKSB7XG4gICAgICB0aGlzLmxvYWRNb2RvU2NyaXB0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZXRlY3RFbnZpcm9ubWVudCgpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXM7XG4gICAgICBjb25zdCBndWlkID0gcGFyYW1zWydndWlkJ107XG4gICAgICBjb25zdCBwbGF0Zm9ybSA9IHBhcmFtc1sncGxhdGZvcm0nXSBhcyAnaU9TJyB8ICdBbmRyb2lkJztcblxuICAgICAgaWYgKHBsYXRmb3JtID09PSAnaU9TJyB8fCBwbGF0Zm9ybSA9PT0gJ0FuZHJvaWQnIHx8IGd1aWQgPT09ICdhcHAnKSB7XG4gICAgICAgIHRoaXMuZXhlY3V0aW9uRW52ID0gJ25hdGl2ZS1hcHAnO1xuICAgICAgICB0aGlzLmRldmljZVBsYXRmb3JtID0gcGxhdGZvcm07XG4gICAgICAgIGNvbnNvbGUubG9nKGBNT0RPIFBheW1lbnQ6IEVudG9ybm8gZGV0ZWN0YWRvIC0+IE5hdGl2byAoJHt0aGlzLmRldmljZVBsYXRmb3JtIHx8ICdhcHAnfSlgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ01PRE8gUGF5bWVudDogTm8gc2UgcHVkbyBsZWVyIGxvcyBwYXLDoW1ldHJvcyBkZSBsYSBydXRhLiBTZSBjb250aW51YXLDoSBjb24gbGEgZGV0ZWNjacOzbiBwb3IgVXNlciBBZ2VudC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50IHx8IG5hdmlnYXRvci52ZW5kb3IgfHwgKHdpbmRvdyBhcyBhbnkpLm9wZXJhO1xuICAgIGlmICgvYW5kcm9pZC9pLnRlc3QodXNlckFnZW50KSB8fCAvaVBhZHxpUGhvbmV8aVBvZC8udGVzdCh1c2VyQWdlbnQpKSB7XG4gICAgICB0aGlzLmV4ZWN1dGlvbkVudiA9ICdtb2JpbGUtYnJvd3Nlcic7XG4gICAgICBjb25zb2xlLmxvZygnTU9ETyBQYXltZW50OiBFbnRvcm5vIGRldGVjdGFkbyAtPiBOYXZlZ2Fkb3IgTcOzdmlsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhlY3V0aW9uRW52ID0gJ2Rlc2t0b3AnO1xuICAgICAgY29uc29sZS5sb2coJ01PRE8gUGF5bWVudDogRW50b3JubyBkZXRlY3RhZG8gLT4gRGVza3RvcCcpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHN0YXJ0TW9kb1BheW1lbnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGluaXRpYWxEYXRhID0gYXdhaXQgdGhpcy5jcmVhdGVNb2RvUGF5bWVudCgpO1xuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcblxuICAgICAgc3dpdGNoICh0aGlzLmV4ZWN1dGlvbkVudikge1xuICAgICAgICBjYXNlICduYXRpdmUtYXBwJzpcbiAgICAgICAgICAvLyBMbGFtYSBhIGxhIGZ1bmNpw7NuIG5hdGl2YSBwYXJhIGFicmlyIGVuIHVuIG5hdmVnYWRvciBleHRlcm5vXG4gICAgICAgICAgdGhpcy5vcGVuT25OYXRpdmVOYXZpZ2F0b3IoaW5pdGlhbERhdGEuZGVlcGxpbmspO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdtb2JpbGUtYnJvd3Nlcic6XG4gICAgICAgICAgLy8gQWJyZSBlbCBkZWVwbGluayBlbiB1bmEgbnVldmEgcGVzdGHDsWFcbiAgICAgICAgICB3aW5kb3cub3Blbihpbml0aWFsRGF0YS5kZWVwbGluaywgJ19ibGFuaycpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkZXNrdG9wJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBBYnJpciBlbCBtb2RhbCBkZWwgU0RLXG4gICAgICAgICAgdGhpcy5pbml0TW9kb1Nka01vZGFsKGluaXRpYWxEYXRhKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5zdGF0dXNQYXkuZW1pdCh7IHN1Y2Nlc3M6IGZhbHNlLCBwYXltZW50SWQ6ICcnIH0pO1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGFsIGluaWNpYXIgZWwgcGFnbyBjb24gTU9ET1wiLCBlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuT25OYXRpdmVOYXZpZ2F0b3IodXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuZGV2aWNlUGxhdGZvcm0gPT09ICdpT1MnKSB7XG4gICAgICAgICh3aW5kb3cgYXMgYW55KS53ZWJraXQubWVzc2FnZUhhbmRsZXJzLmV4dGVybmFsVVJMLnBvc3RNZXNzYWdlKHVybCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuZGV2aWNlUGxhdGZvcm0gPT09ICdBbmRyb2lkJykge1xuICAgICAgICAod2luZG93IGFzIGFueSkuZXh0ZXJuYWxVUkwucG9zdE1lc3NhZ2UodXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIHNpIHBvciBhbGd1bmEgcmF6w7NuIG5vIHNlIGRldGVjdMOzIGxhIHBsYXRhZm9ybWEgcGVybyBzw60gZWwgZW50b3JubyBuYXRpdm9cbiAgICAgICAgd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgYWwgaW50ZW50YXIgaW52b2NhciBlbCBtZXNzYWdlIGhhbmRsZXIgbmF0aXZvOicsIGUpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdE1vZG9TZGtNb2RhbChpbml0aWFsRGF0YTogeyBxclN0cmluZzogc3RyaW5nOyBjaGVja291dElkOiBzdHJpbmc7IGRlZXBsaW5rOiBzdHJpbmcgfSk6IHZvaWQge1xuXG4gICAgY29uc3QgbW9kYWxPYmplY3QgPSB7XG4gICAgICB2ZXJzaW9uOiAnMicsXG4gICAgICBxclN0cmluZzogaW5pdGlhbERhdGEucXJTdHJpbmcsXG4gICAgICBjaGVja291dElkOiBpbml0aWFsRGF0YS5jaGVja291dElkLFxuICAgICAgZGVlcGxpbms6IHtcbiAgICAgICAgdXJsOiBpbml0aWFsRGF0YS5kZWVwbGluayxcbiAgICAgICAgY2FsbGJhY2tVUkw6IHRoaXMuY2FsbGJhY2tVcmwsXG4gICAgICAgIGNhbGxiYWNrVVJMU3VjY2VzczogdGhpcy5jYWxsYmFja1VybFN1Y2Nlc3NcbiAgICAgIH0sXG5cbiAgICAgIGNhbGxiYWNrVVJMOiB0aGlzLmNhbGxiYWNrVXJsLFxuXG4gICAgICByZWZyZXNoRGF0YTogKCkgPT4gdGhpcy5jcmVhdGVNb2RvUGF5bWVudCgpLFxuXG4gICAgICBvblN1Y2Nlc3M6ICgpID0+IHtcbiAgICAgICAgdGhpcy5zdGF0dXNQYXkuZW1pdCh7IHN1Y2Nlc3M6IHRydWUsIHBheW1lbnRJZDogaW5pdGlhbERhdGEuY2hlY2tvdXRJZCB9KTtcbiAgICAgIH0sXG4gICAgICBvbkZhaWx1cmU6ICgpID0+IHtcbiAgICAgICAgdGhpcy5zdGF0dXNQYXkuZW1pdCh7IHN1Y2Nlc3M6IGZhbHNlLCBwYXltZW50SWQ6IGluaXRpYWxEYXRhLmNoZWNrb3V0SWQgfSk7XG4gICAgICB9LFxuICAgICAgb25DYW5jZWw6ICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ1BhZ28gY2FuY2VsYWRvIHBvciBlbCB1c3VhcmlvIGVuIGVsIGNlbHVsYXIuJyk7XG4gICAgICB9LFxuICAgICAgb25DbG9zZTogKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZygnTW9kYWwgZGUgTU9ETyBjZXJyYWRvLicpO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gMy4gSW5pY2lhIGVsIFNESyBkZSBNT0RPXG4gICAgTW9kb1NESy5tb2RvSW5pdFBheW1lbnQobW9kYWxPYmplY3QpO1xuXG4gIH1cblxuXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlTW9kb1BheW1lbnQoKTogUHJvbWlzZTx7IHFyU3RyaW5nOiBzdHJpbmc7IGNoZWNrb3V0SWQ6IHN0cmluZzsgZGVlcGxpbms6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgcGF5bWVudFJlcXVlc3Q6IENyZWF0ZVBheW1lbnRSZXF1ZXN0ID0ge1xuICAgICAgYW1vdW50OiB0aGlzLmFtb3VudCxcbiAgICAgIG9yZGVySWQ6IHRoaXMub3JkZXJJZCxcbiAgICAgIHN0b3JlSWQ6IHRoaXMuc3RvcmVJZCxcbiAgICAgIGlkVmVuOiB0aGlzLmlkVmVuLFxuICAgICAgZGF0YTogdGhpcy5kYXRhXG4gICAgfTtcblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5tb2RvQXBpLmNyZWF0ZVBheW1lbnQodGhpcy5hY2Nlc3NUb2tlbiwgcGF5bWVudFJlcXVlc3QsIHRoaXMudmtVcmxBcGkpLnRvUHJvbWlzZSgpO1xuXG4gICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MgJiYgcmVzcG9uc2UuZGF0YSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcXJTdHJpbmc6IHJlc3BvbnNlLmRhdGEucXJTdHJpbmcsXG4gICAgICAgIGNoZWNrb3V0SWQ6IHJlc3BvbnNlLmRhdGEuaW50ZXJuYWxQYXltZW50SWQsXG4gICAgICAgIGRlZXBsaW5rOiByZXNwb25zZS5kYXRhLmRlZXBsaW5rXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0xhIHJlc3B1ZXN0YSBkZSBsYSBBUEkgbm8gZnVlIGV4aXRvc2EuJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkTW9kb1NjcmlwdCgpOiB2b2lkIHtcbiAgICBjb25zdCBzY3JpcHRVcmwgPSAnaHR0cHM6Ly9lY29tbWVyY2UtbW9kYWwubW9kby5jb20uYXIvYnVuZGxlLmpzJztcbiAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYHNjcmlwdFtzcmM9XCIke3NjcmlwdFVybH1cIl1gKSkge1xuICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICBzY3JpcHQuc3JjID0gc2NyaXB0VXJsO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgIH1cbiAgfVxufSJdfQ==
@@ -1,7 +1,7 @@
1
1
  import { Injectable, ɵɵdefineInjectable, ɵɵinject, EventEmitter, Component, Input, Output, ViewChild, NgModule } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { FormsModule, ReactiveFormsModule } from '@angular/forms';
4
- import { Router, RouterModule } from '@angular/router';
4
+ import { Router, RouterModule, ActivatedRoute } from '@angular/router';
5
5
  import { HttpHeaders, HttpClient, HttpClientModule } from '@angular/common/http';
6
6
  import sha256 from 'sha256';
7
7
  import { __awaiter } from 'tslib';
@@ -2306,7 +2306,8 @@ class GoCuotasComponent {
2306
2306
  this.installments = 0;
2307
2307
  this.currentInstallments = [
2308
2308
  { value: 2, label: '2 Cuotas' },
2309
- { value: 3, label: '3 Cuotas' }
2309
+ { value: 3, label: '3 Cuotas' },
2310
+ { value: 4, label: '4 Cuotas' }
2310
2311
  ]; // Opciones para "Cantidad de cuotas"
2311
2312
  this.totalAmount = Number(this.paymentAmount);
2312
2313
  }
@@ -2851,17 +2852,56 @@ if (false) {
2851
2852
  class ModoComponent {
2852
2853
  /**
2853
2854
  * @param {?} modoApi
2855
+ * @param {?} route
2854
2856
  */
2855
- constructor(modoApi) {
2857
+ constructor(modoApi, route) {
2856
2858
  this.modoApi = modoApi;
2859
+ this.route = route;
2857
2860
  this.statusPay = new EventEmitter();
2858
2861
  this.isLoading = false;
2862
+ this.executionEnv = 'desktop';
2859
2863
  }
2860
2864
  /**
2861
2865
  * @return {?}
2862
2866
  */
2863
2867
  ngOnInit() {
2864
- this.loadModoScript();
2868
+ this.detectEnvironment();
2869
+ if (this.executionEnv === 'desktop') {
2870
+ this.loadModoScript();
2871
+ }
2872
+ }
2873
+ /**
2874
+ * @private
2875
+ * @return {?}
2876
+ */
2877
+ detectEnvironment() {
2878
+ try {
2879
+ /** @type {?} */
2880
+ const params = this.route.snapshot.params;
2881
+ /** @type {?} */
2882
+ const guid = params['guid'];
2883
+ /** @type {?} */
2884
+ const platform = (/** @type {?} */ (params['platform']));
2885
+ if (platform === 'iOS' || platform === 'Android' || guid === 'app') {
2886
+ this.executionEnv = 'native-app';
2887
+ this.devicePlatform = platform;
2888
+ console.log(`MODO Payment: Entorno detectado -> Nativo (${this.devicePlatform || 'app'})`);
2889
+ return;
2890
+ }
2891
+ }
2892
+ catch (error) {
2893
+ console.warn('MODO Payment: No se pudo leer los parámetros de la ruta. Se continuará con la detección por User Agent.');
2894
+ }
2895
+ /** @type {?} */
2896
+ const userAgent = navigator.userAgent || navigator.vendor || ((/** @type {?} */ (window))).opera;
2897
+ if (/android/i.test(userAgent) || /iPad|iPhone|iPod/.test(userAgent)) {
2898
+ this.executionEnv = 'mobile-browser';
2899
+ console.log('MODO Payment: Entorno detectado -> Navegador Móvil');
2900
+ }
2901
+ else {
2902
+ this.executionEnv = 'desktop';
2903
+ console.log('MODO Payment: Entorno detectado -> Desktop');
2904
+ }
2865
2905
  }
2866
2906
  /**
2867
2907
  * @return {?}
@@ -2873,48 +2913,21 @@ class ModoComponent {
2873
2913
  /** @type {?} */
2874
2914
  const initialData = yield this.createModoPayment();
2875
2915
  this.isLoading = false;
2876
- /** @type {?} */
2877
- const modalObject = {
2878
- version: '2',
2879
- qrString: initialData.qrString,
2880
- checkoutId: initialData.checkoutId,
2881
- deeplink: {
2882
- url: initialData.deeplink,
2883
- callbackURL: this.callbackUrl,
2884
- callbackURLSuccess: this.callbackUrlSuccess
2885
- },
2886
- callbackURL: this.callbackUrl,
2887
- refreshData: (/**
2888
- * @return {?}
2889
- */
2890
- () => this.createModoPayment()),
2891
- onSuccess: (/**
2892
- * @return {?}
2893
- */
2894
- () => {
2895
- this.statusPay.emit({ success: true, paymentId: initialData.checkoutId });
2896
- }),
2897
- onFailure: (/**
2898
- * @return {?}
2899
- */
2900
- () => {
2901
- this.statusPay.emit({ success: false, paymentId: initialData.checkoutId });
2902
- }),
2903
- onCancel: (/**
2904
- * @return {?}
2905
- */
2906
- () => {
2907
- console.log('Pago cancelado por el usuario en el celular.');
2908
- }),
2909
- onClose: (/**
2910
- * @return {?}
2911
- */
2912
- () => {
2913
- console.log('Modal de MODO cerrado.');
2914
- }),
2915
- };
2916
- // 3. Inicia el SDK de MODO
2917
- ModoSDK.modoInitPayment(modalObject);
2916
+ switch (this.executionEnv) {
2917
+ case 'native-app':
2918
+ // Llama a la función nativa para abrir en un navegador externo
2919
+ this.openOnNativeNavigator(initialData.deeplink);
2920
+ break;
2921
+ case 'mobile-browser':
2922
+ // Abre el deeplink en una nueva pestaña
2923
+ window.open(initialData.deeplink, '_blank');
2924
+ break;
2925
+ case 'desktop':
2926
+ default:
2927
+ // Abrir el modal del SDK
2928
+ this.initModoSdkModal(initialData);
2929
+ break;
2930
+ }
2918
2931
  }
2919
2932
  catch (error) {
2920
2933
  this.isLoading = false;
@@ -2924,8 +2937,77 @@ class ModoComponent {
2924
2937
  });
2925
2938
  }
2926
2939
  /**
2927
- * Esta función se encarga de llamar a tu backend.
2928
- * Se usa tanto para la carga inicial como para el refresco del SDK.
2940
+ * @private
2941
+ * @param {?} url
2942
+ * @return {?}
2943
+ */
2944
+ openOnNativeNavigator(url) {
2945
+ try {
2946
+ if (this.devicePlatform === 'iOS') {
2947
+ ((/** @type {?} */ (window))).webkit.messageHandlers.externalURL.postMessage(url);
2948
+ }
2949
+ else if (this.devicePlatform === 'Android') {
2950
+ ((/** @type {?} */ (window))).externalURL.postMessage(url);
2951
+ }
2952
+ else {
2953
+ // Fallback si por alguna razón no se detectó la plataforma pero sí el entorno nativo
2954
+ window.open(url, '_blank');
2955
+ }
2956
+ }
2957
+ catch (e) {
2958
+ console.error('Error al intentar invocar el message handler nativo:', e);
2959
+ }
2960
+ }
2961
+ /**
2962
+ * @private
2963
+ * @param {?} initialData
2964
+ * @return {?}
2965
+ */
2966
+ initModoSdkModal(initialData) {
2967
+ /** @type {?} */
2968
+ const modalObject = {
2969
+ version: '2',
2970
+ qrString: initialData.qrString,
2971
+ checkoutId: initialData.checkoutId,
2972
+ deeplink: {
2973
+ url: initialData.deeplink,
2974
+ callbackURL: this.callbackUrl,
2975
+ callbackURLSuccess: this.callbackUrlSuccess
2976
+ },
2977
+ callbackURL: this.callbackUrl,
2978
+ refreshData: (/**
2979
+ * @return {?}
2980
+ */
2981
+ () => this.createModoPayment()),
2982
+ onSuccess: (/**
2983
+ * @return {?}
2984
+ */
2985
+ () => {
2986
+ this.statusPay.emit({ success: true, paymentId: initialData.checkoutId });
2987
+ }),
2988
+ onFailure: (/**
2989
+ * @return {?}
2990
+ */
2991
+ () => {
2992
+ this.statusPay.emit({ success: false, paymentId: initialData.checkoutId });
2993
+ }),
2994
+ onCancel: (/**
2995
+ * @return {?}
2996
+ */
2997
+ () => {
2998
+ console.log('Pago cancelado por el usuario en el celular.');
2999
+ }),
3000
+ onClose: (/**
3001
+ * @return {?}
3002
+ */
3003
+ () => {
3004
+ console.log('Modal de MODO cerrado.');
3005
+ }),
3006
+ };
3007
+ // 3. Inicia el SDK de MODO
3008
+ ModoSDK.modoInitPayment(modalObject);
3009
+ }
3010
+ /**
2929
3011
  * @private
2930
3012
  * @return {?}
2931
3013
  */
@@ -2977,7 +3059,8 @@ ModoComponent.decorators = [
2977
3059
  ];
2978
3060
  /** @nocollapse */
2979
3061
  ModoComponent.ctorParameters = () => [
2980
- { type: ModoApiService }
3062
+ { type: ModoApiService },
3063
+ { type: ActivatedRoute }
2981
3064
  ];
2982
3065
  ModoComponent.propDecorators = {
2983
3066
  accessToken: [{ type: Input }],
@@ -3014,11 +3097,26 @@ if (false) {
3014
3097
  ModoComponent.prototype.statusPay;
3015
3098
  /** @type {?} */
3016
3099
  ModoComponent.prototype.isLoading;
3100
+ /**
3101
+ * @type {?}
3102
+ * @private
3103
+ */
3104
+ ModoComponent.prototype.executionEnv;
3105
+ /**
3106
+ * @type {?}
3107
+ * @private
3108
+ */
3109
+ ModoComponent.prototype.devicePlatform;
3017
3110
  /**
3018
3111
  * @type {?}
3019
3112
  * @private
3020
3113
  */
3021
3114
  ModoComponent.prototype.modoApi;
3115
+ /**
3116
+ * @type {?}
3117
+ * @private
3118
+ */
3119
+ ModoComponent.prototype.route;
3022
3120
  }
3023
3121
 
3024
3122
  /**