) => void;
+}
+
const Field = ({
label,
id,
@@ -48,7 +71,7 @@ const Field = ({
autoComplete,
value,
onChange,
-}) => (
+}: FieldProps) => (
);
-const SubmitButton = ({processing, error, children, disabled}) => (
+interface SubmitButtonProps {
+ processing: boolean;
+ error: StripeError | null | undefined;
+ children: ReactNode;
+ disabled: boolean;
+}
+
+const SubmitButton = ({
+ processing,
+ error,
+ children,
+ disabled,
+}: SubmitButtonProps) => (
);
-const ErrorMessage = ({children}) => (
+interface ErrorMessageProps {
+ children: ReactNode;
+}
+
+const ErrorMessage = ({children}: ErrorMessageProps) => (
);
-const ResetButton = ({onClick}) => (
+interface ResetButtonProps {
+ onClick: () => void;
+}
+
+const ResetButton = ({onClick}: ResetButtonProps) => (
);
-const DEFAULT_STATE = {
+interface CheckoutFormProps {
+ stripe: Stripe | null;
+ elements: StripeElements | null;
+}
+
+interface CheckoutFormState {
+ error: StripeError | null | undefined;
+ cardComplete: boolean;
+ processing: boolean;
+ paymentMethod: PaymentMethod | null;
+ email: string;
+ phone: string;
+ name: string;
+}
+
+const DEFAULT_STATE: CheckoutFormState = {
error: null,
cardComplete: false,
processing: false,
@@ -113,13 +171,13 @@ const DEFAULT_STATE = {
name: '',
};
-class CheckoutForm extends React.Component {
- constructor(props) {
+class CheckoutForm extends Component {
+ constructor(props: CheckoutFormProps) {
super(props);
this.state = DEFAULT_STATE;
}
- handleSubmit = async (event) => {
+ handleSubmit: FormEventHandler = async (event) => {
event.preventDefault();
const {stripe, elements} = this.props;
diff --git a/examples/class-components/2-Split-Card.stories.tsx b/examples/class-components/2-Split-Card.stories.tsx
new file mode 100644
index 00000000..d2a43757
--- /dev/null
+++ b/examples/class-components/2-Split-Card.stories.tsx
@@ -0,0 +1,16 @@
+import type {Meta, StoryObj} from '@storybook/react';
+
+import {defaultParameter} from '../../.storybook/constants';
+import SplitCard from './2-Split-Card';
+
+const meta: Meta = {
+ title: 'react-stripe-js/Class Components/Split Card',
+ component: SplitCard,
+ parameters: defaultParameter,
+};
+
+export default meta;
+
+type Story = StoryObj;
+
+export const Default: Story = {};
diff --git a/examples/class-components/2-Split-Card.js b/examples/class-components/2-Split-Card.tsx
similarity index 87%
rename from examples/class-components/2-Split-Card.js
rename to examples/class-components/2-Split-Card.tsx
index 29a84b77..4b455898 100644
--- a/examples/class-components/2-Split-Card.js
+++ b/examples/class-components/2-Split-Card.tsx
@@ -2,8 +2,14 @@
// Learn how to accept a payment using the official Stripe docs.
// https://stripe.com/docs/payments/accept-a-payment#web
-import React from 'react';
-import {loadStripe} from '@stripe/stripe-js';
+import type {FormEventHandler} from 'react';
+import {Component} from 'react';
+import {
+ loadStripe,
+ Stripe,
+ StripeElements,
+ PaymentMethod,
+} from '@stripe/stripe-js';
import {
CardNumberElement,
CardCvcElement,
@@ -31,8 +37,20 @@ const ELEMENT_OPTIONS = {
},
};
-class CheckoutForm extends React.Component {
- constructor(props) {
+interface CheckoutFormProps {
+ stripe: Stripe | null;
+ elements: StripeElements | null;
+}
+
+interface CheckoutFormState {
+ name: string;
+ postal: string;
+ errorMessage: string | null | undefined;
+ paymentMethod: PaymentMethod | null;
+}
+
+class CheckoutForm extends Component {
+ constructor(props: CheckoutFormProps) {
super(props);
this.state = {
name: '',
@@ -42,7 +60,7 @@ class CheckoutForm extends React.Component {
};
}
- handleSubmit = async (event) => {
+ handleSubmit: FormEventHandler = async (event) => {
event.preventDefault();
const {stripe, elements} = this.props;
const {name, postal} = this.state;
diff --git a/examples/class-components/3-Payment-Request-Button.stories.tsx b/examples/class-components/3-Payment-Request-Button.stories.tsx
new file mode 100644
index 00000000..03c779e8
--- /dev/null
+++ b/examples/class-components/3-Payment-Request-Button.stories.tsx
@@ -0,0 +1,16 @@
+import type {Meta, StoryObj} from '@storybook/react';
+
+import {defaultParameter} from '../../.storybook/constants';
+import PaymentRequestButton from './3-Payment-Request-Button';
+
+const meta: Meta = {
+ title: 'react-stripe-js/Class Components/Payment Request Button',
+ component: PaymentRequestButton,
+ parameters: defaultParameter,
+};
+
+export default meta;
+
+type Story = StoryObj;
+
+export const Default: Story = {};
diff --git a/examples/class-components/3-Payment-Request-Button.js b/examples/class-components/3-Payment-Request-Button.tsx
similarity index 83%
rename from examples/class-components/3-Payment-Request-Button.js
rename to examples/class-components/3-Payment-Request-Button.tsx
index 8e4a7843..7f892732 100644
--- a/examples/class-components/3-Payment-Request-Button.js
+++ b/examples/class-components/3-Payment-Request-Button.tsx
@@ -2,8 +2,13 @@
// Learn how to accept a payment with the PaymentRequestButton using the official Stripe docs.
// https://stripe.com/docs/stripe-js/elements/payment-request-button#react
-import React from 'react';
-import {loadStripe} from '@stripe/stripe-js';
+import {Component} from 'react';
+import {
+ loadStripe,
+ Stripe,
+ PaymentMethod,
+ PaymentRequest,
+} from '@stripe/stripe-js';
import {
PaymentRequestButtonElement,
Elements,
@@ -33,14 +38,27 @@ const NotAvailableResult = () => (
const ELEMENT_OPTIONS = {
style: {
paymentRequestButton: {
- type: 'buy',
- theme: 'dark',
+ type: 'buy' as const,
+ theme: 'dark' as const,
},
},
};
-class CheckoutForm extends React.Component {
- constructor(props) {
+interface CheckoutFormProps {
+ stripe: Stripe | null;
+}
+
+interface CheckoutFormState {
+ canMakePayment: boolean;
+ hasCheckedAvailability: boolean;
+ errorMessage: string | null;
+ paymentMethod?: PaymentMethod;
+}
+
+class CheckoutForm extends Component {
+ paymentRequest?: PaymentRequest;
+
+ constructor(props: CheckoutFormProps) {
super(props);
this.state = {
canMakePayment: false,
@@ -58,7 +76,7 @@ class CheckoutForm extends React.Component {
}
}
- async createPaymentRequest(stripe) {
+ async createPaymentRequest(stripe: Stripe) {
this.paymentRequest = stripe.paymentRequest({
country: 'US',
currency: 'usd',
@@ -90,7 +108,7 @@ class CheckoutForm extends React.Component {
} = this.state;
return (