Skip to content

Commit 1da2bce

Browse files
authored
Merge pull request #3570 from SalesforceCommerceCloud/rvishwanathbhat/save-payment-method-for-future-use
W-20394105: Save payment method for future use
2 parents 6f708ed + f48aa38 commit 1da2bce

File tree

8 files changed

+1561
-144
lines changed

8 files changed

+1561
-144
lines changed

packages/template-retail-react-app/app/constants.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,3 +273,20 @@ export const USER_NOT_FOUND_ERROR = /user not found/i
273273
* @deprecated Use `partialHydrationEnabled` in the config file instead
274274
*/
275275
export const PARTIAL_HYDRATION_ENABLED = false
276+
277+
// Constants for Salesforce Payments
278+
export const PAYMENT_METHOD_TYPES = {
279+
CARD: 'card',
280+
PAYPAL: 'paypal',
281+
VENMO: 'venmo'
282+
}
283+
284+
export const PAYMENT_GATEWAYS = {
285+
STRIPE: 'stripe',
286+
ADYEN: 'adyen'
287+
}
288+
289+
export const SETUP_FUTURE_USAGE = {
290+
ON_SESSION: 'on_session',
291+
OFF_SESSION: 'off_session'
292+
}

packages/template-retail-react-app/app/hooks/use-sf-payments.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,3 +110,14 @@ export const useAutomaticCapture = () => {
110110
const cardCaptureAutomatic = useShopperConfiguration('cardCaptureAutomatic')
111111
return cardCaptureAutomatic ?? true
112112
}
113+
114+
/**
115+
* Custom hook to determine if payments should be set up for off-session reuse.
116+
* If true, always set up payments for off-session reuse.
117+
* If false, only set up payments when user explicitly saves payment method (on-session reuse).
118+
* @returns {boolean} True if off-session future usage is enabled, false otherwise (default)
119+
*/
120+
export const useFutureUsageOffSession = () => {
121+
const futureUsageOffSession = useShopperConfiguration('futureUsageOffSession')
122+
return futureUsageOffSession ?? false
123+
}

packages/template-retail-react-app/app/hooks/use-sf-payments.test.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
useSFPayments,
1313
useSFPaymentsEnabled,
1414
useAutomaticCapture,
15+
useFutureUsageOffSession,
1516
EXPRESS_BUY_NOW,
1617
EXPRESS_PAY_NOW,
1718
STATUS_SUCCESS,
@@ -635,3 +636,45 @@ describe('useAutomaticCapture hook', () => {
635636
expect(mockUseShopperConfiguration).toHaveBeenCalledWith('cardCaptureAutomatic')
636637
})
637638
})
639+
640+
describe('useFutureUsageOffSession hook', () => {
641+
beforeEach(() => {
642+
jest.clearAllMocks()
643+
})
644+
645+
test('returns true when futureUsageOffSession is true', () => {
646+
mockUseShopperConfiguration.mockReturnValue(true)
647+
648+
const {result} = renderHook(() => useFutureUsageOffSession())
649+
650+
expect(result.current).toBe(true)
651+
expect(mockUseShopperConfiguration).toHaveBeenCalledWith('futureUsageOffSession')
652+
})
653+
654+
test('returns false when futureUsageOffSession is false', () => {
655+
mockUseShopperConfiguration.mockReturnValue(false)
656+
657+
const {result} = renderHook(() => useFutureUsageOffSession())
658+
659+
expect(result.current).toBe(false)
660+
expect(mockUseShopperConfiguration).toHaveBeenCalledWith('futureUsageOffSession')
661+
})
662+
663+
test('returns false (default) when futureUsageOffSession is undefined', () => {
664+
mockUseShopperConfiguration.mockReturnValue(undefined)
665+
666+
const {result} = renderHook(() => useFutureUsageOffSession())
667+
668+
expect(result.current).toBe(false)
669+
expect(mockUseShopperConfiguration).toHaveBeenCalledWith('futureUsageOffSession')
670+
})
671+
672+
test('returns false (default) when futureUsageOffSession is null', () => {
673+
mockUseShopperConfiguration.mockReturnValue(null)
674+
675+
const {result} = renderHook(() => useFutureUsageOffSession())
676+
677+
expect(result.current).toBe(false)
678+
expect(mockUseShopperConfiguration).toHaveBeenCalledWith('futureUsageOffSession')
679+
})
680+
})

0 commit comments

Comments
 (0)