Skip to content

Commit 15c4ccb

Browse files
Abhishek ChorotiyaAbhishek Chorotiya
authored andcommitted
feat: amazonPay
1 parent 9180793 commit 15c4ccb

File tree

3 files changed

+164
-167
lines changed

3 files changed

+164
-167
lines changed

src/Payments/AmazonPay/AmazonPay.res

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
open Utils
21
open AmazonPayHelpers
2+
open AmazonPayHooks
33

44
@react.component
55
let make = (~amazonPayToken) => {
@@ -9,7 +9,7 @@ let make = (~amazonPayToken) => {
99
let {iframeId} = Recoil.useRecoilValueFromAtom(RecoilAtoms.keys)
1010

1111
let handleFullscreenClick = () => {
12-
messageParentWindow([
12+
Utils.messageParentWindow([
1313
("fullscreen", true->JSON.Encode.bool),
1414
("param", "paymentloader"->JSON.Encode.string),
1515
("iframeId", iframeId->JSON.Encode.string),

src/Payments/AmazonPay/AmazonPayHelpers.res

Lines changed: 27 additions & 165 deletions
Original file line numberDiff line numberDiff line change
@@ -94,171 +94,33 @@ let defaultShipping = {
9494
phone: {number: ""},
9595
}
9696

97-
let useAmazonPay = token => {
98-
let scriptLoadStatus = CommonHooks.useScript("https://static-na.payments-amazon.com/checkout.js")
97+
let getShippingAddressFromEvent = event => {
98+
let eventDict = event->getDictFromJson
99+
let shippingAddressDict = eventDict->getDictFromDict("shippingAddress")
100+
let fullName = shippingAddressDict->getString("name", "")
101+
let addressLine1 = shippingAddressDict->getString("addressLine1", "")
102+
let addressLine2 = shippingAddressDict->getString("addressLine2", "")
103+
let addressLine3 = shippingAddressDict->getString("addressLine3", "")
104+
let city = shippingAddressDict->getString("city", "")
105+
let state = shippingAddressDict->getString("stateOrRegion", "")
106+
let zip = shippingAddressDict->getString("postalCode", "")
107+
let country = shippingAddressDict->getString("countryCode", "")
108+
let phoneNumber = shippingAddressDict->getString("phoneNumber", "")
109+
110+
let (firstName, lastName) = fullName->Utils.getFirstAndLastNameFromFullName
99111

100-
let loggerState = Recoil.useRecoilValueFromAtom(RecoilAtoms.loggerAtom)
101-
let options = Recoil.useRecoilValueFromAtom(RecoilAtoms.optionAtom)
102-
let intent = PaymentHelpers.usePaymentIntent(Some(loggerState), AmazonPay)
103-
let {publishableKey} = Recoil.useRecoilValueFromAtom(RecoilAtoms.keys)
104-
let isManualRetryEnabled = Recoil.useRecoilValueFromAtom(RecoilAtoms.isManualRetryEnabled)
105-
let shippingAddressRef = React.useRef(defaultShipping)
106-
107-
let getAmazonPayConfig = (sessionToken: amazonPayTokenType): amazonPayConfigType => {
108-
let baseAmount = sessionToken.totalBaseAmount->Float.fromString->Option.getOr(0.0)
109-
let taxAmount = sessionToken.totalTaxAmount->Float.fromString->Option.getOr(0.0)
110-
let shippingAmount = sessionToken.totalShippingAmount->Float.fromString->Option.getOr(0.0)
111-
let totalOrderAmount = (baseAmount +. taxAmount +. shippingAmount)->Float.toString
112-
113-
{
114-
merchantId: "A3UJN62U20X4GB",
115-
ledgerCurrency: sessionToken.ledgerCurrency,
116-
sandbox: true,
117-
checkoutLanguage: "en_US",
118-
productType: "PayAndShip",
119-
placement: "Checkout",
120-
buttonColor: "Gold",
121-
estimatedOrderAmount: {
122-
amount: totalOrderAmount,
123-
currencyCode: sessionToken.ledgerCurrency,
124-
},
125-
checkoutSessionConfig: {
126-
storeId: "amzn1.application-oa2-client.43ee1af277a94b6c8efd9118dd6c156c",
127-
scopes: ["name", "email", "phoneNumber", "billingAddress"],
128-
paymentDetails: {
129-
paymentIntent: sessionToken.paymentIntent,
130-
canHandlePendingAuthorization: false,
131-
},
132-
},
133-
onInitCheckout: event => {
134-
let eventDict = event->getDictFromJson
135-
let shippingAddressDict = eventDict->getDictFromDict("shippingAddress")
136-
let fullName = shippingAddressDict->getString("name", "")
137-
let addressLine1 = shippingAddressDict->getString("addressLine1", "")
138-
let addressLine2 = shippingAddressDict->getString("addressLine2", "")
139-
let addressLine3 = shippingAddressDict->getString("addressLine3", "")
140-
let city = shippingAddressDict->getString("city", "")
141-
let state = shippingAddressDict->getString("stateOrRegion", "")
142-
let zip = shippingAddressDict->getString("postalCode", "")
143-
let country = shippingAddressDict->getString("countryCode", "")
144-
let phoneNumber = shippingAddressDict->getString("phoneNumber", "")
145-
146-
let (firstName, lastName) = fullName->Utils.getFirstAndLastNameFromFullName
147-
148-
let shippingAddress = {
149-
line1: addressLine1,
150-
line2: addressLine2,
151-
line3: addressLine3,
152-
city,
153-
state,
154-
zip,
155-
country,
156-
first_name: firstName->JSON.Decode.string->Option.getOr(""),
157-
last_name: lastName->JSON.Decode.string->Option.getOr(""),
158-
}
159-
160-
let shippingPhone = {number: phoneNumber}
161-
162-
let shipping = {
163-
address: shippingAddress,
164-
phone: shippingPhone,
165-
}
166-
167-
shippingAddressRef.current = shipping
168-
169-
Console.log2("Checkout initialized successfully!", shipping)
170-
let currencyCode = sessionToken.ledgerCurrency
171-
{
172-
totalShippingAmount: {amount: sessionToken.totalShippingAmount, currencyCode},
173-
totalBaseAmount: {amount: sessionToken.totalBaseAmount, currencyCode},
174-
totalTaxAmount: {amount: sessionToken.totalTaxAmount, currencyCode},
175-
totalChargeAmount: {amount: totalOrderAmount, currencyCode},
176-
totalDiscountAmount: {amount: "0.00", currencyCode},
177-
deliveryOptions: sessionToken.deliveryOptions,
178-
}
179-
},
180-
onShippingAddressSelection: event => {
181-
Console.log2("Shipping address updated", event)
182-
let currencyCode = sessionToken.ledgerCurrency
183-
184-
{
185-
totalShippingAmount: {amount: sessionToken.totalShippingAmount, currencyCode},
186-
totalBaseAmount: {amount: sessionToken.totalBaseAmount, currencyCode},
187-
totalTaxAmount: {amount: sessionToken.totalTaxAmount, currencyCode},
188-
totalChargeAmount: {amount: totalOrderAmount, currencyCode},
189-
totalDiscountAmount: {amount: "0.00", currencyCode},
190-
deliveryOptions: sessionToken.deliveryOptions,
191-
}
192-
},
193-
onDeliveryOptionSelection: event => {
194-
Console.log("Delivery option updated")
195-
let deliveryOptions = sessionToken.deliveryOptions
196-
let currencyCode = sessionToken.ledgerCurrency
197-
let selectedOption =
198-
deliveryOptions->Array.find(option => option.id === event.deliveryOptions.id)
199-
let newShippingAmount = selectedOption->Option.mapOr("0.0", option => option.price.amount)
200-
let baseAmount = sessionToken.totalBaseAmount->Float.fromString->Option.getOr(0.0)
201-
let taxAmount = sessionToken.totalTaxAmount->Float.fromString->Option.getOr(0.0)
202-
let shippingAmount = newShippingAmount->Float.fromString->Option.getOr(0.0)
203-
let newTotalAmount = (baseAmount +. taxAmount +. shippingAmount)->Float.toString
204-
205-
{
206-
totalShippingAmount: {amount: newShippingAmount, currencyCode},
207-
totalBaseAmount: {amount: sessionToken.totalBaseAmount, currencyCode},
208-
totalTaxAmount: {amount: sessionToken.totalTaxAmount, currencyCode},
209-
totalChargeAmount: {amount: newTotalAmount, currencyCode},
210-
totalDiscountAmount: {amount: "0.00", currencyCode},
211-
}
212-
},
213-
onCompleteCheckout: event => {
214-
Console.log(
215-
"Checkout completed successfully! (This is a demo - no actual payment was processed)",
216-
)
217-
218-
let checkoutResponseDict = event->getDictFromJson
219-
let amazonCheckoutSessionId = checkoutResponseDict->getString("amazonCheckoutSessionId", "")
220-
221-
intent(
222-
~bodyArr=amazonPayBody(amazonCheckoutSessionId, shippingAddressRef.current),
223-
~confirmParam={
224-
return_url: options.wallets.walletReturnUrl,
225-
publishableKey,
226-
},
227-
~handleUserError=true,
228-
~manualRetry=isManualRetryEnabled,
229-
)
230-
231-
Console.log2("Checkout event details:", event)
232-
},
233-
onCancel: _ => {
234-
intent(
235-
~bodyArr=amazonPayBody("", shippingAddressRef.current),
236-
~confirmParam={
237-
return_url: options.wallets.walletReturnUrl,
238-
publishableKey,
239-
},
240-
~handleUserError=true,
241-
~manualRetry=isManualRetryEnabled,
242-
)
243-
},
244-
}
112+
{
113+
address: {
114+
line1: addressLine1,
115+
line2: addressLine2,
116+
line3: addressLine3,
117+
city,
118+
state,
119+
zip,
120+
country,
121+
first_name: firstName->JSON.Decode.string->Option.getOr(""),
122+
last_name: lastName->JSON.Decode.string->Option.getOr(""),
123+
},
124+
phone: {number: phoneNumber},
245125
}
246-
247-
let isRenderedOnce = React.useRef(false)
248-
let config = getAmazonPayConfig(token)
249-
250-
React.useEffect3(() => {
251-
let shouldRender =
252-
scriptLoadStatus == "ready" && config.merchantId != "" && !isRenderedOnce.current
253-
254-
if shouldRender {
255-
try {
256-
renderAmazonPayButton(~buttonId="#AmazonPayButton", ~config)
257-
isRenderedOnce.current = true
258-
} catch {
259-
| e => Console.error2("Error rendering Amazon Pay button:", e)
260-
}
261-
}
262-
None
263-
}, (config, scriptLoadStatus, isRenderedOnce.current))
264126
}
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
open AmazonPayTypes
2+
open AmazonPayHelpers
3+
open Utils
4+
5+
let useAmazonPay = token => {
6+
let scriptLoadStatus = CommonHooks.useScript("https://static-na.payments-amazon.com/checkout.js")
7+
8+
let loggerState = Recoil.useRecoilValueFromAtom(RecoilAtoms.loggerAtom)
9+
let options = Recoil.useRecoilValueFromAtom(RecoilAtoms.optionAtom)
10+
let intent = PaymentHelpers.usePaymentIntent(Some(loggerState), AmazonPay)
11+
let {publishableKey} = Recoil.useRecoilValueFromAtom(RecoilAtoms.keys)
12+
let isManualRetryEnabled = Recoil.useRecoilValueFromAtom(RecoilAtoms.isManualRetryEnabled)
13+
let shippingAddressRef = React.useRef(defaultShipping)
14+
15+
let getAmazonPayConfig = (sessionToken: amazonPayTokenType): amazonPayConfigType => {
16+
let baseAmount = sessionToken.totalBaseAmount->Float.fromString->Option.getOr(0.0)
17+
let taxAmount = sessionToken.totalTaxAmount->Float.fromString->Option.getOr(0.0)
18+
let shippingAmount = sessionToken.totalShippingAmount->Float.fromString->Option.getOr(0.0)
19+
let totalOrderAmount = (baseAmount +. taxAmount +. shippingAmount)->Float.toString
20+
let currencyCode = sessionToken.ledgerCurrency
21+
22+
{
23+
merchantId: "A3UJN62U20X4GB",
24+
ledgerCurrency: sessionToken.ledgerCurrency,
25+
sandbox: true,
26+
checkoutLanguage: "en_US",
27+
productType: "PayAndShip",
28+
placement: "Checkout",
29+
buttonColor: "Gold",
30+
estimatedOrderAmount: {
31+
amount: totalOrderAmount,
32+
currencyCode: sessionToken.ledgerCurrency,
33+
},
34+
checkoutSessionConfig: {
35+
storeId: "amzn1.application-oa2-client.43ee1af277a94b6c8efd9118dd6c156c",
36+
scopes: ["name", "email", "phoneNumber", "billingAddress"],
37+
paymentDetails: {
38+
paymentIntent: sessionToken.paymentIntent,
39+
canHandlePendingAuthorization: false,
40+
},
41+
},
42+
onInitCheckout: event => {
43+
shippingAddressRef.current = event->getShippingAddressFromEvent
44+
45+
{
46+
totalShippingAmount: {amount: sessionToken.totalShippingAmount, currencyCode},
47+
totalBaseAmount: {amount: sessionToken.totalBaseAmount, currencyCode},
48+
totalTaxAmount: {amount: sessionToken.totalTaxAmount, currencyCode},
49+
totalChargeAmount: {amount: totalOrderAmount, currencyCode},
50+
totalDiscountAmount: {amount: "0.00", currencyCode},
51+
deliveryOptions: sessionToken.deliveryOptions,
52+
}
53+
},
54+
onShippingAddressSelection: event => {
55+
shippingAddressRef.current = event->getShippingAddressFromEvent
56+
57+
{
58+
totalShippingAmount: {amount: sessionToken.totalShippingAmount, currencyCode},
59+
totalBaseAmount: {amount: sessionToken.totalBaseAmount, currencyCode},
60+
totalTaxAmount: {amount: sessionToken.totalTaxAmount, currencyCode},
61+
totalChargeAmount: {amount: totalOrderAmount, currencyCode},
62+
totalDiscountAmount: {amount: "0.00", currencyCode},
63+
deliveryOptions: sessionToken.deliveryOptions,
64+
}
65+
},
66+
onDeliveryOptionSelection: event => {
67+
Console.log("Delivery option updated")
68+
let deliveryOptions = sessionToken.deliveryOptions
69+
let selectedOption =
70+
deliveryOptions->Array.find(option => option.id === event.deliveryOptions.id)
71+
let newShippingAmount = selectedOption->Option.mapOr("0.0", option => option.price.amount)
72+
let baseAmount = sessionToken.totalBaseAmount->Float.fromString->Option.getOr(0.0)
73+
let taxAmount = sessionToken.totalTaxAmount->Float.fromString->Option.getOr(0.0)
74+
let shippingAmount = newShippingAmount->Float.fromString->Option.getOr(0.0)
75+
let newTotalAmount = (baseAmount +. taxAmount +. shippingAmount)->Float.toString
76+
77+
{
78+
totalShippingAmount: {amount: newShippingAmount, currencyCode},
79+
totalBaseAmount: {amount: sessionToken.totalBaseAmount, currencyCode},
80+
totalTaxAmount: {amount: sessionToken.totalTaxAmount, currencyCode},
81+
totalChargeAmount: {amount: newTotalAmount, currencyCode},
82+
totalDiscountAmount: {amount: "0.00", currencyCode},
83+
}
84+
},
85+
onCompleteCheckout: event => {
86+
Console.log2(
87+
"Checkout completed successfully! (This is a demo - no actual payment was processed)",
88+
event,
89+
)
90+
91+
let amazonCheckoutSessionId =
92+
event->getDictFromJson->getString("amazonCheckoutSessionId", "")
93+
94+
intent(
95+
~bodyArr=amazonPayBody(amazonCheckoutSessionId, shippingAddressRef.current),
96+
~confirmParam={
97+
return_url: options.wallets.walletReturnUrl,
98+
publishableKey,
99+
},
100+
~handleUserError=true,
101+
~manualRetry=isManualRetryEnabled,
102+
)
103+
},
104+
onCancel: _ => {
105+
intent(
106+
~bodyArr=amazonPayBody("", shippingAddressRef.current),
107+
~confirmParam={
108+
return_url: options.wallets.walletReturnUrl,
109+
publishableKey,
110+
},
111+
~handleUserError=true,
112+
~manualRetry=isManualRetryEnabled,
113+
)
114+
},
115+
}
116+
}
117+
118+
let isRenderedOnce = React.useRef(false)
119+
let config = getAmazonPayConfig(token)
120+
121+
React.useEffect3(() => {
122+
let shouldRender =
123+
scriptLoadStatus == "ready" && config.merchantId != "" && !isRenderedOnce.current
124+
125+
if shouldRender {
126+
try {
127+
renderAmazonPayButton(~buttonId="#AmazonPayButton", ~config)
128+
isRenderedOnce.current = true
129+
} catch {
130+
| e => Console.error2("Error rendering Amazon Pay button:", e)
131+
}
132+
}
133+
None
134+
}, (config, scriptLoadStatus, isRenderedOnce.current))
135+
}

0 commit comments

Comments
 (0)