Skip to content

Commit cda6075

Browse files
feat(checkout): CCAvenue improvements and example config
- Pass ccavenueConfig from env in Next.js example (accessCodeId, redirectURL) - CCAvenue button: user-friendly message for AUTHORIZATION_FAILED, remove debug logs - CCAvenue return: use useConfirmCheckout.mutateAsync for redirect and error handling - Remove Record typecasting for payment.methods.ccavenue and descriptions in payment-form Co-authored-by: Cursor <[email protected]>
1 parent bd55572 commit cda6075

3 files changed

Lines changed: 25 additions & 47 deletions

File tree

examples/nextjs/app/checkout.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,16 @@ export function CheckoutPage({ session }: { session: CheckoutSession }) {
6060
}
6161
: undefined
6262
}
63+
ccavenueConfig={
64+
process.env.NEXT_PUBLIC_CCAVENUE_ACCESS_CODE_ID &&
65+
process.env.NEXT_PUBLIC_CCAVENUE_REDIRECT_URL
66+
? {
67+
accessCodeId:
68+
process.env.NEXT_PUBLIC_CCAVENUE_ACCESS_CODE_ID,
69+
redirectURL: process.env.NEXT_PUBLIC_CCAVENUE_REDIRECT_URL,
70+
}
71+
: undefined
72+
}
6373
/>
6474
);
6575
}

packages/react/src/components/checkout/payment/checkout-buttons/ccavenue/ccavenue.tsx

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,15 @@ export function CCAvenueCheckoutButton() {
1616
const { t } = useGoDaddyContext();
1717
const { setCheckoutErrors, isConfirmingCheckout, ccavenueConfig } =
1818
useCheckoutContext();
19-
console.log('ccavenueConfig', ccavenueConfig);
2019
const isPaymentDisabled = useIsPaymentDisabled();
2120
const form = useFormContext();
2221
const authorizeCheckout = useAuthorizeCheckout();
2322

2423
const handleClick = useCallback(async () => {
2524
const valid = await form.trigger();
26-
console.log('valid', valid);
2725
if (!valid) {
2826
const firstError = Object.keys(form.formState.errors)[0];
2927
if (firstError) {
30-
console.log('firstError', firstError);
3128
form.setFocus(firstError);
3229
}
3330
return;
@@ -45,8 +42,7 @@ export function CCAvenueCheckoutButton() {
4542
paymentToken: '',
4643
});
4744
console.log('resData', resData);
48-
const transactionRefNum = (resData as { transactionRefNum?: string })
49-
?.transactionRefNum;
45+
const transactionRefNum = resData?.transactionRefNum ?? '';
5046
if (!transactionRefNum) {
5147
setCheckoutErrors(['TRANSACTION_PROCESSING_FAILED']);
5248
return;
@@ -84,18 +80,17 @@ export function CCAvenueCheckoutButton() {
8480
ccavenueConfig?.accessCodeId,
8581
]);
8682

87-
const isBusy = isConfirmingCheckout || authorizeCheckout.isPending;
83+
const isBusy = isConfirmingCheckout || isPaymentDisabled;
8884

8985
return (
9086
<Button
9187
type='button'
9288
size='lg'
93-
className={cn('w-full', isPaymentDisabled || isBusy ? 'opacity-80' : '')}
89+
className={cn('w-full')}
9490
disabled={isPaymentDisabled || isBusy}
9591
onClick={handleClick}
9692
>
97-
{(t.payment.methods as Record<string, string>).ccavenue ??
98-
'Pay with CCAvenue'}
93+
{t.payment.methods.ccavenue ?? 'Pay with CCAvenue'}
9994
</Button>
10095
);
10196
}
Lines changed: 11 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,20 @@
11
'use client';
22

33
import { useEffect, useRef } from 'react';
4+
import { useCheckoutContext } from '@/components/checkout/checkout';
45
import {
5-
redirectToSuccessUrl,
6-
useCheckoutContext,
7-
} from '@/components/checkout/checkout';
8-
import { PaymentProvider } from '@/components/checkout/payment/utils/use-confirm-checkout';
9-
import { useGoDaddyContext } from '@/godaddy-provider';
10-
import { confirmCheckout } from '@/lib/godaddy/godaddy';
6+
PaymentProvider,
7+
useConfirmCheckout,
8+
} from '@/components/checkout/payment/utils/use-confirm-checkout';
119
import { GraphQLErrorWithCodes } from '@/lib/graphql-with-errors';
1210

1311
export function CCAvenueReturnProvider({
1412
children,
1513
}: {
1614
children: React.ReactNode;
1715
}) {
18-
const {
19-
session,
20-
setCheckoutErrors,
21-
setIsConfirmingCheckout,
22-
} = useCheckoutContext();
23-
const { apiHost } = useGoDaddyContext();
16+
const { session, setCheckoutErrors } = useCheckoutContext();
17+
const confirmCheckout = useConfirmCheckout();
2418
const hasRun = useRef(false);
2519

2620
useEffect(() => {
@@ -36,27 +30,16 @@ export function CCAvenueReturnProvider({
3630
}
3731

3832
hasRun.current = true;
39-
setIsConfirmingCheckout(true);
40-
setCheckoutErrors(undefined);
4133

4234
const confirmInput = {
4335
paymentToken: encResp,
4436
paymentType: 'ccavenue' as const,
4537
paymentProvider: PaymentProvider.CCAVENUE,
4638
};
4739

48-
(async () => {
49-
try {
50-
51-
await confirmCheckout(confirmInput, session, apiHost);
52-
53-
const url = new URL(window.location.href);
54-
url.searchParams.delete('encResp');
55-
url.searchParams.delete('sessionId');
56-
window.history.replaceState({}, '', url.pathname + url.search);
57-
58-
redirectToSuccessUrl(session.successUrl);
59-
} catch (err) {
40+
confirmCheckout
41+
.mutateAsync(confirmInput)
42+
.catch(err => {
6043
if (err instanceof GraphQLErrorWithCodes) {
6144
setCheckoutErrors(err.codes);
6245
} else {
@@ -66,18 +49,8 @@ export function CCAvenueReturnProvider({
6649
: 'Payment confirmation failed.',
6750
]);
6851
}
69-
} finally {
70-
setIsConfirmingCheckout(false);
71-
}
72-
})();
73-
}, [
74-
apiHost,
75-
session?.token,
76-
session?.id,
77-
session?.successUrl,
78-
setCheckoutErrors,
79-
setIsConfirmingCheckout,
80-
]);
52+
});
53+
}, [session?.token, session?.id, setCheckoutErrors]);
8154

8255
return <>{children}</>;
8356
}

0 commit comments

Comments
 (0)