Skip to content

Commit 16b2dfe

Browse files
authored
feat(types): add v6 types for paypal-guest-payments (#727)
* switch to interfaces for errors/warnings
1 parent 22029d4 commit 16b2dfe

File tree

6 files changed

+146
-3
lines changed

6 files changed

+146
-3
lines changed

.changeset/breezy-fishes-act.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@paypal/paypal-js": minor
3+
---
4+
5+
Add new types for paypal-guest-payments component

packages/paypal-js/types/v6/components/base-component.d.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,19 @@ export type OnCompleteData = {
1515
paymentSessionState: "approved" | "canceled" | "error";
1616
};
1717

18-
export type OnErrorData = Error;
18+
export interface PayPalError extends Error {
19+
code: string;
20+
name: string;
21+
isRecoverable: boolean;
22+
}
23+
24+
export interface PayPalWarning {
25+
code: string;
26+
message: string;
27+
name: string;
28+
}
29+
30+
export type OnErrorData = PayPalError;
1931

2032
/**
2133
* use Omit\<BasePaymentSessionOptions, "onApprove"\> to change the arguments for onApprove()

packages/paypal-js/types/v6/components/find-eligible-methods.d.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@ export type EligiblePaymentMethods =
88
| "paypal_pay_later"
99
| "paypal_credit"
1010
| "paypal"
11-
| "venmo";
11+
| "venmo"
12+
| "basic_cards";
1213

1314
export type FindEligibleMethodsOptions = {
1415
currencyCode?: string;
1516
};
1617

17-
export type FundingSource = "credit" | "paylater" | "paypal" | "venmo";
18+
export type FundingSource = "credit" | "paylater" | "paypal" | "venmo" | "card";
1819

1920
type BaseEligiblePaymentMethodDetails = {
2021
canBeVaulted: boolean;
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import {
2+
BasePaymentSessionOptions,
3+
BasePaymentSession,
4+
OnApproveDataOneTimePayments,
5+
PayPalWarning,
6+
PresentationModeOptionsForAuto,
7+
} from "./base-component";
8+
9+
export type PayPalGuestOneTimePaymentSessionOptions =
10+
BasePaymentSessionOptions & {
11+
orderId?: string;
12+
onApprove: (data: OnApproveDataOneTimePayments) => Promise<void>;
13+
onWarn?: (data: PayPalWarning) => void;
14+
};
15+
16+
export type PayPalGuestPresentationModeOptions =
17+
PresentationModeOptionsForAuto & {
18+
targetElement?: string | EventTarget;
19+
};
20+
21+
export type PayPalGuestOneTimePaymentSessionPromise = Promise<{
22+
orderId: string;
23+
}>;
24+
25+
export type PayPalGuestOneTimePaymentSession = Omit<
26+
BasePaymentSession,
27+
"start"
28+
> & {
29+
start: (
30+
presentationModeOptions: PayPalGuestPresentationModeOptions,
31+
paymentSessionPromise?: PayPalGuestOneTimePaymentSessionPromise,
32+
) => Promise<void>;
33+
};
34+
35+
/**
36+
* Interface for managing PayPal guest payment operations within the PayPal SDK.
37+
*
38+
* @remarks
39+
* This interface provides methods for creating and managing PayPal guest payment sessions,
40+
* allowing merchants to integrate the basic credit or debit button as a payment method in their applications.
41+
*
42+
* The {@link PayPalGuestPaymentsInstance} enables seamless integration with PayPal's guest payment flow,
43+
* providing a secure and user-friendly way to process payments through the PayPal platform.
44+
*/
45+
export interface PayPalGuestPaymentsInstance {
46+
createPayPalGuestOneTimePaymentSession: (
47+
paymentSessionOptions: PayPalGuestOneTimePaymentSessionOptions,
48+
) => PayPalGuestOneTimePaymentSession;
49+
}

packages/paypal-js/types/v6/index.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { PayPalPaymentsInstance } from "./components/paypal-payments";
2+
import { PayPalGuestPaymentsInstance } from "./components/paypal-guest-payments";
23
import { PayPalLegacyBillingInstance } from "./components/paypal-legacy-billing-agreements";
34
import { VenmoPaymentsInstance } from "./components/venmo-payments";
45
import {
@@ -35,6 +36,7 @@ export interface PayPalV6Namespace {
3536

3637
export type Components =
3738
| "paypal-payments"
39+
| "paypal-guest-payments"
3840
| "venmo-payments"
3941
| "paypal-legacy-billing-agreements";
4042

@@ -122,6 +124,9 @@ export type SdkInstance<T extends readonly [Components, ...Components[]]> =
122124
("paypal-payments" extends T[number]
123125
? PayPalPaymentsInstance
124126
: unknown) &
127+
("paypal-guest-payments" extends T[number]
128+
? PayPalGuestPaymentsInstance
129+
: unknown) &
125130
("venmo-payments" extends T[number] ? VenmoPaymentsInstance : unknown) &
126131
("paypal-legacy-billing-agreements" extends T[number]
127132
? PayPalLegacyBillingInstance
@@ -187,6 +192,7 @@ export function loadCoreSdkScript(
187192

188193
// Components
189194
export * from "./components/paypal-payments";
195+
export * from "./components/paypal-guest-payments";
190196
export * from "./components/paypal-legacy-billing-agreements";
191197
export * from "./components/venmo-payments";
192198
export * from "./components/find-eligible-methods";
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import { loadCoreSdkScript } from "../../../src/v6";
2+
import type { OnApproveDataOneTimePayments, PayPalV6Namespace } from "../index";
3+
4+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
5+
async function main() {
6+
let paypal: PayPalV6Namespace | null;
7+
8+
try {
9+
paypal = await loadCoreSdkScript({
10+
environment: "sandbox",
11+
debug: true,
12+
});
13+
} catch (err) {
14+
throw new Error(`Failed to load the paypal sdk script: ${err}`);
15+
}
16+
17+
if (!paypal?.createInstance) {
18+
throw new Error("Invalid paypal object for v6");
19+
}
20+
21+
if (!paypal?.version) {
22+
throw new Error("PayPal v6 namespace missing version property");
23+
}
24+
25+
const sdkInstance = await paypal.createInstance({
26+
clientToken: "fakeValue",
27+
components: ["paypal-guest-payments"],
28+
});
29+
30+
const paymentMethods = await sdkInstance.findEligibleMethods({
31+
currencyCode: "USD",
32+
});
33+
34+
if (!paymentMethods.isEligible("card")) {
35+
return;
36+
}
37+
38+
function onApproveCallback({
39+
orderId,
40+
payerId,
41+
}: OnApproveDataOneTimePayments) {
42+
console.log({
43+
orderId,
44+
payerId,
45+
});
46+
return Promise.resolve();
47+
}
48+
49+
const paypalGuestPaymentSession =
50+
sdkInstance.createPayPalGuestOneTimePaymentSession({
51+
onApprove: onApproveCallback,
52+
});
53+
54+
const createOrder = () => Promise.resolve({ orderId: "ABC123" });
55+
56+
const paypalBasicCardButton = document.querySelector(
57+
"paypal-basic-card-button",
58+
);
59+
60+
paypalBasicCardButton?.addEventListener("click", async () => {
61+
try {
62+
await paypalGuestPaymentSession.start(
63+
{ presentationMode: "auto" },
64+
createOrder(),
65+
);
66+
} catch (error) {
67+
console.error(error);
68+
}
69+
});
70+
}

0 commit comments

Comments
 (0)