@@ -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}
0 commit comments