import {
Item,
ItemContent,
ItemDescription,
ItemTitle
} from '@components/common/ui/Item.js';
import { Label } from '@components/common/ui/Label.js';
import {
RadioGroup,
RadioGroupItem
} from '@components/common/ui/RadioGroup.js';
import { Skeleton } from '@components/common/ui/Skeleton.js';
import { useCheckout } from '@components/frontStore/checkout/CheckoutContext.js';
import { _ } from '@evershop/evershop/lib/locale/translate/_';
import React from 'react';
interface PaymentMethod {
code: string;
name: string;
cost?: {
value: number;
text: string;
};
description?: string;
}
// Skeleton component for loading state
function PaymentMethodSkeleton() {
return (
{[1, 2, 3, 4].map((index) => (
))}
);
}
export function PaymentMethods({
methods,
isLoading
}: {
methods: PaymentMethod[];
isLoading?: boolean;
}) {
const { form, registeredPaymentComponents } = useCheckout();
const { formState, watch, setValue } = form;
const selectedPaymentMethod = watch('paymentMethod');
const getPaymentComponent = (methodCode: string) => {
return registeredPaymentComponents[methodCode] || null;
};
const renderComponent = (
component: React.ComponentType | undefined,
props: any
) => {
return component ? React.createElement(component, props) : null;
};
return (
-
{_('Pick a payment method')}
{isLoading ? (
) : (
<>
{methods?.length === 0 ? (
{_('No payment methods available')}
) : (
{
setValue('paymentMethod', value);
}}
>
{methods.map((method: PaymentMethod) => {
const isSelected =
selectedPaymentMethod === method.code;
const component = getPaymentComponent(method.code);
return (
-
{component?.formRenderer && isSelected && (
{renderComponent(component.formRenderer, {
isSelected
})}
)}
);
})}
)}
{formState.errors.paymentMethod && (
{formState.errors.paymentMethod?.message?.toString() ||
_('Please select a payment method')}
)}
>
)}
);
}