@amos.com/react-amos-js 0.11.14 → 0.11.17
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 +8 -8
- package/dist/index.d.ts +18 -3
- package/package.json +2 -2
- package/src/index.tsx +18 -3
package/README.md
CHANGED
|
@@ -43,8 +43,8 @@ The following flow is for credit card and bank account payment method types only
|
|
|
43
43
|
3. **User clicks "Pay now" or presses Enter in the iframe**: call `validateForm({ iframeRef })`, which returns `Promise<true>` if the embedded form is valid and `Promise<false>` otherwise.
|
|
44
44
|
4. **Create payment intent on your server**: use your server-side Amos client to call `POST /payment_intents`. You may also associate this payment intent with a new or existing customer via `POST /customers`. This must be server-side because it uses your private API key.
|
|
45
45
|
5. **Return the payment intent token to the browser**: your backend responds with the embed token (`components["schemas"]["EmbedToken"]`) needed for confirmation.
|
|
46
|
-
6. **Confirm the payment intent from the client**: `await confirmPayment({ iframeRef, token })`. It resolves `{ status: "succeeded", paymentIntent }` or `{ status: "failed",
|
|
47
|
-
7. **Handle UX**: show the user a "processing" state while awaiting `confirmPayment`. Do not treat `{ status: "succeeded" }` as settlement proof — verify payment success on your backend via webhooks. Recoverable field errors stay in the iframe;
|
|
46
|
+
6. **Confirm the payment intent from the client**: `await confirmPayment({ iframeRef, token })`. It resolves `{ status: "succeeded", paymentIntent }`, `{ status: "failed", paymentIntent? }` on decline, or `{ status: "failed", error: "timeout" }` if the iframe does not respond within 15 seconds (`isConfirmTimeout(result)`).
|
|
47
|
+
7. **Handle UX**: show the user a "processing" state while awaiting `confirmPayment`. Do not treat `{ status: "succeeded" }` as settlement proof — verify payment success on your backend via webhooks. Recoverable field errors stay in the iframe; a processor decline still resolves `{ status: "failed" }` (with `paymentIntent` when the confirm API returned a body — inspect `paymentIntent.state`). A timeout is **not** a decline — the charge may still settle; do not retry as a new payment.
|
|
48
48
|
|
|
49
49
|
### Google Pay & Apple Pay
|
|
50
50
|
|
|
@@ -508,7 +508,7 @@ Validates the embedded card/bank iframe form before payment confirmation.
|
|
|
508
508
|
|
|
509
509
|
### `confirmPayment({ iframeRef, token, defaultValues? })`
|
|
510
510
|
|
|
511
|
-
Confirms a payment intent in the embedded iframe flow. Resolves `{ status: "succeeded", paymentIntent }` or `{ status: "failed",
|
|
511
|
+
Confirms a payment intent in the embedded iframe flow. Resolves `{ status: "succeeded", paymentIntent }`, `{ status: "failed", paymentIntent? }` on decline, or `{ status: "failed", error: "timeout" }` if the iframe does not respond within 15 seconds (`CONFIRM_TIMEOUT_MS`). Optional `defaultValues` are applied immediately before building the payment method (including hidden name and extra billing fields) and do not replace the last `defaultValues` prop used by `resetForm`.
|
|
512
512
|
|
|
513
513
|
**Parameters:**
|
|
514
514
|
|
|
@@ -516,11 +516,11 @@ Confirms a payment intent in the embedded iframe flow. Resolves `{ status: "succ
|
|
|
516
516
|
- `token` (typed as `Pick<components["schemas"]["EmbedToken"], "token">` — the embed JWT string returned by your server)
|
|
517
517
|
- `defaultValues` (`PaymentMethodFormDefaultValues`, optional)
|
|
518
518
|
|
|
519
|
-
**Returns:** `Promise<ConfirmPaymentResult>`
|
|
519
|
+
**Returns:** `Promise<ConfirmPaymentResult>` — use `isConfirmTimeout(result)` to treat a timeout as uncertain (do not retry). Embed aborts hung `/confirm` at 10s and posts the same timeout result; the SDK wait is strictly above that.
|
|
520
520
|
|
|
521
521
|
### `confirmSetup({ iframeRef, token, defaultValues? })`
|
|
522
522
|
|
|
523
|
-
Confirms a setup intent in the embedded iframe flow. Use this when saving a payment method for future use. Optional `defaultValues` behave the same as on `confirmPayment`.
|
|
523
|
+
Confirms a setup intent in the embedded iframe flow. Use this when saving a payment method for future use. Optional `defaultValues` behave the same as on `confirmPayment`. Same 15-second timeout window and `isConfirmTimeout` rule as `confirmPayment`.
|
|
524
524
|
|
|
525
525
|
**Parameters:**
|
|
526
526
|
|
|
@@ -580,7 +580,7 @@ Enter in a card or bank iframe field submits the enclosing host `<form>` via `re
|
|
|
580
580
|
|
|
581
581
|
Renders the secure bank account iframe form. A field-shaped skeleton is shown immediately (sized from `appearance`, including resting `.Input` / `.Label` rules) and replaced by the iframe once appearance is applied.
|
|
582
582
|
|
|
583
|
-
When `requireAchVerification` is true (or `intent` is `"setup"`), and the render token allows verification, the SDK hides the routing/account iframe and mounts [Plaid Embedded Institution Search](https://plaid.com/docs/link/embedded-institution-search/) in the parent. Hosts do not proxy Pay API (`GET /merchants`, `POST /plaid_link_tokens`); embed does that with `PAY_API_KEY`. Do not put Plaid secrets in the browser.
|
|
583
|
+
When `requireAchVerification` is true (or `intent` is `"setup"`), and the render token allows verification, the SDK hides the routing/account iframe and mounts [Plaid Embedded Institution Search](https://plaid.com/docs/link/embedded-institution-search/) in the parent. A **350px pulse skeleton** covers that slot until Plaid's `onLoad` (1.5s fallback). Do not overlay a host loader. Hosts do not proxy Pay API (`GET /merchants`, `POST /plaid_link_tokens`); embed does that with `PAY_API_KEY`. Do not put Plaid secrets in the browser.
|
|
584
584
|
|
|
585
585
|
**Required props:** same as `AmosCreditCardPaymentMethodForm` — `renderToken`.
|
|
586
586
|
|
|
@@ -695,12 +695,12 @@ Re-export from `@amos.com/amos-js`. Fills omitted Inter `fonts` / `--font-family
|
|
|
695
695
|
## Notes and potential gotchas
|
|
696
696
|
|
|
697
697
|
- **`ref` / `iframeRef`**: for card and bank forms, pass `ref={iframeRef}` to the form component. The same `iframeRef` must be used when calling `validateForm`, `confirmPayment`, `confirmSetup`, `resetForm`, or `focusField`. The component forwards the ref to the inner iframe.
|
|
698
|
-
- **`confirmPayment` / `confirmSetup` are not settlement proof**: `{ status: "succeeded" }` means authorization succeeded (capture may still finish asynchronously). Verify payment or setup success on your backend via webhooks. Recoverable field errors stay in the iframe;
|
|
698
|
+
- **`confirmPayment` / `confirmSetup` are not settlement proof**: `{ status: "succeeded" }` means authorization succeeded (capture may still finish asynchronously). Verify payment or setup success on your backend via webhooks. Recoverable field errors stay in the iframe; a processor decline still resolves `{ status: "failed" }`. Declined confirms include the intent so you can read `state` without a follow-up GET. If the iframe never answers, the Promise resolves `{ status: "failed", error: "timeout" }` after 15 seconds (`CONFIRM_TIMEOUT_MS`, `isConfirmTimeout`) — that is uncertain, not a decline; do not retry as a new payment.
|
|
699
699
|
- **Same components for payment vs setup intents**: `AmosCreditCardPaymentMethodForm` and `AmosBankAccountPaymentMethodForm` support both payment intents and setup intents. The flow differs only by which server call you make and which confirmation function you use (`confirmPayment` vs `confirmSetup`).
|
|
700
700
|
- **Amount format**: for `AmosGooglePayButton` and `AmosApplePayButton`, `amount` is a major-currency decimal string (e.g. `"50.00"` for $50.00). For `components["schemas"]["CreatePaymentIntentInput"]` on the server (card/bank create, and the object the wallet iframe sends to `onConfirm`), `amount` is a number in cents (e.g. `5000`).
|
|
701
701
|
- **Embed host / CSP**: iframes load from `https://js.amos.com` (production) and `https://js-sandbox.amos.com` (sandbox) via `getEmbedOrigin`. Parent pages that pin CSP must allow `frame-src https://js.amos.com https://js-sandbox.amos.com` (and `Permissions-Policy payment=` for those origins) **before** upgrading this package. Older SDK versions still load `embed.amos.com` / `embed-sandbox.amos.com`.
|
|
702
702
|
- **Iframe handshake**: iframe URLs include canonical search params so the embed does not 307. If the document loads but never posts `IFRAME_READY`, the SDK rewrites `src` once with `amosReload`. Appearance is applied after handshake; the iframe stays hidden until `UPDATED_APPEARANCE`, or for 1.5s after `IFRAME_READY` if appearance never acks.
|
|
703
|
-
- **Plaid Embedded Link (ACH verification)**: load `cdn.plaid.com` from the **parent** document (see CSP on `AmosBankAccountPaymentMethodForm`). Merchants do not proxy Pay API; the bank iframe mints link tokens. Pass `requireAchVerification` when the host wants Plaid, or `intent="setup"` to always show it, unless the render token disables verification. Confirm still goes through the bank iframe so Amos can attach `plaid` to the payment method.
|
|
703
|
+
- **Plaid Embedded Link (ACH verification)**: load `cdn.plaid.com` from the **parent** document (see CSP on `AmosBankAccountPaymentMethodForm`). Merchants do not proxy Pay API; the bank iframe mints link tokens. Pass `requireAchVerification` when the host wants Plaid, or `intent="setup"` to always show it, unless the render token disables verification. Confirm still goes through the bank iframe so Amos can attach `plaid` to the payment method. While Link loads, the SDK shows a 350px pulse skeleton until `onLoad` (1.5s fallback) — do not overlay a host loader.
|
|
704
704
|
- **Apple Pay waiting overlay**: on browsers where Apple's QR handoff opens in a popup (non-Safari), `AmosApplePayButton` shows a fixed full-viewport overlay on the host page. **Cancel payment** is available until the buyer authorizes; after that the overlay shows **Completing your payment…** with no Cancel, then hides when `onConfirm` settles. Avoid stacking other fixed UI above it.
|
|
705
705
|
- **Going framework-free**: if you need to use Amos outside of React (vanilla JS, another framework, etc.), use [`@amos.com/amos-js`](../amos-js) directly.
|
|
706
706
|
|
package/dist/index.d.ts
CHANGED
|
@@ -19,6 +19,14 @@ export declare function validateForm({ iframeRef, }: {
|
|
|
19
19
|
*
|
|
20
20
|
* Pass the embed JWT (`token`) returned by your server's
|
|
21
21
|
* `POST /payment_intents` call.
|
|
22
|
+
*
|
|
23
|
+
* Resolves `{ status: "succeeded", paymentIntent }` after authorization,
|
|
24
|
+
* `{ status: "failed", paymentIntent? }` on decline, or
|
|
25
|
+
* `{ status: "failed", error: "timeout" }` if the iframe does not post
|
|
26
|
+
* `CONFIRMATION_RESULT` within 15 seconds (`CONFIRM_TIMEOUT_MS`). Use
|
|
27
|
+
* `isConfirmTimeout(result)` — a timeout is not a decline; the charge
|
|
28
|
+
* may still settle. Embed `/confirm` aborts at 10s and posts the same
|
|
29
|
+
* timeout result.
|
|
22
30
|
*/
|
|
23
31
|
export declare function confirmPayment({ iframeRef, token, defaultValues, }: {
|
|
24
32
|
iframeRef: IframeRef;
|
|
@@ -30,6 +38,12 @@ export declare function confirmPayment({ iframeRef, token, defaultValues, }: {
|
|
|
30
38
|
*
|
|
31
39
|
* Pass the embed JWT (`token`) returned by your server's
|
|
32
40
|
* `POST /setup_intents` call.
|
|
41
|
+
*
|
|
42
|
+
* Resolves `{ status: "succeeded", setupIntent }` after verification,
|
|
43
|
+
* `{ status: "failed", setupIntent? }` on decline, or
|
|
44
|
+
* `{ status: "failed", error: "timeout" }` if the iframe does not
|
|
45
|
+
* respond within 15 seconds. Same `isConfirmTimeout` rule as
|
|
46
|
+
* {@link confirmPayment}.
|
|
33
47
|
*/
|
|
34
48
|
export declare function confirmSetup({ iframeRef, token, defaultValues, }: {
|
|
35
49
|
iframeRef: IframeRef;
|
|
@@ -117,9 +131,10 @@ type AmosBankAccountPaymentMethodFormProps = IframePassthroughProps & {
|
|
|
117
131
|
defaultValues?: PaymentMethodFormDefaultValues;
|
|
118
132
|
/**
|
|
119
133
|
* When true, hide the routing/account iframe and mount Plaid Embedded
|
|
120
|
-
* Institution Search in the parent.
|
|
121
|
-
*
|
|
122
|
-
*
|
|
134
|
+
* Institution Search in the parent. A 350px pulse skeleton covers the
|
|
135
|
+
* slot until Plaid's `onLoad` (1.5s fallback). Ignored when `intent`
|
|
136
|
+
* is `"setup"` (setup always shows Plaid) or when the render token
|
|
137
|
+
* disables verification.
|
|
123
138
|
*
|
|
124
139
|
* @default false
|
|
125
140
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amos.com/react-amos-js",
|
|
3
|
-
"version": "0.11.
|
|
3
|
+
"version": "0.11.17",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"vite-plugin-dts": "5.0.3"
|
|
58
58
|
},
|
|
59
59
|
"dependencies": {
|
|
60
|
-
"@amos.com/amos-js": "0.11.
|
|
60
|
+
"@amos.com/amos-js": "0.11.17",
|
|
61
61
|
"@types/googlepay": "0.7.12"
|
|
62
62
|
},
|
|
63
63
|
"peerDependencies": {
|
package/src/index.tsx
CHANGED
|
@@ -63,6 +63,14 @@ export function validateForm({
|
|
|
63
63
|
*
|
|
64
64
|
* Pass the embed JWT (`token`) returned by your server's
|
|
65
65
|
* `POST /payment_intents` call.
|
|
66
|
+
*
|
|
67
|
+
* Resolves `{ status: "succeeded", paymentIntent }` after authorization,
|
|
68
|
+
* `{ status: "failed", paymentIntent? }` on decline, or
|
|
69
|
+
* `{ status: "failed", error: "timeout" }` if the iframe does not post
|
|
70
|
+
* `CONFIRMATION_RESULT` within 15 seconds (`CONFIRM_TIMEOUT_MS`). Use
|
|
71
|
+
* `isConfirmTimeout(result)` — a timeout is not a decline; the charge
|
|
72
|
+
* may still settle. Embed `/confirm` aborts at 10s and posts the same
|
|
73
|
+
* timeout result.
|
|
66
74
|
*/
|
|
67
75
|
export function confirmPayment({
|
|
68
76
|
iframeRef,
|
|
@@ -88,6 +96,12 @@ export function confirmPayment({
|
|
|
88
96
|
*
|
|
89
97
|
* Pass the embed JWT (`token`) returned by your server's
|
|
90
98
|
* `POST /setup_intents` call.
|
|
99
|
+
*
|
|
100
|
+
* Resolves `{ status: "succeeded", setupIntent }` after verification,
|
|
101
|
+
* `{ status: "failed", setupIntent? }` on decline, or
|
|
102
|
+
* `{ status: "failed", error: "timeout" }` if the iframe does not
|
|
103
|
+
* respond within 15 seconds. Same `isConfirmTimeout` rule as
|
|
104
|
+
* {@link confirmPayment}.
|
|
91
105
|
*/
|
|
92
106
|
export function confirmSetup({
|
|
93
107
|
iframeRef,
|
|
@@ -397,9 +411,10 @@ type AmosBankAccountPaymentMethodFormProps = IframePassthroughProps & {
|
|
|
397
411
|
defaultValues?: PaymentMethodFormDefaultValues;
|
|
398
412
|
/**
|
|
399
413
|
* When true, hide the routing/account iframe and mount Plaid Embedded
|
|
400
|
-
* Institution Search in the parent.
|
|
401
|
-
*
|
|
402
|
-
*
|
|
414
|
+
* Institution Search in the parent. A 350px pulse skeleton covers the
|
|
415
|
+
* slot until Plaid's `onLoad` (1.5s fallback). Ignored when `intent`
|
|
416
|
+
* is `"setup"` (setup always shows Plaid) or when the render token
|
|
417
|
+
* disables verification.
|
|
403
418
|
*
|
|
404
419
|
* @default false
|
|
405
420
|
*/
|