@inttegro/angular 0.2.0 → 0.4.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.
package/README.md CHANGED
@@ -14,3 +14,10 @@ import { CheckoutComponent } from '@inttegro/angular'
14
14
  })
15
15
  export class PaymentPage {}
16
16
  ```
17
+
18
+ For a `customer_selected_amount` Buy link, bind `purchaseIntentId` instead of
19
+ `orderId`. This works in both embedded and modal presentations:
20
+
21
+ ```html
22
+ <inttegro-checkout [purchaseIntentId]="purchaseIntentId" presentation="modal" />
23
+ ```
@@ -7,9 +7,9 @@ import { loadInttegro } from '@inttegro/js';
7
7
  *
8
8
  * Add the component to a host component's `imports` array. It loads the hosted
9
9
  * runtime after its view initializes, creates one controller, and destroys that
10
- * controller with the Angular view. Changing `features`, `orderId`, `timeout`,
11
- * or `title` replaces the controller; changing `appearance` or `locale`
12
- * updates it in place.
10
+ * controller with the Angular view. Changing `features`, `orderId`,
11
+ * `presentation`, `timeout`, or `title` replaces the controller; changing
12
+ * `appearance` or `locale` updates it in place.
13
13
  *
14
14
  * Keep this component mounted while a payment attempt or confirmation is
15
15
  * pending. The successful `completed` output is suitable for navigation, but
@@ -23,6 +23,7 @@ import { loadInttegro } from '@inttegro/js';
23
23
  * template: `
24
24
  * <inttegro-checkout
25
25
  * [orderId]="orderId"
26
+ * presentation="modal"
26
27
  * [appearance]="{ theme: 'system' }"
27
28
  * (completed)="onCompleted()"
28
29
  * (error)="onError($event)"
@@ -42,10 +43,12 @@ import { loadInttegro } from '@inttegro/js';
42
43
  */
43
44
  class CheckoutComponent {
44
45
  constructor() {
45
- /** Client-safe reference for the finalized Order being paid. */
46
- this.orderId = '';
46
+ /** Displays Checkout inline by default or in an Inttegro-managed modal. */
47
+ this.presentation = 'embedded';
47
48
  /** Emitted after Checkout reports its successful terminal state. */
48
49
  this.completed = new EventEmitter();
50
+ /** Emitted when a payer dismisses managed modal Checkout before completion. */
51
+ this.canceled = new EventEmitter();
49
52
  /** Emitted for loader/mount failures and sanitized hosted errors. */
50
53
  this.error = new EventEmitter();
51
54
  /** Emitted for every sanitized hosted Checkout lifecycle event. */
@@ -64,6 +67,8 @@ class CheckoutComponent {
64
67
  return;
65
68
  if (changes['features'] ||
66
69
  changes['orderId'] ||
70
+ changes['purchaseIntentId'] ||
71
+ changes['presentation'] ||
67
72
  changes['timeout'] ||
68
73
  changes['title']) {
69
74
  void this.mountCheckout();
@@ -83,6 +88,10 @@ class CheckoutComponent {
83
88
  focus() {
84
89
  this.checkout?.focus();
85
90
  }
91
+ /** Closes managed modal Checkout when it is open. */
92
+ dismiss() {
93
+ this.checkout?.dismiss();
94
+ }
86
95
  /**
87
96
  * Applies a new locale or color scheme when a controller exists.
88
97
  * Prefer binding `appearance` and `locale` for declarative Angular views.
@@ -96,6 +105,7 @@ class CheckoutComponent {
96
105
  this.destroyCheckout();
97
106
  const generation = this.generation;
98
107
  const target = this.container.nativeElement;
108
+ let canceled = false;
99
109
  try {
100
110
  const inttegro = await loadInttegro();
101
111
  if (generation !== this.generation || !inttegro)
@@ -105,6 +115,7 @@ class CheckoutComponent {
105
115
  features: this.features,
106
116
  locale: this.locale,
107
117
  orderId: this.orderId,
118
+ purchaseIntentId: this.purchaseIntentId,
108
119
  timeout: this.timeout,
109
120
  title: this.title,
110
121
  }));
@@ -115,6 +126,10 @@ class CheckoutComponent {
115
126
  this.checkout = checkout;
116
127
  this.unsubscribe = checkout.onEvent((event) => {
117
128
  this.event.emit(event);
129
+ if (event.type === 'canceled') {
130
+ canceled = true;
131
+ this.canceled.emit(event);
132
+ }
118
133
  if (event.type === 'ready')
119
134
  this.ready.emit(event);
120
135
  if (event.type === 'completed')
@@ -122,10 +137,13 @@ class CheckoutComponent {
122
137
  if (event.type === 'error')
123
138
  this.error.emit(event);
124
139
  });
125
- await checkout.mount(target);
140
+ if (this.presentation === 'modal')
141
+ await checkout.present();
142
+ else
143
+ await checkout.mount(target);
126
144
  }
127
145
  catch (error) {
128
- if (generation !== this.generation)
146
+ if (generation !== this.generation || canceled)
129
147
  return;
130
148
  this.error.emit(error instanceof Error ? error : new Error('Checkout failed to load.'));
131
149
  }
@@ -138,7 +156,7 @@ class CheckoutComponent {
138
156
  this.checkout = undefined;
139
157
  }
140
158
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: CheckoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
141
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.5", type: CheckoutComponent, isStandalone: true, selector: "inttegro-checkout", inputs: { appearance: "appearance", features: "features", locale: "locale", orderId: "orderId", timeout: "timeout", title: "title" }, outputs: { completed: "completed", error: "error", event: "event", ready: "ready" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: '<div #container></div>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
159
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.5", type: CheckoutComponent, isStandalone: true, selector: "inttegro-checkout", inputs: { appearance: "appearance", features: "features", locale: "locale", orderId: "orderId", purchaseIntentId: "purchaseIntentId", presentation: "presentation", timeout: "timeout", title: "title" }, outputs: { completed: "completed", canceled: "canceled", error: "error", event: "event", ready: "ready" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: '<div #container></div>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
142
160
  }
143
161
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: CheckoutComponent, decorators: [{
144
162
  type: Component,
@@ -155,14 +173,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
155
173
  }], locale: [{
156
174
  type: Input
157
175
  }], orderId: [{
158
- type: Input,
159
- args: [{ required: true }]
176
+ type: Input
177
+ }], purchaseIntentId: [{
178
+ type: Input
179
+ }], presentation: [{
180
+ type: Input
160
181
  }], timeout: [{
161
182
  type: Input
162
183
  }], title: [{
163
184
  type: Input
164
185
  }], completed: [{
165
186
  type: Output
187
+ }], canceled: [{
188
+ type: Output
166
189
  }], error: [{
167
190
  type: Output
168
191
  }], event: [{
@@ -1 +1 @@
1
- {"version":3,"file":"inttegro-angular.mjs","sources":["../../src/lib/checkout.component.ts","../../src/public-api.ts","../../src/inttegro-angular.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n Output,\n ViewChild,\n type AfterViewInit,\n type OnChanges,\n type OnDestroy,\n type SimpleChanges,\n} from '@angular/core'\nimport {\n loadInttegro,\n type CheckoutAppearance,\n type CheckoutController,\n type CheckoutErrorEvent,\n type CheckoutEvent,\n type CheckoutFeatures,\n type CheckoutUpdateOptions,\n} from '@inttegro/js'\n\n/**\n * Standalone Angular component that embeds Inttegro-hosted Checkout.\n *\n * Add the component to a host component's `imports` array. It loads the hosted\n * runtime after its view initializes, creates one controller, and destroys that\n * controller with the Angular view. Changing `features`, `orderId`, `timeout`,\n * or `title` replaces the controller; changing `appearance` or `locale`\n * updates it in place.\n *\n * Keep this component mounted while a payment attempt or confirmation is\n * pending. The successful `completed` output is suitable for navigation, but\n * fulfillment must use server-retrieved Order state or a signed webhook.\n *\n * @example\n * ```ts\n * @Component({\n * standalone: true,\n * imports: [CheckoutComponent],\n * template: `\n * <inttegro-checkout\n * [orderId]=\"orderId\"\n * [appearance]=\"{ theme: 'system' }\"\n * (completed)=\"onCompleted()\"\n * (error)=\"onError($event)\"\n * />\n * `,\n * })\n * export class PaymentPage {\n * orderId = input.required<string>()\n * onCompleted(): void { location.assign('/orders/complete') }\n * onError(error: CheckoutErrorEvent | Error): void {\n * reportCheckoutError(error)\n * }\n * }\n * ```\n *\n * @category Angular\n */\n@Component({\n selector: 'inttegro-checkout',\n standalone: true,\n template: '<div #container></div>',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CheckoutComponent implements AfterViewInit, OnChanges, OnDestroy {\n /** Initial and reactive theme preference for hosted Checkout. */\n @Input() appearance?: CheckoutAppearance\n /** Hosted Checkout content and actions. Changing it replaces the controller. */\n @Input() features?: CheckoutFeatures\n /** Initial and reactive BCP 47 locale preference. */\n @Input() locale?: string\n /** Client-safe reference for the finalized Order being paid. */\n @Input({ required: true }) orderId = ''\n /** Mount timeout from 1,000–60,000 ms; defaults to 15,000 ms. */\n @Input() timeout?: number\n /** Accessible iframe title; defaults to `Checkout`. */\n @Input() title?: string\n\n /** Emitted after Checkout reports its successful terminal state. */\n @Output() readonly completed = new EventEmitter<\n Extract<CheckoutEvent, { type: 'completed' }>\n >()\n /** Emitted for loader/mount failures and sanitized hosted errors. */\n @Output() readonly error = new EventEmitter<CheckoutErrorEvent | Error>()\n /** Emitted for every sanitized hosted Checkout lifecycle event. */\n @Output() readonly event = new EventEmitter<CheckoutEvent>()\n /** Emitted once the iframe is interactive. */\n @Output() readonly ready = new EventEmitter<\n Extract<CheckoutEvent, { type: 'ready' }>\n >()\n\n @ViewChild('container', { static: true })\n private container?: ElementRef<HTMLDivElement>\n\n private checkout: CheckoutController | undefined\n private unsubscribe: (() => void) | undefined\n private viewReady = false\n private generation = 0\n\n ngAfterViewInit(): void {\n this.viewReady = true\n void this.mountCheckout()\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!this.viewReady) return\n\n if (\n changes['features'] ||\n changes['orderId'] ||\n changes['timeout'] ||\n changes['title']\n ) {\n void this.mountCheckout()\n return\n }\n\n if (changes['appearance'] || changes['locale']) {\n this.checkout?.update(\n definedOptions({ appearance: this.appearance, locale: this.locale }),\n )\n }\n }\n\n ngOnDestroy(): void {\n this.destroyCheckout()\n }\n\n /**\n * Moves focus into hosted Checkout when its controller is ready.\n * Before initialization or after teardown this method safely does nothing.\n */\n focus(): void {\n this.checkout?.focus()\n }\n\n /**\n * Applies a new locale or color scheme when a controller exists.\n * Prefer binding `appearance` and `locale` for declarative Angular views.\n */\n update(options: CheckoutUpdateOptions): void {\n this.checkout?.update(options)\n }\n\n private async mountCheckout(): Promise<void> {\n if (!this.container) return\n this.destroyCheckout()\n const generation = this.generation\n const target = this.container.nativeElement\n\n try {\n const inttegro = await loadInttegro()\n if (generation !== this.generation || !inttegro) return\n const checkout = inttegro.createCheckout(\n definedOptions({\n appearance: this.appearance,\n features: this.features,\n locale: this.locale,\n orderId: this.orderId,\n timeout: this.timeout,\n title: this.title,\n }),\n )\n if (generation !== this.generation) {\n checkout.destroy()\n return\n }\n this.checkout = checkout\n this.unsubscribe = checkout.onEvent((event) => {\n this.event.emit(event)\n if (event.type === 'ready') this.ready.emit(event)\n if (event.type === 'completed') this.completed.emit(event)\n if (event.type === 'error') this.error.emit(event)\n })\n await checkout.mount(target)\n } catch (error) {\n if (generation !== this.generation) return\n this.error.emit(\n error instanceof Error ? error : new Error('Checkout failed to load.'),\n )\n }\n }\n\n private destroyCheckout(): void {\n this.generation += 1\n this.unsubscribe?.()\n this.unsubscribe = undefined\n this.checkout?.destroy()\n this.checkout = undefined\n }\n}\n\nfunction definedOptions<Value extends object>(options: Value): Value {\n return Object.fromEntries(\n Object.entries(options).filter(([, value]) => value !== undefined),\n ) as Value\n}\n","/**\n * Angular standalone component adapter for Inttegro-hosted Checkout.\n *\n * @module @inttegro/angular\n */\nexport { CheckoutComponent } from './lib/checkout.component'\nexport type {\n CheckoutAppearance,\n CheckoutErrorEvent,\n CheckoutEvent,\n CheckoutFeatures,\n CheckoutTheme,\n} from '@inttegro/js'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inttegro-angular.mjs","sources":["../../src/lib/checkout.component.ts","../../src/public-api.ts","../../src/inttegro-angular.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n Output,\n ViewChild,\n type AfterViewInit,\n type OnChanges,\n type OnDestroy,\n type SimpleChanges,\n} from '@angular/core'\nimport {\n loadInttegro,\n type CheckoutAppearance,\n type CheckoutController,\n type CheckoutErrorEvent,\n type CheckoutEvent,\n type CheckoutFeatures,\n type CheckoutOptions,\n type CheckoutPresentation,\n type CheckoutUpdateOptions,\n} from '@inttegro/js'\n\n/**\n * Standalone Angular component that embeds Inttegro-hosted Checkout.\n *\n * Add the component to a host component's `imports` array. It loads the hosted\n * runtime after its view initializes, creates one controller, and destroys that\n * controller with the Angular view. Changing `features`, `orderId`,\n * `presentation`, `timeout`, or `title` replaces the controller; changing\n * `appearance` or `locale` updates it in place.\n *\n * Keep this component mounted while a payment attempt or confirmation is\n * pending. The successful `completed` output is suitable for navigation, but\n * fulfillment must use server-retrieved Order state or a signed webhook.\n *\n * @example\n * ```ts\n * @Component({\n * standalone: true,\n * imports: [CheckoutComponent],\n * template: `\n * <inttegro-checkout\n * [orderId]=\"orderId\"\n * presentation=\"modal\"\n * [appearance]=\"{ theme: 'system' }\"\n * (completed)=\"onCompleted()\"\n * (error)=\"onError($event)\"\n * />\n * `,\n * })\n * export class PaymentPage {\n * orderId = input.required<string>()\n * onCompleted(): void { location.assign('/orders/complete') }\n * onError(error: CheckoutErrorEvent | Error): void {\n * reportCheckoutError(error)\n * }\n * }\n * ```\n *\n * @category Angular\n */\n@Component({\n selector: 'inttegro-checkout',\n standalone: true,\n template: '<div #container></div>',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CheckoutComponent implements AfterViewInit, OnChanges, OnDestroy {\n /** Initial and reactive theme preference for hosted Checkout. */\n @Input() appearance?: CheckoutAppearance\n /** Hosted Checkout content and actions. Changing it replaces the controller. */\n @Input() features?: CheckoutFeatures\n /** Initial and reactive BCP 47 locale preference. */\n @Input() locale?: string\n /** Client-safe reference for the finalized Order being paid. */\n @Input() orderId?: string\n /** Client-safe amount-selection Purchase Intent. Mutually exclusive with orderId. */\n @Input() purchaseIntentId?: string\n /** Displays Checkout inline by default or in an Inttegro-managed modal. */\n @Input() presentation: CheckoutPresentation = 'embedded'\n /** Mount timeout from 1,000–60,000 ms; defaults to 15,000 ms. */\n @Input() timeout?: number\n /** Accessible iframe title; defaults to `Checkout`. */\n @Input() title?: string\n\n /** Emitted after Checkout reports its successful terminal state. */\n @Output() readonly completed = new EventEmitter<\n Extract<CheckoutEvent, { type: 'completed' }>\n >()\n /** Emitted when a payer dismisses managed modal Checkout before completion. */\n @Output() readonly canceled = new EventEmitter<\n Extract<CheckoutEvent, { type: 'canceled' }>\n >()\n /** Emitted for loader/mount failures and sanitized hosted errors. */\n @Output() readonly error = new EventEmitter<CheckoutErrorEvent | Error>()\n /** Emitted for every sanitized hosted Checkout lifecycle event. */\n @Output() readonly event = new EventEmitter<CheckoutEvent>()\n /** Emitted once the iframe is interactive. */\n @Output() readonly ready = new EventEmitter<\n Extract<CheckoutEvent, { type: 'ready' }>\n >()\n\n @ViewChild('container', { static: true })\n private container?: ElementRef<HTMLDivElement>\n\n private checkout: CheckoutController | undefined\n private unsubscribe: (() => void) | undefined\n private viewReady = false\n private generation = 0\n\n ngAfterViewInit(): void {\n this.viewReady = true\n void this.mountCheckout()\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!this.viewReady) return\n\n if (\n changes['features'] ||\n changes['orderId'] ||\n changes['purchaseIntentId'] ||\n changes['presentation'] ||\n changes['timeout'] ||\n changes['title']\n ) {\n void this.mountCheckout()\n return\n }\n\n if (changes['appearance'] || changes['locale']) {\n this.checkout?.update(\n definedOptions({ appearance: this.appearance, locale: this.locale }),\n )\n }\n }\n\n ngOnDestroy(): void {\n this.destroyCheckout()\n }\n\n /**\n * Moves focus into hosted Checkout when its controller is ready.\n * Before initialization or after teardown this method safely does nothing.\n */\n focus(): void {\n this.checkout?.focus()\n }\n\n /** Closes managed modal Checkout when it is open. */\n dismiss(): void {\n this.checkout?.dismiss()\n }\n\n /**\n * Applies a new locale or color scheme when a controller exists.\n * Prefer binding `appearance` and `locale` for declarative Angular views.\n */\n update(options: CheckoutUpdateOptions): void {\n this.checkout?.update(options)\n }\n\n private async mountCheckout(): Promise<void> {\n if (!this.container) return\n this.destroyCheckout()\n const generation = this.generation\n const target = this.container.nativeElement\n let canceled = false\n\n try {\n const inttegro = await loadInttegro()\n if (generation !== this.generation || !inttegro) return\n const checkout = inttegro.createCheckout(\n definedOptions({\n appearance: this.appearance,\n features: this.features,\n locale: this.locale,\n orderId: this.orderId,\n purchaseIntentId: this.purchaseIntentId,\n timeout: this.timeout,\n title: this.title,\n }) as CheckoutOptions,\n )\n if (generation !== this.generation) {\n checkout.destroy()\n return\n }\n this.checkout = checkout\n this.unsubscribe = checkout.onEvent((event) => {\n this.event.emit(event)\n if (event.type === 'canceled') {\n canceled = true\n this.canceled.emit(event)\n }\n if (event.type === 'ready') this.ready.emit(event)\n if (event.type === 'completed') this.completed.emit(event)\n if (event.type === 'error') this.error.emit(event)\n })\n if (this.presentation === 'modal') await checkout.present()\n else await checkout.mount(target)\n } catch (error) {\n if (generation !== this.generation || canceled) return\n this.error.emit(\n error instanceof Error ? error : new Error('Checkout failed to load.'),\n )\n }\n }\n\n private destroyCheckout(): void {\n this.generation += 1\n this.unsubscribe?.()\n this.unsubscribe = undefined\n this.checkout?.destroy()\n this.checkout = undefined\n }\n}\n\nfunction definedOptions<Value extends object>(options: Value): Value {\n return Object.fromEntries(\n Object.entries(options).filter(([, value]) => value !== undefined),\n ) as Value\n}\n","/**\n * Angular standalone component adapter for Inttegro-hosted Checkout.\n *\n * @module @inttegro/angular\n */\nexport { CheckoutComponent } from './lib/checkout.component'\nexport type {\n CheckoutAppearance,\n CheckoutErrorEvent,\n CheckoutEvent,\n CheckoutFeatures,\n CheckoutPresentation,\n CheckoutTheme,\n} from '@inttegro/js'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@inttegro/angular",
3
- "version": "0.2.0",
3
+ "version": "0.4.0",
4
4
  "description": "Angular components for Inttegro hosted workflows",
5
5
  "type": "module",
6
6
  "engines": {
7
7
  "node": ">=18"
8
8
  },
9
9
  "dependencies": {
10
- "@inttegro/js": "0.2.0",
10
+ "@inttegro/js": "0.4.0",
11
11
  "tslib": "^2.8.1"
12
12
  },
13
13
  "peerDependencies": {
@@ -16,7 +16,7 @@
16
16
  },
17
17
  "repository": {
18
18
  "type": "git",
19
- "url": "git+https://github.com/zebodotdev/js.git",
19
+ "url": "git+https://github.com/inttegro/js.git",
20
20
  "directory": "packages/angular"
21
21
  },
22
22
  "homepage": "https://studio.inttegro.com/web/angular",
@@ -1,6 +1,6 @@
1
1
  import * as _inttegro_js from '@inttegro/js';
2
- import { CheckoutAppearance, CheckoutFeatures, CheckoutErrorEvent, CheckoutEvent, CheckoutUpdateOptions } from '@inttegro/js';
3
- export { CheckoutAppearance, CheckoutErrorEvent, CheckoutEvent, CheckoutFeatures, CheckoutTheme } from '@inttegro/js';
2
+ import { CheckoutAppearance, CheckoutFeatures, CheckoutPresentation, CheckoutErrorEvent, CheckoutEvent, CheckoutUpdateOptions } from '@inttegro/js';
3
+ export { CheckoutAppearance, CheckoutErrorEvent, CheckoutEvent, CheckoutFeatures, CheckoutPresentation, CheckoutTheme } from '@inttegro/js';
4
4
  import * as i0 from '@angular/core';
5
5
  import { AfterViewInit, OnChanges, OnDestroy, EventEmitter, SimpleChanges } from '@angular/core';
6
6
 
@@ -9,9 +9,9 @@ import { AfterViewInit, OnChanges, OnDestroy, EventEmitter, SimpleChanges } from
9
9
  *
10
10
  * Add the component to a host component's `imports` array. It loads the hosted
11
11
  * runtime after its view initializes, creates one controller, and destroys that
12
- * controller with the Angular view. Changing `features`, `orderId`, `timeout`,
13
- * or `title` replaces the controller; changing `appearance` or `locale`
14
- * updates it in place.
12
+ * controller with the Angular view. Changing `features`, `orderId`,
13
+ * `presentation`, `timeout`, or `title` replaces the controller; changing
14
+ * `appearance` or `locale` updates it in place.
15
15
  *
16
16
  * Keep this component mounted while a payment attempt or confirmation is
17
17
  * pending. The successful `completed` output is suitable for navigation, but
@@ -25,6 +25,7 @@ import { AfterViewInit, OnChanges, OnDestroy, EventEmitter, SimpleChanges } from
25
25
  * template: `
26
26
  * <inttegro-checkout
27
27
  * [orderId]="orderId"
28
+ * presentation="modal"
28
29
  * [appearance]="{ theme: 'system' }"
29
30
  * (completed)="onCompleted()"
30
31
  * (error)="onError($event)"
@@ -50,13 +51,19 @@ declare class CheckoutComponent implements AfterViewInit, OnChanges, OnDestroy {
50
51
  /** Initial and reactive BCP 47 locale preference. */
51
52
  locale?: string;
52
53
  /** Client-safe reference for the finalized Order being paid. */
53
- orderId: string;
54
+ orderId?: string;
55
+ /** Client-safe amount-selection Purchase Intent. Mutually exclusive with orderId. */
56
+ purchaseIntentId?: string;
57
+ /** Displays Checkout inline by default or in an Inttegro-managed modal. */
58
+ presentation: CheckoutPresentation;
54
59
  /** Mount timeout from 1,000–60,000 ms; defaults to 15,000 ms. */
55
60
  timeout?: number;
56
61
  /** Accessible iframe title; defaults to `Checkout`. */
57
62
  title?: string;
58
63
  /** Emitted after Checkout reports its successful terminal state. */
59
64
  readonly completed: EventEmitter<_inttegro_js.CheckoutCompletedEvent>;
65
+ /** Emitted when a payer dismisses managed modal Checkout before completion. */
66
+ readonly canceled: EventEmitter<_inttegro_js.CheckoutCanceledEvent>;
60
67
  /** Emitted for loader/mount failures and sanitized hosted errors. */
61
68
  readonly error: EventEmitter<CheckoutErrorEvent | Error>;
62
69
  /** Emitted for every sanitized hosted Checkout lifecycle event. */
@@ -76,6 +83,8 @@ declare class CheckoutComponent implements AfterViewInit, OnChanges, OnDestroy {
76
83
  * Before initialization or after teardown this method safely does nothing.
77
84
  */
78
85
  focus(): void;
86
+ /** Closes managed modal Checkout when it is open. */
87
+ dismiss(): void;
79
88
  /**
80
89
  * Applies a new locale or color scheme when a controller exists.
81
90
  * Prefer binding `appearance` and `locale` for declarative Angular views.
@@ -84,7 +93,7 @@ declare class CheckoutComponent implements AfterViewInit, OnChanges, OnDestroy {
84
93
  private mountCheckout;
85
94
  private destroyCheckout;
86
95
  static ɵfac: i0.ɵɵFactoryDeclaration<CheckoutComponent, never>;
87
- static ɵcmp: i0.ɵɵComponentDeclaration<CheckoutComponent, "inttegro-checkout", never, { "appearance": { "alias": "appearance"; "required": false; }; "features": { "alias": "features"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "orderId": { "alias": "orderId"; "required": true; }; "timeout": { "alias": "timeout"; "required": false; }; "title": { "alias": "title"; "required": false; }; }, { "completed": "completed"; "error": "error"; "event": "event"; "ready": "ready"; }, never, never, true, never>;
96
+ static ɵcmp: i0.ɵɵComponentDeclaration<CheckoutComponent, "inttegro-checkout", never, { "appearance": { "alias": "appearance"; "required": false; }; "features": { "alias": "features"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "orderId": { "alias": "orderId"; "required": false; }; "purchaseIntentId": { "alias": "purchaseIntentId"; "required": false; }; "presentation": { "alias": "presentation"; "required": false; }; "timeout": { "alias": "timeout"; "required": false; }; "title": { "alias": "title"; "required": false; }; }, { "completed": "completed"; "canceled": "canceled"; "error": "error"; "event": "event"; "ready": "ready"; }, never, never, true, never>;
88
97
  }
89
98
 
90
99
  export { CheckoutComponent };
@@ -1 +1 @@
1
- {"version":3,"file":"inttegro-angular.d.ts","sources":["../../src/lib/checkout.component.ts"],"mappings":";;;;;;AAuBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCG;AACH,cAMa,iBAAkB,YAAW,aAAa,EAAE,SAAS,EAAE,SAAS;;iBAErD,kBAAkB;;eAEpB,gBAAgB;;;;AAIT;;;;;;wBAOC,YAAA,CAAA,YAAA,CAAA,sBAAA;;oBAIJ,YAAA,CAAA,kBAAA,GAAA,KAAA;;oBAEA,YAAA,CAAA,aAAA;;oBAEA,YAAA,CAAA,YAAA,CAAA,kBAAA;;;;;;AAYxB;AAKA,yBAAqB,aAAa;AAoBlC;AAIA;;;AAGG;AACH;AAIA;;;AAGG;AACH,oBAAgB,qBAAqB;;AA2CrC;yCAvHW,iBAAiB;2CAAjB,iBAAiB;AA8H7B;;","names":[]}
1
+ {"version":3,"file":"inttegro-angular.d.ts","sources":["../../src/lib/checkout.component.ts"],"mappings":";;;;;;AAyBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCG;AACH,cAMa,iBAAkB,YAAW,aAAa,EAAE,SAAS,EAAE,SAAS;;iBAErD,kBAAkB;;eAEpB,gBAAgB;;;;;;;;kBAQb,oBAAoB;;;;;;wBAOf,YAAA,CAAA,YAAA,CAAA,sBAAA;;uBAID,YAAA,CAAA,YAAA,CAAA,qBAAA;;oBAIH,YAAA,CAAA,kBAAA,GAAA,KAAA;;oBAEA,YAAA,CAAA,aAAA;;oBAEA,YAAA,CAAA,YAAA,CAAA,kBAAA;;;;;;AAYxB;AAKA,yBAAqB,aAAa;AAsBlC;AAIA;;;AAGG;AACH;;AAKA;AAIA;;;AAGG;AACH,oBAAgB,qBAAqB;;AAkDrC;yCA7IW,iBAAiB;2CAAjB,iBAAiB;AAoJ7B;;","names":[]}