@miden-npm/angular 1.0.0 → 2.0.1

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.
@@ -0,0 +1,328 @@
1
+ import * as i0 from '@angular/core';
2
+ import { EventEmitter, Output, Input, ChangeDetectionStrategy, Component, ViewChild } from '@angular/core';
3
+ import * as i1 from '@miden-npm/angular';
4
+ import { formatAmount, RadioGroupComponent, PayByCardComponent, PayByTransferComponent, PayByStableCoinComponent, SuccessComponent, CardComponent, IconMidenLogoComponent, IconCloseComponent, LabelInfoComponent, checkObjectTruthy, IconLoaderComponent, ButtonComponent, InputErrorComponent } from '@miden-npm/angular';
5
+ import * as i2 from '@angular/common';
6
+ import { CommonModule } from '@angular/common';
7
+ import { tap, finalize } from 'rxjs';
8
+
9
+ class CheckoutCardComponent {
10
+ options = null;
11
+ secretKey = '';
12
+ environment = 'sandbox';
13
+ paymentObject = {
14
+ merchantName: '',
15
+ amount: 0,
16
+ currency: '',
17
+ email: '',
18
+ phoneNumber: '',
19
+ narration: '',
20
+ redirectUrl: 'https://sandbox-merchant.buzapay.com/account/three-ds-status',
21
+ };
22
+ ready = new EventEmitter();
23
+ validityChange = new EventEmitter();
24
+ tokenize = new EventEmitter();
25
+ paymentAuthorized = new EventEmitter();
26
+ onError = new EventEmitter();
27
+ successObject = {
28
+ paymentDate: '',
29
+ paymentId: '',
30
+ paymentStatus: '',
31
+ };
32
+ checkoutState = 'PENDING';
33
+ countryOptions = [
34
+ {
35
+ label: 'Nigeria',
36
+ value: 'Nigeria',
37
+ },
38
+ {
39
+ label: 'Ghana',
40
+ value: 'Ghana',
41
+ },
42
+ ];
43
+ paymentTypeOptions = [
44
+ { label: 'Card Payment', value: 'CARD' },
45
+ { label: 'Bank Transfer', value: 'BANK_TRANSFER' },
46
+ { label: 'Stable Coin', value: 'STABLE_COIN' },
47
+ ];
48
+ paymentType = this.paymentTypeOptions[0].value;
49
+ get filteredPaymentTypeOptions() {
50
+ if (this.paymentObject.currency === 'USD') {
51
+ if (this.paymentObject.amount < 50) {
52
+ return this.paymentTypeOptions.filter((option) => option.value !== 'BANK_TRANSFER' && option.value !== 'STABLE_COIN');
53
+ }
54
+ else {
55
+ return this.paymentTypeOptions.filter((option) => option.value !== 'BANK_TRANSFER');
56
+ }
57
+ }
58
+ else {
59
+ return this.paymentTypeOptions.filter((option) => option.value !== 'STABLE_COIN');
60
+ }
61
+ }
62
+ get formatAmountHandler() {
63
+ return formatAmount(this.paymentObject.amount, this.paymentObject.currency);
64
+ }
65
+ get formatChargeHandler() {
66
+ return formatAmount(0, this.paymentObject.currency);
67
+ }
68
+ paymentTypeHandler(event) {
69
+ this.paymentType = event;
70
+ }
71
+ setSuccess(event) {
72
+ this.successObject = { ...event };
73
+ if (this.successObject.paymentStatus === 'authorized') {
74
+ this.checkoutState = 'SUCCESS';
75
+ }
76
+ else if (this.successObject.paymentStatus === 'payment failed') {
77
+ this.checkoutState = 'PENDING';
78
+ }
79
+ else if (this.successObject.paymentStatus === 'used') {
80
+ this.checkoutState = 'USED';
81
+ }
82
+ else {
83
+ this.checkoutState = 'PENDING';
84
+ }
85
+ this.paymentAuthorized.emit(event);
86
+ }
87
+ onErrorHandler(e) {
88
+ this.onError.emit(e);
89
+ }
90
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: CheckoutCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
91
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.1", type: CheckoutCardComponent, isStandalone: true, selector: "miden-checkout-card", inputs: { options: "options", secretKey: "secretKey", environment: "environment", paymentObject: "paymentObject" }, outputs: { ready: "ready", validityChange: "validityChange", tokenize: "tokenize", paymentAuthorized: "paymentAuthorized", onError: "onError" }, ngImport: i0, template: "<base-card caller=\"miden\">\n <div class=\"grid grid-cols-3\" miden>\n @if (checkoutState === 'PENDING') {\n <div class=\"bg-[#0A0032] py-6 flex flex-col gap-5 col-span-1 rounded-l-xl\">\n <p class=\"text-white text-body-xs font-semibold px-6\">Pay with</p>\n <base-radio-group\n caller=\"miden\"\n [options]=\"filteredPaymentTypeOptions\"\n (selectedChange)=\"paymentTypeHandler($event)\"\n ></base-radio-group>\n </div>\n }\n\n <div [class]=\"checkoutState === 'SUCCESS' ? 'col-span-3' : 'col-span-2'\">\n @if (checkoutState === 'PENDING') {\n <div class=\"flex items-center justify-between p-6\">\n <icon-miden-logo></icon-miden-logo>\n <icon-close color=\"black\" class=\"cursor-pointer\"></icon-close>\n </div>\n\n <div class=\"px-14 pt-4 pb-8 flex flex-col gap-6 max-h-[32rem] overflow-y-scroll\">\n <div\n class=\"flex items-center justify-between py-3 px-4 bg-[#F8FDFF] border border-[#DAE4E8] rounded-lg\"\n >\n <base-label-info label=\"Amount Due\" [value]=\"formatAmountHandler\"></base-label-info>\n <base-label-info label=\"Charges\" [value]=\"formatChargeHandler\"></base-label-info>\n </div>\n\n <div>\n @if (paymentType === 'CARD') {\n <pay-by-card\n [environment]=\"environment\"\n [secretKey]=\"secretKey\"\n [paymentObject]=\"paymentObject\"\n caller=\"miden\"\n (paymentAuthorized)=\"setSuccess($event)\"\n (onError)=\"onErrorHandler($event)\"\n ></pay-by-card>\n } @else if (paymentType === 'BANK_TRANSFER') {\n <pay-by-transfer\n [environment]=\"environment\"\n [secretKey]=\"secretKey\"\n [paymentObject]=\"paymentObject\"\n caller=\"miden\"\n (paymentAuthorized)=\"setSuccess($event)\"\n (onError)=\"onErrorHandler($event)\"\n ></pay-by-transfer>\n } @else {\n <pay-by-stable-coin\n [environment]=\"environment\"\n [secretKey]=\"secretKey\"\n [paymentObject]=\"paymentObject\"\n caller=\"miden\"\n (paymentAuthorized)=\"setSuccess($event)\"\n (onError)=\"onErrorHandler($event)\"\n ></pay-by-stable-coin>\n }\n </div>\n </div>\n } @else if (checkoutState === 'SUCCESS') {\n <base-success\n [amount]=\"paymentObject.amount\"\n [currency]=\"paymentObject.currency\"\n caller=\"miden\"\n [redirectUrl]=\"paymentObject.redirectUrl ?? ''\"\n [successObject]=\"successObject\"\n ></base-success>\n }\n </div>\n </div>\n</base-card>\n", dependencies: [{ kind: "component", type: RadioGroupComponent, selector: "base-radio-group", inputs: ["caller", "options", "type"], outputs: ["selectedChange"] }, { kind: "component", type: PayByCardComponent, selector: "pay-by-card", inputs: ["secretKey", "environment", "caller", "paymentObject"], outputs: ["paymentAuthorized", "onError"] }, { kind: "component", type: PayByTransferComponent, selector: "pay-by-transfer", inputs: ["secretKey", "environment", "caller", "paymentObject"], outputs: ["paymentAuthorized", "onError"] }, { kind: "component", type: PayByStableCoinComponent, selector: "pay-by-stable-coin", inputs: ["secretKey", "environment", "caller", "paymentObject"], outputs: ["paymentAuthorized", "onError"] }, { kind: "component", type: SuccessComponent, selector: "base-success", inputs: ["successObject", "caller", "amount", "currency", "redirectUrl"] }, { kind: "component", type: CardComponent, selector: "base-card", inputs: ["showBackButton", "caller"], outputs: ["back"] }, { kind: "component", type: IconMidenLogoComponent, selector: "icon-miden-logo", inputs: ["width", "height"] }, { kind: "component", type: IconCloseComponent, selector: "icon-close", inputs: ["color", "width", "height"] }, { kind: "component", type: LabelInfoComponent, selector: "base-label-info", inputs: ["type", "label", "labelCustomClass", "valueImageSrc", "valueImageCustomClass", "valueImagePosition", "hasValueCopy", "value", "valueCustomClass", "alignRight"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
92
+ }
93
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: CheckoutCardComponent, decorators: [{
94
+ type: Component,
95
+ args: [{ selector: 'miden-checkout-card', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
96
+ RadioGroupComponent,
97
+ PayByCardComponent,
98
+ PayByTransferComponent,
99
+ PayByStableCoinComponent,
100
+ SuccessComponent,
101
+ CardComponent,
102
+ IconMidenLogoComponent,
103
+ IconCloseComponent,
104
+ LabelInfoComponent,
105
+ ], template: "<base-card caller=\"miden\">\n <div class=\"grid grid-cols-3\" miden>\n @if (checkoutState === 'PENDING') {\n <div class=\"bg-[#0A0032] py-6 flex flex-col gap-5 col-span-1 rounded-l-xl\">\n <p class=\"text-white text-body-xs font-semibold px-6\">Pay with</p>\n <base-radio-group\n caller=\"miden\"\n [options]=\"filteredPaymentTypeOptions\"\n (selectedChange)=\"paymentTypeHandler($event)\"\n ></base-radio-group>\n </div>\n }\n\n <div [class]=\"checkoutState === 'SUCCESS' ? 'col-span-3' : 'col-span-2'\">\n @if (checkoutState === 'PENDING') {\n <div class=\"flex items-center justify-between p-6\">\n <icon-miden-logo></icon-miden-logo>\n <icon-close color=\"black\" class=\"cursor-pointer\"></icon-close>\n </div>\n\n <div class=\"px-14 pt-4 pb-8 flex flex-col gap-6 max-h-[32rem] overflow-y-scroll\">\n <div\n class=\"flex items-center justify-between py-3 px-4 bg-[#F8FDFF] border border-[#DAE4E8] rounded-lg\"\n >\n <base-label-info label=\"Amount Due\" [value]=\"formatAmountHandler\"></base-label-info>\n <base-label-info label=\"Charges\" [value]=\"formatChargeHandler\"></base-label-info>\n </div>\n\n <div>\n @if (paymentType === 'CARD') {\n <pay-by-card\n [environment]=\"environment\"\n [secretKey]=\"secretKey\"\n [paymentObject]=\"paymentObject\"\n caller=\"miden\"\n (paymentAuthorized)=\"setSuccess($event)\"\n (onError)=\"onErrorHandler($event)\"\n ></pay-by-card>\n } @else if (paymentType === 'BANK_TRANSFER') {\n <pay-by-transfer\n [environment]=\"environment\"\n [secretKey]=\"secretKey\"\n [paymentObject]=\"paymentObject\"\n caller=\"miden\"\n (paymentAuthorized)=\"setSuccess($event)\"\n (onError)=\"onErrorHandler($event)\"\n ></pay-by-transfer>\n } @else {\n <pay-by-stable-coin\n [environment]=\"environment\"\n [secretKey]=\"secretKey\"\n [paymentObject]=\"paymentObject\"\n caller=\"miden\"\n (paymentAuthorized)=\"setSuccess($event)\"\n (onError)=\"onErrorHandler($event)\"\n ></pay-by-stable-coin>\n }\n </div>\n </div>\n } @else if (checkoutState === 'SUCCESS') {\n <base-success\n [amount]=\"paymentObject.amount\"\n [currency]=\"paymentObject.currency\"\n caller=\"miden\"\n [redirectUrl]=\"paymentObject.redirectUrl ?? ''\"\n [successObject]=\"successObject\"\n ></base-success>\n }\n </div>\n </div>\n</base-card>\n" }]
106
+ }], propDecorators: { options: [{
107
+ type: Input
108
+ }], secretKey: [{
109
+ type: Input
110
+ }], environment: [{
111
+ type: Input
112
+ }], paymentObject: [{
113
+ type: Input
114
+ }], ready: [{
115
+ type: Output
116
+ }], validityChange: [{
117
+ type: Output
118
+ }], tokenize: [{
119
+ type: Output
120
+ }], paymentAuthorized: [{
121
+ type: Output
122
+ }], onError: [{
123
+ type: Output
124
+ }] } });
125
+
126
+ class CheckoutIframeComponent {
127
+ renderer;
128
+ cdr;
129
+ checkout;
130
+ constructor(renderer, cdr, checkout) {
131
+ this.renderer = renderer;
132
+ this.cdr = cdr;
133
+ this.checkout = checkout;
134
+ }
135
+ errorMessage = '';
136
+ loading = false;
137
+ launchUrl = '';
138
+ iframe;
139
+ secretKey = '';
140
+ url = '';
141
+ style = {
142
+ width: '100%',
143
+ height: '100vh',
144
+ border: '0',
145
+ borderRadius: '6px',
146
+ overflow: 'hidden',
147
+ };
148
+ environment = 'sandbox';
149
+ paymentObject = {
150
+ merchantName: '',
151
+ amount: 0,
152
+ currency: '',
153
+ email: '',
154
+ phoneNumber: '',
155
+ narration: '',
156
+ redirectUrl: 'https://sandbox-merchant.buzapay.com/account/three-ds-status',
157
+ };
158
+ container;
159
+ onError = new EventEmitter();
160
+ get blockStyle() {
161
+ return {
162
+ ...(this.style || {}),
163
+ };
164
+ }
165
+ launchIframe(url) {
166
+ const host = this.container?.nativeElement;
167
+ if (!host)
168
+ return; // guard: container not in DOM yet
169
+ this.iframe = this.renderer.createElement('iframe');
170
+ this.renderer.setAttribute(this.iframe, 'src', url);
171
+ this.renderer.setStyle(this.iframe, 'width', this.style.width);
172
+ this.renderer.setStyle(this.iframe, 'height', this.style.height);
173
+ this.renderer.setStyle(this.iframe, 'border', this.style.border);
174
+ this.renderer.setStyle(this.iframe, 'borderRadius', this.style.borderRadius);
175
+ this.renderer.setStyle(this.iframe, 'overflow', this.style.overflow);
176
+ this.renderer.appendChild(host, this.iframe);
177
+ }
178
+ async generatePaymentLinkHandler() {
179
+ if (this.url) {
180
+ this.launchIframe(this.url);
181
+ return;
182
+ }
183
+ if (!this.secretKey) {
184
+ return (this.errorMessage = 'Secret key is required.');
185
+ }
186
+ if (!checkObjectTruthy(this.paymentObject)) {
187
+ return (this.errorMessage = 'Kindly ensure you are passing all the required data.');
188
+ }
189
+ this.loading = true;
190
+ this.cdr.markForCheck();
191
+ this.checkout
192
+ .createPaymentLink(this.paymentObject, this.environment, this.secretKey, 'miden')
193
+ .pipe(tap((res) => {
194
+ if (res?.isSuccessful) {
195
+ this.launchUrl = res.launchUrl ?? '';
196
+ this.errorMessage = 'Payment link created successfully';
197
+ if (this.launchUrl) {
198
+ this.launchIframe(`${this.launchUrl}&merchantId=${btoa(this.secretKey)}`);
199
+ }
200
+ }
201
+ else {
202
+ this.errorMessage = 'Failed to create payment link';
203
+ this.onError.emit({ errorMessage: this.errorMessage });
204
+ }
205
+ }), finalize(() => {
206
+ this.loading = false;
207
+ this.cdr.markForCheck();
208
+ }))
209
+ .subscribe({
210
+ error: (err) => {
211
+ this.onError.emit({ errorMessage: this.errorMessage });
212
+ },
213
+ });
214
+ }
215
+ async ngAfterViewInit() {
216
+ await this.generatePaymentLinkHandler();
217
+ }
218
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: CheckoutIframeComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i1.CheckoutService }], target: i0.ɵɵFactoryTarget.Component });
219
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.1", type: CheckoutIframeComponent, isStandalone: true, selector: "miden-checkout-iframe", inputs: { secretKey: "secretKey", url: "url", style: "style", environment: "environment", paymentObject: "paymentObject" }, outputs: { onError: "onError" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: "<div class=\"relative\" [ngStyle]=\"blockStyle\">\n <div #container class=\"w-full h-full\"></div>\n\n @if (loading) {\n <div class=\"absolute inset-0 grid place-items-center bg-white/60\">\n <icon-loader></icon-loader>\n </div>\n }\n</div>\n", dependencies: [{ kind: "component", type: IconLoaderComponent, selector: "icon-loader", inputs: ["color", "size"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
220
+ }
221
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: CheckoutIframeComponent, decorators: [{
222
+ type: Component,
223
+ args: [{ selector: 'miden-checkout-iframe', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [IconLoaderComponent, CommonModule], template: "<div class=\"relative\" [ngStyle]=\"blockStyle\">\n <div #container class=\"w-full h-full\"></div>\n\n @if (loading) {\n <div class=\"absolute inset-0 grid place-items-center bg-white/60\">\n <icon-loader></icon-loader>\n </div>\n }\n</div>\n" }]
224
+ }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i1.CheckoutService }], propDecorators: { secretKey: [{
225
+ type: Input
226
+ }], url: [{
227
+ type: Input
228
+ }], style: [{
229
+ type: Input
230
+ }], environment: [{
231
+ type: Input
232
+ }], paymentObject: [{
233
+ type: Input
234
+ }], container: [{
235
+ type: ViewChild,
236
+ args: ['container', { static: false }]
237
+ }], onError: [{
238
+ type: Output
239
+ }] } });
240
+
241
+ class CheckoutButtonComponent {
242
+ checkout;
243
+ cdr;
244
+ constructor(checkout, cdr) {
245
+ this.checkout = checkout;
246
+ this.cdr = cdr;
247
+ }
248
+ errorMessage = '';
249
+ loading = false;
250
+ launchUrl = '';
251
+ urlLaunchUrl = '';
252
+ secretKey = '';
253
+ timeout = 30000;
254
+ environment = 'sandbox';
255
+ mode = 'redirect';
256
+ paymentObject = {
257
+ merchantName: '',
258
+ amount: 0,
259
+ currency: '',
260
+ email: '',
261
+ phoneNumber: '',
262
+ narration: '',
263
+ redirectUrl: 'https://sandbox-merchant.buzapay.com/account/three-ds-status',
264
+ };
265
+ onError = new EventEmitter();
266
+ get formatAmountHandler() {
267
+ return formatAmount(this.paymentObject.amount, this.paymentObject.currency);
268
+ }
269
+ async generatePaymentLinkHandler() {
270
+ if (!this.secretKey) {
271
+ return (this.errorMessage = 'Secret key is required.');
272
+ }
273
+ if (!checkObjectTruthy(this.paymentObject)) {
274
+ return (this.errorMessage = 'Kindly ensure you are passing all the required data.');
275
+ }
276
+ this.loading = true;
277
+ this.cdr.markForCheck();
278
+ this.checkout
279
+ .createPaymentLink(this.paymentObject, this.environment, this.secretKey, 'miden')
280
+ .pipe(tap((res) => {
281
+ if (res?.isSuccessful) {
282
+ this.launchUrl = res.launchUrl ?? '';
283
+ this.urlLaunchUrl = `${res.launchUrl}&merchantId=${btoa(this.secretKey)}`;
284
+ this.errorMessage = 'Payment link created successfully';
285
+ if (this.mode === 'redirect' && this.launchUrl) {
286
+ window.open(this.launchUrl, '_blank', 'noopener,noreferrer');
287
+ }
288
+ }
289
+ else {
290
+ this.errorMessage = 'Failed to create payment link';
291
+ this.onError.emit({ errorMessage: this.errorMessage });
292
+ }
293
+ }), finalize(() => {
294
+ this.loading = false;
295
+ this.cdr.markForCheck();
296
+ }))
297
+ .subscribe({
298
+ error: (err) => {
299
+ this.onError.emit({ errorMessage: this.errorMessage });
300
+ },
301
+ });
302
+ }
303
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: CheckoutButtonComponent, deps: [{ token: i1.CheckoutService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
304
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.1", type: CheckoutButtonComponent, isStandalone: true, selector: "miden-checkout-button", inputs: { secretKey: "secretKey", timeout: "timeout", environment: "environment", mode: "mode", paymentObject: "paymentObject" }, outputs: { onError: "onError" }, ngImport: i0, template: "@if (urlLaunchUrl && mode === 'iframe') {\n <miden-checkout-iframe\n [url]=\"urlLaunchUrl\"\n [secretKey]=\"secretKey\"\n [environment]=\"environment\"\n ></miden-checkout-iframe>\n} @else {\n <base-button\n [label]=\"'Pay ' + formatAmountHandler\"\n type=\"primary\"\n caller=\"miden\"\n customClass=\"w-full\"\n [loading]=\"loading\"\n (onClick)=\"generatePaymentLinkHandler()\"\n ></base-button>\n <base-input-error [errorMessage]=\"errorMessage\"></base-input-error>\n}\n", dependencies: [{ kind: "component", type: ButtonComponent, selector: "base-button", inputs: ["label", "type", "caller", "size", "paddingClassX", "disabled", "loading", "customClass"], outputs: ["onClick"] }, { kind: "component", type: InputErrorComponent, selector: "base-input-error", inputs: ["errorMessage"] }, { kind: "component", type: CheckoutIframeComponent, selector: "miden-checkout-iframe", inputs: ["secretKey", "url", "style", "environment", "paymentObject"], outputs: ["onError"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
305
+ }
306
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: CheckoutButtonComponent, decorators: [{
307
+ type: Component,
308
+ args: [{ selector: 'miden-checkout-button', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [ButtonComponent, InputErrorComponent, InputErrorComponent, CheckoutIframeComponent], template: "@if (urlLaunchUrl && mode === 'iframe') {\n <miden-checkout-iframe\n [url]=\"urlLaunchUrl\"\n [secretKey]=\"secretKey\"\n [environment]=\"environment\"\n ></miden-checkout-iframe>\n} @else {\n <base-button\n [label]=\"'Pay ' + formatAmountHandler\"\n type=\"primary\"\n caller=\"miden\"\n customClass=\"w-full\"\n [loading]=\"loading\"\n (onClick)=\"generatePaymentLinkHandler()\"\n ></base-button>\n <base-input-error [errorMessage]=\"errorMessage\"></base-input-error>\n}\n" }]
309
+ }], ctorParameters: () => [{ type: i1.CheckoutService }, { type: i0.ChangeDetectorRef }], propDecorators: { secretKey: [{
310
+ type: Input
311
+ }], timeout: [{
312
+ type: Input
313
+ }], environment: [{
314
+ type: Input
315
+ }], mode: [{
316
+ type: Input
317
+ }], paymentObject: [{
318
+ type: Input
319
+ }], onError: [{
320
+ type: Output
321
+ }] } });
322
+
323
+ /**
324
+ * Generated bundle index. Do not edit.
325
+ */
326
+
327
+ export { CheckoutButtonComponent, CheckoutCardComponent, CheckoutIframeComponent };
328
+ //# sourceMappingURL=miden-npm-angular-miden-checkout.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"miden-npm-angular-miden-checkout.mjs","sources":["../../miden-checkout/src/lib/checkout-card/checkout-card.component.ts","../../miden-checkout/src/lib/checkout-card/checkout-card.component.html","../../miden-checkout/src/lib/checkout-iframe/checkout-iframe.component.ts","../../miden-checkout/src/lib/checkout-iframe/checkout-iframe.component.html","../../miden-checkout/src/lib/checkout-button/checkout-button.component.ts","../../miden-checkout/src/lib/checkout-button/checkout-button.component.html","../../miden-checkout/miden-npm-angular-miden-checkout.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';\nimport {\n ISelectOption,\n RadioGroupComponent,\n SuccessComponent,\n CardComponent,\n IPaymentObject,\n formatAmount,\n ISuccessObject,\n IErrorObject,\n PayByCardComponent,\n PayByTransferComponent,\n PayByStableCoinComponent,\n IconMidenLogoComponent,\n IconCloseComponent,\n LabelInfoComponent,\n} from '@miden-npm/angular';\n\nexport interface CheckoutIframeStyle {\n [cssProp: string]: string | number;\n}\n\nexport interface CheckoutCardOptions {\n imageUrl?: string;\n numberPlaceholder?: string;\n expiryPlaceholder?: string;\n cvcPlaceholder?: string;\n styles?: {\n base?: CheckoutIframeStyle;\n invalid?: CheckoutIframeStyle;\n focus?: CheckoutIframeStyle;\n };\n}\n\nexport interface TokenizeResult {\n token: string;\n last4?: string;\n brand?: string;\n}\n\n@Component({\n selector: 'miden-checkout-card',\n standalone: true,\n templateUrl: './checkout-card.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n RadioGroupComponent,\n PayByCardComponent,\n PayByTransferComponent,\n PayByStableCoinComponent,\n SuccessComponent,\n CardComponent,\n IconMidenLogoComponent,\n IconCloseComponent,\n LabelInfoComponent,\n ],\n})\nexport class CheckoutCardComponent {\n @Input() options: CheckoutCardOptions | null = null;\n @Input() secretKey: string = '';\n @Input() environment: 'sandbox' | 'prod' = 'sandbox';\n @Input() paymentObject: IPaymentObject = {\n merchantName: '',\n amount: 0,\n currency: '',\n email: '',\n phoneNumber: '',\n narration: '',\n redirectUrl: 'https://sandbox-merchant.buzapay.com/account/three-ds-status',\n };\n @Output() ready = new EventEmitter<void>();\n @Output() validityChange = new EventEmitter<{ valid: boolean; field?: string }>();\n @Output() tokenize = new EventEmitter<TokenizeResult>();\n @Output() paymentAuthorized = new EventEmitter<ISuccessObject>();\n @Output() onError = new EventEmitter<IErrorObject>();\n\n successObject: ISuccessObject = {\n paymentDate: '',\n paymentId: '',\n paymentStatus: '',\n };\n checkoutState: 'SUCCESS' | 'PENDING' | 'USED' = 'PENDING';\n countryOptions: ISelectOption[] = [\n {\n label: 'Nigeria',\n value: 'Nigeria',\n },\n {\n label: 'Ghana',\n value: 'Ghana',\n },\n ];\n paymentTypeOptions: ISelectOption[] = [\n { label: 'Card Payment', value: 'CARD' },\n { label: 'Bank Transfer', value: 'BANK_TRANSFER' },\n { label: 'Stable Coin', value: 'STABLE_COIN' },\n ];\n paymentType: string = this.paymentTypeOptions[0].value;\n\n get filteredPaymentTypeOptions(): ISelectOption[] {\n if (this.paymentObject.currency === 'USD') {\n if (this.paymentObject.amount < 50) {\n return this.paymentTypeOptions.filter(\n (option) => option.value !== 'BANK_TRANSFER' && option.value !== 'STABLE_COIN',\n );\n } else {\n return this.paymentTypeOptions.filter((option) => option.value !== 'BANK_TRANSFER');\n }\n } else {\n return this.paymentTypeOptions.filter((option) => option.value !== 'STABLE_COIN');\n }\n }\n\n get formatAmountHandler(): string {\n return formatAmount(this.paymentObject.amount, this.paymentObject.currency);\n }\n\n get formatChargeHandler(): string {\n return formatAmount(0, this.paymentObject.currency);\n }\n\n paymentTypeHandler(event: string): void {\n this.paymentType = event;\n }\n\n setSuccess(event: ISuccessObject): void {\n this.successObject = { ...event };\n if (this.successObject.paymentStatus === 'authorized') {\n this.checkoutState = 'SUCCESS';\n } else if (this.successObject.paymentStatus === 'payment failed') {\n this.checkoutState = 'PENDING';\n } else if (this.successObject.paymentStatus === 'used') {\n this.checkoutState = 'USED';\n } else {\n this.checkoutState = 'PENDING';\n }\n\n this.paymentAuthorized.emit(event);\n }\n\n onErrorHandler(e: IErrorObject): void {\n this.onError.emit(e);\n }\n}\n","<base-card caller=\"miden\">\n <div class=\"grid grid-cols-3\" miden>\n @if (checkoutState === 'PENDING') {\n <div class=\"bg-[#0A0032] py-6 flex flex-col gap-5 col-span-1 rounded-l-xl\">\n <p class=\"text-white text-body-xs font-semibold px-6\">Pay with</p>\n <base-radio-group\n caller=\"miden\"\n [options]=\"filteredPaymentTypeOptions\"\n (selectedChange)=\"paymentTypeHandler($event)\"\n ></base-radio-group>\n </div>\n }\n\n <div [class]=\"checkoutState === 'SUCCESS' ? 'col-span-3' : 'col-span-2'\">\n @if (checkoutState === 'PENDING') {\n <div class=\"flex items-center justify-between p-6\">\n <icon-miden-logo></icon-miden-logo>\n <icon-close color=\"black\" class=\"cursor-pointer\"></icon-close>\n </div>\n\n <div class=\"px-14 pt-4 pb-8 flex flex-col gap-6 max-h-[32rem] overflow-y-scroll\">\n <div\n class=\"flex items-center justify-between py-3 px-4 bg-[#F8FDFF] border border-[#DAE4E8] rounded-lg\"\n >\n <base-label-info label=\"Amount Due\" [value]=\"formatAmountHandler\"></base-label-info>\n <base-label-info label=\"Charges\" [value]=\"formatChargeHandler\"></base-label-info>\n </div>\n\n <div>\n @if (paymentType === 'CARD') {\n <pay-by-card\n [environment]=\"environment\"\n [secretKey]=\"secretKey\"\n [paymentObject]=\"paymentObject\"\n caller=\"miden\"\n (paymentAuthorized)=\"setSuccess($event)\"\n (onError)=\"onErrorHandler($event)\"\n ></pay-by-card>\n } @else if (paymentType === 'BANK_TRANSFER') {\n <pay-by-transfer\n [environment]=\"environment\"\n [secretKey]=\"secretKey\"\n [paymentObject]=\"paymentObject\"\n caller=\"miden\"\n (paymentAuthorized)=\"setSuccess($event)\"\n (onError)=\"onErrorHandler($event)\"\n ></pay-by-transfer>\n } @else {\n <pay-by-stable-coin\n [environment]=\"environment\"\n [secretKey]=\"secretKey\"\n [paymentObject]=\"paymentObject\"\n caller=\"miden\"\n (paymentAuthorized)=\"setSuccess($event)\"\n (onError)=\"onErrorHandler($event)\"\n ></pay-by-stable-coin>\n }\n </div>\n </div>\n } @else if (checkoutState === 'SUCCESS') {\n <base-success\n [amount]=\"paymentObject.amount\"\n [currency]=\"paymentObject.currency\"\n caller=\"miden\"\n [redirectUrl]=\"paymentObject.redirectUrl ?? ''\"\n [successObject]=\"successObject\"\n ></base-success>\n }\n </div>\n </div>\n</base-card>\n","import { CommonModule } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n Output,\n Renderer2,\n ViewChild,\n} from '@angular/core';\nimport {\n checkObjectTruthy,\n CheckoutService,\n IApiResponse,\n IPaymentObject,\n IconLoaderComponent,\n IErrorObject,\n} from '@miden-npm/angular';\nimport { finalize, tap } from 'rxjs';\n\ninterface IIframeStyle {\n width?: string;\n height?: string;\n border?: string;\n borderRadius?: string;\n overflow?: string;\n}\n\n@Component({\n selector: 'miden-checkout-iframe',\n standalone: true,\n templateUrl: './checkout-iframe.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [IconLoaderComponent, CommonModule],\n})\nexport class CheckoutIframeComponent implements AfterViewInit {\n constructor(\n private renderer: Renderer2,\n private cdr: ChangeDetectorRef,\n private checkout: CheckoutService,\n ) {}\n\n errorMessage: string = '';\n loading: boolean = false;\n launchUrl: string = '';\n iframe: any;\n\n @Input() secretKey: string = '';\n @Input() url: string = '';\n @Input() style: IIframeStyle = {\n width: '100%',\n height: '100vh',\n border: '0',\n borderRadius: '6px',\n overflow: 'hidden',\n };\n @Input() environment: 'sandbox' | 'prod' = 'sandbox';\n @Input() paymentObject: IPaymentObject = {\n merchantName: '',\n amount: 0,\n currency: '',\n email: '',\n phoneNumber: '',\n narration: '',\n redirectUrl: 'https://sandbox-merchant.buzapay.com/account/three-ds-status',\n };\n @ViewChild('container', { static: false }) container?: ElementRef<HTMLDivElement>;\n @Output() onError = new EventEmitter<IErrorObject>();\n\n get blockStyle() {\n return {\n ...(this.style || {}),\n };\n }\n\n launchIframe(url: string): void {\n const host = this.container?.nativeElement;\n if (!host) return; // guard: container not in DOM yet\n this.iframe = this.renderer.createElement('iframe');\n this.renderer.setAttribute(this.iframe, 'src', url);\n this.renderer.setStyle(this.iframe, 'width', this.style.width);\n this.renderer.setStyle(this.iframe, 'height', this.style.height);\n this.renderer.setStyle(this.iframe, 'border', this.style.border);\n this.renderer.setStyle(this.iframe, 'borderRadius', this.style.borderRadius);\n this.renderer.setStyle(this.iframe, 'overflow', this.style.overflow);\n this.renderer.appendChild(host, this.iframe);\n }\n\n async generatePaymentLinkHandler(): Promise<void | string> {\n if (this.url) {\n this.launchIframe(this.url);\n return;\n }\n\n if (!this.secretKey) {\n return (this.errorMessage = 'Secret key is required.');\n }\n\n if (!checkObjectTruthy<IPaymentObject>(this.paymentObject)) {\n return (this.errorMessage = 'Kindly ensure you are passing all the required data.');\n }\n\n this.loading = true;\n this.cdr.markForCheck();\n this.checkout\n .createPaymentLink(this.paymentObject, this.environment, this.secretKey, 'miden')\n .pipe(\n tap((res: IApiResponse<any>) => {\n if (res?.isSuccessful) {\n this.launchUrl = res.launchUrl ?? '';\n this.errorMessage = 'Payment link created successfully';\n if (this.launchUrl) {\n this.launchIframe(`${this.launchUrl}&merchantId=${btoa(this.secretKey)}`);\n }\n } else {\n this.errorMessage = 'Failed to create payment link';\n this.onError.emit({ errorMessage: this.errorMessage });\n }\n }),\n finalize(() => {\n this.loading = false;\n this.cdr.markForCheck();\n }),\n )\n .subscribe({\n error: (err: any) => {\n this.onError.emit({ errorMessage: this.errorMessage });\n },\n });\n }\n\n async ngAfterViewInit(): Promise<void> {\n await this.generatePaymentLinkHandler();\n }\n}\n","<div class=\"relative\" [ngStyle]=\"blockStyle\">\n <div #container class=\"w-full h-full\"></div>\n\n @if (loading) {\n <div class=\"absolute inset-0 grid place-items-center bg-white/60\">\n <icon-loader></icon-loader>\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n Output,\n} from '@angular/core';\nimport {\n ButtonComponent,\n checkObjectTruthy,\n CheckoutService,\n IApiResponse,\n IPaymentObject,\n IErrorObject,\n InputErrorComponent,\n formatAmount,\n} from '@miden-npm/angular';\nimport { CheckoutIframeComponent } from '../checkout-iframe/checkout-iframe.component';\nimport { finalize, tap } from 'rxjs';\n\n@Component({\n selector: 'miden-checkout-button',\n standalone: true,\n templateUrl: './checkout-button.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [ButtonComponent, InputErrorComponent, InputErrorComponent, CheckoutIframeComponent],\n})\nexport class CheckoutButtonComponent {\n constructor(\n private checkout: CheckoutService,\n private cdr: ChangeDetectorRef,\n ) {}\n\n errorMessage: string = '';\n loading: boolean = false;\n launchUrl: string = '';\n urlLaunchUrl: string = '';\n\n @Input() secretKey: string = '';\n @Input() timeout: number = 30000;\n @Input() environment: 'sandbox' | 'prod' = 'sandbox';\n @Input() mode: 'redirect' | 'iframe' = 'redirect';\n @Input() paymentObject: IPaymentObject = {\n merchantName: '',\n amount: 0,\n currency: '',\n email: '',\n phoneNumber: '',\n narration: '',\n redirectUrl: 'https://sandbox-merchant.buzapay.com/account/three-ds-status',\n };\n @Output() onError = new EventEmitter<IErrorObject>();\n\n get formatAmountHandler(): string {\n return formatAmount(this.paymentObject.amount, this.paymentObject.currency);\n }\n\n async generatePaymentLinkHandler(): Promise<void | string> {\n if (!this.secretKey) {\n return (this.errorMessage = 'Secret key is required.');\n }\n\n if (!checkObjectTruthy<IPaymentObject>(this.paymentObject)) {\n return (this.errorMessage = 'Kindly ensure you are passing all the required data.');\n }\n\n this.loading = true;\n this.cdr.markForCheck();\n this.checkout\n .createPaymentLink(this.paymentObject, this.environment, this.secretKey, 'miden')\n .pipe(\n tap((res: IApiResponse<any>) => {\n if (res?.isSuccessful) {\n this.launchUrl = res.launchUrl ?? '';\n this.urlLaunchUrl = `${res.launchUrl}&merchantId=${btoa(this.secretKey)}`;\n this.errorMessage = 'Payment link created successfully';\n if (this.mode === 'redirect' && this.launchUrl) {\n window.open(this.launchUrl, '_blank', 'noopener,noreferrer');\n }\n } else {\n this.errorMessage = 'Failed to create payment link';\n this.onError.emit({ errorMessage: this.errorMessage });\n }\n }),\n finalize(() => {\n this.loading = false;\n this.cdr.markForCheck();\n }),\n )\n .subscribe({\n error: (err: any) => {\n this.onError.emit({ errorMessage: this.errorMessage });\n },\n });\n }\n}\n","@if (urlLaunchUrl && mode === 'iframe') {\n <miden-checkout-iframe\n [url]=\"urlLaunchUrl\"\n [secretKey]=\"secretKey\"\n [environment]=\"environment\"\n ></miden-checkout-iframe>\n} @else {\n <base-button\n [label]=\"'Pay ' + formatAmountHandler\"\n type=\"primary\"\n caller=\"miden\"\n customClass=\"w-full\"\n [loading]=\"loading\"\n (onClick)=\"generatePaymentLinkHandler()\"\n ></base-button>\n <base-input-error [errorMessage]=\"errorMessage\"></base-input-error>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}