@shipengine/elements 2.28.0 → 2.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/dist/cjs/components/forms/edit-billing-form/edit-billing-form.cjs +87 -12
  2. package/dist/cjs/components/forms/edit-billing-form/edit-billing-form.styles.cjs +15 -0
  3. package/dist/cjs/components/forms/wallet-form/index.cjs +0 -2
  4. package/dist/cjs/components/forms/wallet-form/wallet-form.cjs +153 -23
  5. package/dist/cjs/components/forms/wallet-form/wallet-form.styles.cjs +15 -0
  6. package/dist/cjs/components/forms/wallet-form/wallet-schema.cjs +8 -43
  7. package/dist/cjs/components/payment/payment-method-selector/index.cjs +7 -0
  8. package/dist/cjs/components/payment/payment-method-selector/payment-method-selector.cjs +55 -0
  9. package/dist/cjs/components/payment/payment-method-selector/payment-method-selector.styles.cjs +58 -0
  10. package/dist/cjs/contexts/auctane-pay-session-context.cjs +158 -0
  11. package/dist/cjs/contexts/index.cjs +8 -0
  12. package/dist/cjs/features/payment-method-settings/payment-method-settings.cjs +4 -3
  13. package/dist/cjs/hooks/financial-services/financial-service.cjs +464 -0
  14. package/dist/cjs/hooks/financial-services/index.cjs +9 -0
  15. package/dist/cjs/hooks/financial-services/use-financial-service.cjs +188 -0
  16. package/dist/cjs/locales/en/register-wallet.json.cjs +5 -0
  17. package/dist/cjs/package.json.cjs +1 -1
  18. package/dist/cjs/workflows/onboarding/components/confirmation-and-submission-step/confirmation-and-submission-step.cjs +16 -5
  19. package/dist/cjs/workflows/onboarding/components/confirmation-and-submission-step/use-confirmation-and-submission-step.cjs +6 -6
  20. package/dist/cjs/workflows/onboarding/components/funding-step/funding-step.cjs +7 -3
  21. package/dist/cjs/workflows/onboarding/onboarding.cjs +8 -5
  22. package/dist/esm/components/forms/edit-billing-form/edit-billing-form.js +88 -13
  23. package/dist/esm/components/forms/edit-billing-form/edit-billing-form.styles.js +15 -0
  24. package/dist/esm/components/forms/wallet-form/index.js +0 -1
  25. package/dist/esm/components/forms/wallet-form/wallet-form.js +155 -25
  26. package/dist/esm/components/forms/wallet-form/wallet-form.styles.js +15 -0
  27. package/dist/esm/components/forms/wallet-form/wallet-schema.js +1 -36
  28. package/dist/esm/components/payment/payment-method-selector/index.js +1 -0
  29. package/dist/esm/components/payment/payment-method-selector/payment-method-selector.js +53 -0
  30. package/dist/esm/components/payment/payment-method-selector/payment-method-selector.styles.js +56 -0
  31. package/dist/esm/contexts/auctane-pay-session-context.js +155 -0
  32. package/dist/esm/contexts/index.js +1 -0
  33. package/dist/esm/features/payment-method-settings/payment-method-settings.js +5 -4
  34. package/dist/esm/hooks/financial-services/financial-service.js +462 -0
  35. package/dist/esm/hooks/financial-services/index.js +2 -0
  36. package/dist/esm/hooks/financial-services/use-financial-service.js +186 -0
  37. package/dist/esm/locales/en/register-wallet.json.js +5 -0
  38. package/dist/esm/package.json.js +1 -1
  39. package/dist/esm/workflows/onboarding/components/confirmation-and-submission-step/confirmation-and-submission-step.js +16 -5
  40. package/dist/esm/workflows/onboarding/components/confirmation-and-submission-step/use-confirmation-and-submission-step.js +6 -6
  41. package/dist/esm/workflows/onboarding/components/funding-step/funding-step.js +7 -3
  42. package/dist/esm/workflows/onboarding/onboarding.js +8 -5
  43. package/dist/types/components/address-preference-context/address-preference-context.d.ts +0 -1
  44. package/dist/types/components/address-preference-context/address-preference-context.d.ts.map +1 -1
  45. package/dist/types/components/forms/edit-billing-form/edit-billing-form.d.ts +2 -2
  46. package/dist/types/components/forms/edit-billing-form/edit-billing-form.d.ts.map +1 -1
  47. package/dist/types/components/forms/edit-billing-form/edit-billing-form.styles.d.ts +14 -0
  48. package/dist/types/components/forms/edit-billing-form/edit-billing-form.styles.d.ts.map +1 -1
  49. package/dist/types/components/forms/wallet-form/index.d.ts +0 -1
  50. package/dist/types/components/forms/wallet-form/index.d.ts.map +1 -1
  51. package/dist/types/components/forms/wallet-form/wallet-form.d.ts +4 -1
  52. package/dist/types/components/forms/wallet-form/wallet-form.d.ts.map +1 -1
  53. package/dist/types/components/forms/wallet-form/wallet-form.styles.d.ts +14 -0
  54. package/dist/types/components/forms/wallet-form/wallet-form.styles.d.ts.map +1 -1
  55. package/dist/types/components/forms/wallet-form/wallet-schema.d.ts +3 -43
  56. package/dist/types/components/forms/wallet-form/wallet-schema.d.ts.map +1 -1
  57. package/dist/types/components/payment/payment-method-selector/index.d.ts +2 -0
  58. package/dist/types/components/payment/payment-method-selector/index.d.ts.map +1 -0
  59. package/dist/types/components/payment/payment-method-selector/payment-method-selector.d.ts +11 -0
  60. package/dist/types/components/payment/payment-method-selector/payment-method-selector.d.ts.map +1 -0
  61. package/dist/types/components/payment/payment-method-selector/payment-method-selector.styles.d.ts +52 -0
  62. package/dist/types/components/payment/payment-method-selector/payment-method-selector.styles.d.ts.map +1 -0
  63. package/dist/types/contexts/auctane-pay-session-context.d.ts +54 -0
  64. package/dist/types/contexts/auctane-pay-session-context.d.ts.map +1 -0
  65. package/dist/types/contexts/index.d.ts +3 -0
  66. package/dist/types/contexts/index.d.ts.map +1 -0
  67. package/dist/types/elements/customs-form/customs-form-element.d.ts +5 -0
  68. package/dist/types/elements/customs-form/customs-form-element.d.ts.map +1 -1
  69. package/dist/types/elements/labels-grid/labels-grid.d.ts +5 -0
  70. package/dist/types/elements/labels-grid/labels-grid.d.ts.map +1 -1
  71. package/dist/types/elements/manage-carriers/manage-carriers.d.ts +5 -0
  72. package/dist/types/elements/manage-carriers/manage-carriers.d.ts.map +1 -1
  73. package/dist/types/elements/manage-external-carriers/manage-external-carriers.d.ts +5 -0
  74. package/dist/types/elements/manage-external-carriers/manage-external-carriers.d.ts.map +1 -1
  75. package/dist/types/elements/manage-funding/manage-funding-element.d.ts +5 -0
  76. package/dist/types/elements/manage-funding/manage-funding-element.d.ts.map +1 -1
  77. package/dist/types/elements/manage-warehouses/manage-warehouses.d.ts +5 -0
  78. package/dist/types/elements/manage-warehouses/manage-warehouses.d.ts.map +1 -1
  79. package/dist/types/elements/payment-method-settings/payment-method-settings-element.d.ts +5 -0
  80. package/dist/types/elements/payment-method-settings/payment-method-settings-element.d.ts.map +1 -1
  81. package/dist/types/elements/purchase-label/purchase-label.d.ts +5 -0
  82. package/dist/types/elements/purchase-label/purchase-label.d.ts.map +1 -1
  83. package/dist/types/elements/select-label-layout/select-label-layout-element.d.ts +5 -0
  84. package/dist/types/elements/select-label-layout/select-label-layout-element.d.ts.map +1 -1
  85. package/dist/types/elements/shipment-summary/shipment-summary.d.ts +5 -0
  86. package/dist/types/elements/shipment-summary/shipment-summary.d.ts.map +1 -1
  87. package/dist/types/elements/shipments-grid/shipments-grid.d.ts +5 -0
  88. package/dist/types/elements/shipments-grid/shipments-grid.d.ts.map +1 -1
  89. package/dist/types/elements/theme-creator/theme-creator.d.ts +5 -0
  90. package/dist/types/elements/theme-creator/theme-creator.d.ts.map +1 -1
  91. package/dist/types/elements/transaction-history/transaction-history-element.d.ts +5 -0
  92. package/dist/types/elements/transaction-history/transaction-history-element.d.ts.map +1 -1
  93. package/dist/types/elements/unit-settings/unit-settings-element.d.ts +5 -0
  94. package/dist/types/elements/unit-settings/unit-settings-element.d.ts.map +1 -1
  95. package/dist/types/elements/vat-settings/vat-settings-element.d.ts +5 -0
  96. package/dist/types/elements/vat-settings/vat-settings-element.d.ts.map +1 -1
  97. package/dist/types/elements/void-label/void-label.d.ts +5 -0
  98. package/dist/types/elements/void-label/void-label.d.ts.map +1 -1
  99. package/dist/types/elements-provider/elements-provider.d.ts.map +1 -1
  100. package/dist/types/features/payment-method-settings/payment-method-settings.d.ts.map +1 -1
  101. package/dist/types/hooks/financial-services/financial-service.d.ts +279 -0
  102. package/dist/types/hooks/financial-services/financial-service.d.ts.map +1 -0
  103. package/dist/types/hooks/financial-services/index.d.ts +5 -0
  104. package/dist/types/hooks/financial-services/index.d.ts.map +1 -0
  105. package/dist/types/hooks/financial-services/use-financial-service.d.ts +40 -0
  106. package/dist/types/hooks/financial-services/use-financial-service.d.ts.map +1 -0
  107. package/dist/types/locales/en/index.d.ts +5 -0
  108. package/dist/types/locales/en/index.d.ts.map +1 -1
  109. package/dist/types/types/financial-services.d.ts +34 -0
  110. package/dist/types/types/financial-services.d.ts.map +1 -0
  111. package/dist/types/types/index.d.ts +1 -1
  112. package/dist/types/types/index.d.ts.map +1 -1
  113. package/dist/types/workflows/account-settings/account-settings.d.ts +5 -0
  114. package/dist/types/workflows/account-settings/account-settings.d.ts.map +1 -1
  115. package/dist/types/workflows/carrier-services/carrier-services.d.ts +5 -0
  116. package/dist/types/workflows/carrier-services/carrier-services.d.ts.map +1 -1
  117. package/dist/types/workflows/connect-external-carrier/connect-external-carrier.d.ts +5 -0
  118. package/dist/types/workflows/connect-external-carrier/connect-external-carrier.d.ts.map +1 -1
  119. package/dist/types/workflows/label-workflow/label-workflow.d.ts +5 -0
  120. package/dist/types/workflows/label-workflow/label-workflow.d.ts.map +1 -1
  121. package/dist/types/workflows/onboarding/components/confirmation-and-submission-step/confirmation-and-submission-step.d.ts.map +1 -1
  122. package/dist/types/workflows/onboarding/components/confirmation-and-submission-step/use-confirmation-and-submission-step.d.ts.map +1 -1
  123. package/dist/types/workflows/onboarding/components/funding-step/funding-step.d.ts.map +1 -1
  124. package/dist/types/workflows/onboarding/onboarding.d.ts +5 -0
  125. package/dist/types/workflows/onboarding/onboarding.d.ts.map +1 -1
  126. package/package.json +5 -5
  127. package/dist/cjs/components/forms/wallet-form/billing-fields.cjs +0 -71
  128. package/dist/esm/components/forms/wallet-form/billing-fields.js +0 -69
  129. package/dist/types/components/forms/wallet-form/billing-fields.d.ts +0 -7
  130. package/dist/types/components/forms/wallet-form/billing-fields.d.ts.map +0 -1
@@ -1,16 +1,21 @@
1
1
  'use strict';
2
2
 
3
+ var _tslib = require('../../../_virtual/_tslib.cjs');
3
4
  var jsxRuntime = require('@emotion/react/jsx-runtime');
5
+ var auctanePaySessionContext = require('../../../contexts/auctane-pay-session-context.cjs');
4
6
  var useToggle = require('../../../hooks/use-toggle.cjs');
5
7
  var giger = require('@shipengine/giger');
6
8
  var formLogger = require('../../../utilities/form-logger.cjs');
7
9
  var validation = require('../../../utilities/validation.cjs');
10
+ var React = require('react');
8
11
  var reactHookForm = require('react-hook-form');
9
12
  var reactI18next = require('react-i18next');
10
- var billingFields = require('../wallet-form/billing-fields.cjs');
11
13
  var editBillingForm_styles = require('./edit-billing-form.styles.cjs');
12
14
  var walletSchema = require('../wallet-form/wallet-schema.cjs');
15
+ var useFinancialService = require('../../../hooks/financial-services/use-financial-service.cjs');
13
16
  var addressFields = require('../address-form/address-fields.cjs');
17
+ var elementsContextProvider = require('../../../elements-provider/elements-context-provider.cjs');
18
+ var spacer = require('../../spacer/spacer.cjs');
14
19
  var addressDisplay = require('../../address-display/address-display.cjs');
15
20
  var linkAction = require('../../link-action/link-action.cjs');
16
21
  var buttonGroup = require('../../button-group/button-group.cjs');
@@ -26,7 +31,13 @@ const EditBillingForm = ({
26
31
  const {
27
32
  t
28
33
  } = reactI18next.useTranslation();
34
+ const {
35
+ locale
36
+ } = elementsContextProvider.useElements();
37
+ const [isAdyenReady, setIsAdyenReady] = React.useState(false);
29
38
  const [editBillingInfo, toggleEditBillingInfo] = useToggle.useToggle(false);
39
+ const [paymentError, setPaymentError] = React.useState(null);
40
+ const sessionContext = auctanePaySessionContext.useAuctanePaySession();
30
41
  const form = reactHookForm.useForm({
31
42
  resolver: validation.validationResolver(walletSchema.getWalletSchema("emailRequired", "blackboxOptional"), ["creditCard"]),
32
43
  defaultValues: {
@@ -44,35 +55,99 @@ const EditBillingForm = ({
44
55
  }
45
56
  }
46
57
  });
47
- const handleSubmit = form.handleSubmit(values => {
58
+ const {
59
+ adyenRef,
60
+ submit: adyenSubmit,
61
+ getSessionData
62
+ } = useFinancialService.useFinancialService({
63
+ getAdyenSessionData: sessionContext.getSessionData,
64
+ paymentMethod: "credit_card",
65
+ options: {
66
+ showPayButton: false,
67
+ locale: locale || "en-US",
68
+ onChange: () => {
69
+ setPaymentError(null);
70
+ },
71
+ creditCardOptions: {
72
+ onLoad: event => {
73
+ if (event.iframesLoaded) {
74
+ setIsAdyenReady(true);
75
+ }
76
+ }
77
+ }
78
+ }
79
+ });
80
+ const handleSubmit = form.handleSubmit(values => _tslib.__awaiter(void 0, void 0, void 0, function* () {
48
81
  const {
49
- address,
50
- creditCard
82
+ address
51
83
  } = values;
52
84
  const billingInfo = Object.assign(Object.assign({}, address), {
53
85
  company: address.companyName ? address.companyName : "",
54
86
  email: address.email,
55
87
  fullName: address.name
56
88
  });
57
- onSubmit(billingInfo, creditCard);
58
- });
89
+ const processPayment = () => _tslib.__awaiter(void 0, void 0, void 0, function* () {
90
+ try {
91
+ const paymentResult = yield adyenSubmit();
92
+ if (!paymentResult.success) {
93
+ // Payment failed - show error and allow retry
94
+ setPaymentError(paymentResult.error || "Payment failed");
95
+ form.reset(undefined, {
96
+ keepValues: true
97
+ });
98
+ return;
99
+ }
100
+ if ((paymentResult === null || paymentResult === void 0 ? void 0 : paymentResult.resultCode) === "Authorised") {
101
+ // Payment was successful, proceed with form submission
102
+ const sessionData = getSessionData();
103
+ onSubmit(billingInfo, {
104
+ sessionId: sessionData === null || sessionData === void 0 ? void 0 : sessionData.id
105
+ });
106
+ }
107
+ } catch (error) {
108
+ // Payment processing error
109
+ const errorMessage = error instanceof Error ? error.message : "Payment processing failed";
110
+ setPaymentError(errorMessage);
111
+ }
112
+ });
113
+ yield processPayment();
114
+ }));
59
115
  return jsxRuntime.jsx("form", {
60
116
  onSubmit: formLogger.formLogger.capture(handleSubmit),
61
117
  children: jsxRuntime.jsxs(giger.Grid, {
62
118
  css: editBillingForm_styles.styles.container,
63
- children: [jsxRuntime.jsx(giger.GridChild, {
119
+ children: [paymentError && jsxRuntime.jsxs(jsxRuntime.Fragment, {
120
+ children: [jsxRuntime.jsx(giger.GridChild, {
121
+ colSpan: 12,
122
+ children: jsxRuntime.jsx(giger.InlineNotification, {
123
+ title: t("register-wallet:sections.notifications.error.title"),
124
+ type: giger.NotificationType.ERROR,
125
+ children: paymentError
126
+ })
127
+ }), jsxRuntime.jsx(spacer.Spacer, {
128
+ multiplier: 2
129
+ })]
130
+ }), jsxRuntime.jsx(giger.GridChild, {
64
131
  colSpan: 12,
65
132
  css: editBillingForm_styles.styles.subtitle,
66
133
  children: jsxRuntime.jsx(giger.Typography, {
67
134
  variant: "subtitle1",
68
135
  children: t("register-wallet:settings.billing.subtitleCard")
69
136
  })
70
- }), jsxRuntime.jsx(giger.GridChild, {
137
+ }), jsxRuntime.jsxs(giger.GridChild, {
71
138
  colSpan: 12,
72
- children: jsxRuntime.jsx(billingFields.BillingFields, {
73
- form: form
74
- })
75
- }), jsxRuntime.jsx(giger.GridChild, {
139
+ children: [!isAdyenReady && jsxRuntime.jsx("div", {
140
+ css: editBillingForm_styles.styles.loadingContainer,
141
+ children: jsxRuntime.jsx(giger.Spinner, {
142
+ size: giger.SpinnerSize.SIZE_LARGE
143
+ })
144
+ }), jsxRuntime.jsx("div", {
145
+ css: editBillingForm_styles.styles.adyenContainer,
146
+ "data-ready": isAdyenReady,
147
+ "data-testid": "adyen-div",
148
+ ref: adyenRef
149
+ })]
150
+ }), jsxRuntime.jsx(spacer.Spacer, {}), jsxRuntime.jsx(giger.GridChild, {
76
151
  colSpan: 12,
77
152
  css: editBillingForm_styles.styles.subtitle,
78
153
  children: jsxRuntime.jsx(giger.Typography, {
@@ -16,6 +16,21 @@ const styles = styles$1.createStyles({
16
16
  subtitle: theme => ({
17
17
  paddingBottom: styles$1.scopeTheme(theme).spacing(2),
18
18
  textAlign: "left"
19
+ }),
20
+ loadingContainer: theme => ({
21
+ display: "flex",
22
+ justifyContent: "center",
23
+ paddingTop: styles$1.scopeTheme(theme).spacing(2),
24
+ paddingBottom: styles$1.scopeTheme(theme).spacing(2)
25
+ }),
26
+ adyenContainer: () => ({
27
+ "&:not([data-ready='true'])": {
28
+ display: "none"
29
+ },
30
+ // Hide Adyen's "All fields are required" instruction text
31
+ "& .adyen-checkout-form-instruction": {
32
+ display: "none"
33
+ }
19
34
  })
20
35
  });
21
36
 
@@ -2,7 +2,6 @@
2
2
 
3
3
  var walletForm = require('./wallet-form.cjs');
4
4
  var walletSchema = require('./wallet-schema.cjs');
5
- var billingFields = require('./billing-fields.cjs');
6
5
 
7
6
 
8
7
 
@@ -11,4 +10,3 @@ exports.getBillingAddressSchema = walletSchema.getBillingAddressSchema;
11
10
  exports.getWalletSchema = walletSchema.getWalletSchema;
12
11
  exports.walletBlackboxSchemas = walletSchema.walletBlackboxSchemas;
13
12
  exports.walletEmailSchemas = walletSchema.walletEmailSchemas;
14
- exports.BillingFields = billingFields.BillingFields;
@@ -2,6 +2,7 @@
2
2
 
3
3
  var _tslib = require('../../../_virtual/_tslib.cjs');
4
4
  var jsxRuntime = require('@emotion/react/jsx-runtime');
5
+ var auctanePaySessionContext = require('../../../contexts/auctane-pay-session-context.cjs');
5
6
  var useBlackBoxDetection = require('../../../hooks/use-black-box-detection.cjs');
6
7
  var useNestedForm = require('../../../hooks/use-nested-form.cjs');
7
8
  var giger = require('@shipengine/giger');
@@ -12,11 +13,13 @@ var React = require('react');
12
13
  var reactHookForm = require('react-hook-form');
13
14
  var reactI18next = require('react-i18next');
14
15
  var editWalletAddressForm = require('../edit-wallet-address-form/edit-wallet-address-form.cjs');
15
- var billingFields = require('./billing-fields.cjs');
16
16
  var walletForm_styles = require('./wallet-form.styles.cjs');
17
17
  var walletSchema = require('./wallet-schema.cjs');
18
+ var useFinancialService = require('../../../hooks/financial-services/use-financial-service.cjs');
19
+ var paymentMethodSelector = require('../../payment/payment-method-selector/payment-method-selector.cjs');
18
20
  var addressFields = require('../address-form/address-fields.cjs');
19
21
  var vatSettings = require('../../../features/vat-settings/vat-settings.cjs');
22
+ var elementsContextProvider = require('../../../elements-provider/elements-context-provider.cjs');
20
23
  var addressPreferenceContext = require('../../address-preference-context/address-preference-context.cjs');
21
24
  var spacer = require('../../spacer/spacer.cjs');
22
25
  var addressDisplay = require('../../address-display/address-display.cjs');
@@ -29,27 +32,38 @@ const WalletForm = ({
29
32
  onSubmit,
30
33
  showVatSettings
31
34
  }) => {
35
+ var _a, _b;
32
36
  const {
33
37
  t
34
38
  } = reactI18next.useTranslation(["register-wallet", "common"]);
39
+ const {
40
+ locale
41
+ } = elementsContextProvider.useElements();
35
42
  const defaultWarehouseIsPoBox = address.isPoBoxAddress(address$1);
36
43
  const {
37
44
  validateAddress
38
45
  } = addressPreferenceContext.useAddressPreference();
39
46
  const [codedErrors, setCodedErrors] = React.useState(errors);
47
+ const [isSubmitting, setIsSubmitting] = React.useState(false);
48
+ const [paymentError, setPaymentError] = React.useState(null);
49
+ const [isAdyenReady, setIsAdyenReady] = React.useState(false);
50
+ const [cardBrand, setCardBrand] = React.useState();
51
+ const sessionContext = auctanePaySessionContext.useAuctanePaySession();
40
52
  const form = reactHookForm.useForm({
41
53
  defaultValues:
42
54
  // If the warehouse address is a PO Box they cannot use it as their billing address
43
55
  defaultWarehouseIsPoBox ? {
44
56
  address: {
45
57
  countryCode: "US"
46
- }
58
+ },
59
+ paymentMethod: "credit_card"
47
60
  } : {
48
61
  address: Object.assign(Object.assign({}, address$1), {
49
62
  countryCode: address$1.countryCode
50
- })
63
+ }),
64
+ paymentMethod: "credit_card"
51
65
  },
52
- resolver: validation.validationResolver(walletSchema.getWalletSchema("emailOptional", "blackboxRequired"), ["creditCard"])
66
+ resolver: validation.validationResolver(walletSchema.getWalletSchema("emailOptional", "blackboxRequired"))
53
67
  });
54
68
  const formSetValue = form.setValue;
55
69
  useBlackBoxDetection.useBlackboxDetection({
@@ -67,24 +81,104 @@ const WalletForm = ({
67
81
  onSuccess: React.useCallback(bb => formSetValue("iovationBlackbox", bb), [formSetValue])
68
82
  });
69
83
  const watchAddress = form.watch("address");
84
+ const watchPaymentMethod = form.watch("paymentMethod");
85
+ const adyenOptions = React.useMemo(() => ({
86
+ showPayButton: false,
87
+ locale: locale || "en-US",
88
+ onChange: () => {
89
+ setPaymentError(null);
90
+ },
91
+ creditCardOptions: {
92
+ onLoad: event => {
93
+ if (event.iframesLoaded) {
94
+ setIsAdyenReady(true);
95
+ }
96
+ },
97
+ onBinLookup: event => {
98
+ var _a, _b;
99
+ // Some cards return multiple brands (e.g., ['star', 'visa']), so prioritize major brands
100
+ const majorBrands = ["visa", "mc", "amex", "discover"];
101
+ const brand = ((_a = event.detectedBrands) === null || _a === void 0 ? void 0 : _a.find(b => majorBrands.includes(b.toLowerCase()))) || ((_b = event.detectedBrands) === null || _b === void 0 ? void 0 : _b[0]);
102
+ setCardBrand(brand);
103
+ }
104
+ }
105
+ }), [locale]);
106
+ const {
107
+ adyenRef,
108
+ submit: adyenSubmit,
109
+ getSessionData
110
+ } = useFinancialService.useFinancialService({
111
+ getAdyenSessionData: sessionContext.getSessionData,
112
+ paymentMethod: watchPaymentMethod || "credit_card",
113
+ options: adyenOptions
114
+ });
115
+ // Reset Adyen ready state when payment method changes
116
+ React.useEffect(() => {
117
+ setIsAdyenReady(false);
118
+ }, [watchPaymentMethod]);
70
119
  const handleSubmit = form.handleSubmit(values => _tslib.__awaiter(void 0, void 0, void 0, function* () {
71
120
  const payload = values;
72
- yield validateAddress({
73
- addresses: {
74
- originAddress: payload.address
75
- },
76
- data: {
77
- creditCard: payload.creditCard,
78
- iovationBlackbox: payload.iovationBlackbox
79
- },
80
- onValid: validatedAddressesPayload => {
81
- onSubmit({
82
- address: validatedAddressesPayload.originAddress,
83
- creditCard: payload.creditCard,
121
+ setIsSubmitting(true);
122
+ try {
123
+ yield validateAddress({
124
+ addresses: {
125
+ originAddress: payload.address
126
+ },
127
+ data: {
84
128
  iovationBlackbox: payload.iovationBlackbox
85
- });
86
- }
87
- });
129
+ },
130
+ onValid: validatedAddressesPayload => {
131
+ const processPayment = () => _tslib.__awaiter(void 0, void 0, void 0, function* () {
132
+ try {
133
+ const walletPayload = {
134
+ address: validatedAddressesPayload.originAddress,
135
+ iovationBlackbox: payload.iovationBlackbox,
136
+ paymentMethod: payload.paymentMethod
137
+ };
138
+ if (payload.paymentMethod === "credit_card") {
139
+ // For credit card, await Adyen payment completion
140
+ const paymentResult = yield adyenSubmit();
141
+ if (!paymentResult.success) {
142
+ // Payment failed - show error and allow retry
143
+ setPaymentError(paymentResult.error || "Payment failed");
144
+ form.reset(undefined, {
145
+ keepValues: true
146
+ });
147
+ return;
148
+ }
149
+ // Payment succeeded - get session data and add to payload
150
+ const sessionData = getSessionData();
151
+ if (sessionData) {
152
+ walletPayload.auctanePaySessionId = sessionData.id;
153
+ }
154
+ if (cardBrand) {
155
+ walletPayload.cardBrand = cardBrand;
156
+ }
157
+ }
158
+ // Payment successful or non-credit-card method - proceed to next step
159
+ onSubmit(walletPayload);
160
+ } catch (error) {
161
+ // Payment processing error
162
+ const errorMessage = error instanceof Error ? error.message : "Payment processing failed";
163
+ setPaymentError(errorMessage);
164
+ } finally {
165
+ setIsSubmitting(false);
166
+ }
167
+ });
168
+ void processPayment();
169
+ }
170
+ });
171
+ } catch (error) {
172
+ // Address validation error
173
+ const errorMessage = error instanceof Error ? error.message : "An error occurred";
174
+ setCodedErrors([{
175
+ errorCode: "unspecified",
176
+ errorSource: "client",
177
+ errorType: "validation",
178
+ message: errorMessage
179
+ }]);
180
+ setIsSubmitting(false);
181
+ }
88
182
  }));
89
183
  const [editWalletAddressForm$1, isEditWalletAddressFormOpen, toggleIsEditWalletAddressFormOpen] = useNestedForm.useNestedForm(editWalletAddressForm.EditWalletAddressForm, {
90
184
  address: watchAddress,
@@ -99,9 +193,9 @@ const WalletForm = ({
99
193
  children: jsxRuntime.jsxs("form", {
100
194
  id: "wallet-form",
101
195
  onSubmit: formLogger.formLogger.capture(handleSubmit),
102
- children: [jsxRuntime.jsx(giger.GridChild, {
196
+ children: [jsxRuntime.jsxs(giger.GridChild, {
103
197
  colSpan: 12,
104
- children: !!(codedErrors === null || codedErrors === void 0 ? void 0 : codedErrors.length) && jsxRuntime.jsxs(jsxRuntime.Fragment, {
198
+ children: [!!(codedErrors === null || codedErrors === void 0 ? void 0 : codedErrors.length) && jsxRuntime.jsxs(jsxRuntime.Fragment, {
105
199
  children: [jsxRuntime.jsx(giger.InlineNotification, {
106
200
  title: t("register-wallet:sections.notifications.error.title"),
107
201
  type: giger.NotificationType.ERROR,
@@ -111,12 +205,47 @@ const WalletForm = ({
111
205
  }), jsxRuntime.jsx(spacer.Spacer, {
112
206
  multiplier: 2
113
207
  })]
208
+ }), paymentError && jsxRuntime.jsxs(jsxRuntime.Fragment, {
209
+ children: [jsxRuntime.jsx(giger.InlineNotification, {
210
+ title: t("register-wallet:sections.notifications.error.title"),
211
+ type: giger.NotificationType.ERROR,
212
+ children: paymentError
213
+ }), jsxRuntime.jsx(spacer.Spacer, {
214
+ multiplier: 2
215
+ })]
216
+ })]
217
+ }), jsxRuntime.jsx(giger.GridChild, {
218
+ colSpan: 12,
219
+ children: jsxRuntime.jsx(giger.Typography, {
220
+ variant: "subtitle1",
221
+ children: t("register-wallet:sections.paymentMethod.title")
114
222
  })
223
+ }), jsxRuntime.jsx(spacer.Spacer, {
224
+ multiplier: 1
115
225
  }), jsxRuntime.jsx(giger.GridChild, {
116
226
  colSpan: 12,
117
- children: jsxRuntime.jsx(billingFields.BillingFields, {
118
- form: form
227
+ children: jsxRuntime.jsx(paymentMethodSelector.PaymentMethodSelector, {
228
+ onChange: method => form.setValue("paymentMethod", method),
229
+ payByBankEnabled: (_b = (_a = getSessionData()) === null || _a === void 0 ? void 0 : _a.eligiblePaymentMethodTypes) === null || _b === void 0 ? void 0 : _b.includes("pay_by_bank_us"),
230
+ value: watchPaymentMethod || "credit_card"
119
231
  })
232
+ }), jsxRuntime.jsx(spacer.Spacer, {
233
+ multiplier: 2
234
+ }), jsxRuntime.jsxs(giger.GridChild, {
235
+ colSpan: 12,
236
+ children: [!isAdyenReady && jsxRuntime.jsx("div", {
237
+ css: walletForm_styles.styles.loadingContainer,
238
+ children: jsxRuntime.jsx(giger.Spinner, {
239
+ size: giger.SpinnerSize.SIZE_LARGE
240
+ })
241
+ }), jsxRuntime.jsx("div", {
242
+ css: walletForm_styles.styles.adyenContainer,
243
+ "data-ready": isAdyenReady,
244
+ "data-testid": "adyen-div",
245
+ ref: adyenRef
246
+ })]
247
+ }), jsxRuntime.jsx(spacer.Spacer, {
248
+ multiplier: 2
120
249
  }), jsxRuntime.jsx(giger.GridChild, {
121
250
  colSpan: 12,
122
251
  children: jsxRuntime.jsx(giger.Typography, {
@@ -167,6 +296,7 @@ const WalletForm = ({
167
296
  children: jsxRuntime.jsx(submitButton.SubmitButton, {
168
297
  control: form.control,
169
298
  form: "wallet-form",
299
+ isLoading: isSubmitting,
170
300
  variant: giger.ButtonVariant.FILLED,
171
301
  children: t("actions.continue")
172
302
  })
@@ -8,6 +8,21 @@ const styles = styles$1.createStyles({
8
8
  }),
9
9
  grid: theme => ({
10
10
  margin: styles$1.scopeTheme(theme).spacing(1)
11
+ }),
12
+ loadingContainer: theme => ({
13
+ display: "flex",
14
+ justifyContent: "center",
15
+ paddingTop: styles$1.scopeTheme(theme).spacing(2),
16
+ paddingBottom: styles$1.scopeTheme(theme).spacing(2)
17
+ }),
18
+ adyenContainer: () => ({
19
+ "&:not([data-ready='true'])": {
20
+ display: "none"
21
+ },
22
+ // Hide Adyen's "All fields are required" instruction text
23
+ "& .adyen-checkout-form-instruction": {
24
+ display: "none"
25
+ }
11
26
  })
12
27
  });
13
28
 
@@ -1,17 +1,11 @@
1
1
  'use strict';
2
2
 
3
- var _tslib = require('../../../_virtual/_tslib.cjs');
4
- var date = require('../../../utilities/date.cjs');
5
- var address$1 = require('../../../utilities/shipengine/address.cjs');
6
- var cardValidator = require('card-validator');
3
+ var address = require('../../../utilities/shipengine/address.cjs');
7
4
  var min = require('libphonenumber-js/min');
8
5
  var zod = require('zod');
9
6
  var addressSchema = require('../address-form/address-schema.cjs');
10
- var address = require('../../../constants/shipengine/address.cjs');
7
+ var address$1 = require('../../../constants/shipengine/address.cjs');
11
8
 
12
- const expirationYears = date.getExpirationYears(15);
13
- const creditCardTypes = ["visa", "mastercard", "american-express", "discover"];
14
- const expirationMonths = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"];
15
9
  const walletEmailSchemas = {
16
10
  emailOptional: addressSchema.addressSchema.shape.email,
17
11
  emailRequired: zod.z.string().trim().email().min(1)
@@ -22,12 +16,12 @@ const walletBlackboxSchemas = {
22
16
  };
23
17
  const getBillingAddressSchema = emailRequirement => {
24
18
  return addressSchema.addressSchema.extend({
25
- addressLine1: addressSchema.addressLine1Schema.refine(v => !address$1.isPoBox(v), "schemaErrors.invalidAddressPoBox"),
26
- addressLine2: addressSchema.addressLine2Schema.refine(v => !v || !address$1.isPoBox(v), "schemaErrors.invalidAddressPoBox"),
19
+ addressLine1: addressSchema.addressLine1Schema.refine(v => !address.isPoBox(v), "schemaErrors.invalidAddressPoBox"),
20
+ addressLine2: addressSchema.addressLine2Schema.refine(v => !v || !address.isPoBox(v), "schemaErrors.invalidAddressPoBox"),
27
21
  companyName: zod.z.string().trim().min(1),
28
22
  email: walletEmailSchemas[emailRequirement],
29
23
  phone: zod.z.string().trim().min(1)
30
- }).refine(schema => schema.name.match(address.addressNameRegex), {
24
+ }).refine(schema => schema.name.match(address$1.addressNameRegex), {
31
25
  message: "schemaErrors.invalidAddressNameOnboarding",
32
26
  path: ["name"]
33
27
  }).refine(schema => !schema.phone || min.isValidPhoneNumber(schema.phone, schema.countryCode), {
@@ -35,7 +29,7 @@ const getBillingAddressSchema = emailRequirement => {
35
29
  path: ["phone"]
36
30
  }).refine(schema => {
37
31
  if (schema.countryCode === "US") {
38
- return schema.stateProvince && address.usStateCodes.includes(schema.stateProvince);
32
+ return schema.stateProvince && address$1.usStateCodes.includes(schema.stateProvince);
39
33
  }
40
34
  return true;
41
35
  }, {
@@ -43,7 +37,7 @@ const getBillingAddressSchema = emailRequirement => {
43
37
  path: ["stateProvince"]
44
38
  }).refine(schema => {
45
39
  if (schema.countryCode === "US") {
46
- return address.postalCodeRegex.test(schema.postalCode);
40
+ return address$1.postalCodeRegex.test(schema.postalCode);
47
41
  }
48
42
  return true;
49
43
  }, {
@@ -51,40 +45,11 @@ const getBillingAddressSchema = emailRequirement => {
51
45
  path: ["postalCode"]
52
46
  });
53
47
  };
54
- const creditCardSchema = zod.z.object({
55
- cvv: zod.z.string().trim().refine(cvv => cardValidator.cvv(cvv, [3, 4]).isValid, "Invalid CVV"),
56
- expiration: zod.z.string().trim().refine(expiration => {
57
- const [expirationMonth, expirationYear] = expiration.split("/");
58
- return expirationMonths.includes(expirationMonth) && expirationYears.includes(expirationYear);
59
- }, "schemaErrors.invalidExpirationDate"),
60
- name: addressSchema.addressSchema.shape.name.refine(name => name.match(address.addressNameRegex), "schemaErrors.invalidAddressNameOnboarding"),
61
- number: zod.z.string().trim().refine(number => cardValidator.number(number).isValid, "Invalid card number").refine(number => {
62
- var _a, _b;
63
- return !((_a = cardValidator.number(number).card) === null || _a === void 0 ? void 0 : _a.type) || creditCardTypes.includes((_b = cardValidator.number(number).card) === null || _b === void 0 ? void 0 : _b.type);
64
- }, "schemaErrors.invalidCreditCardType")
65
- }).transform(schema => {
66
- var _a;
67
- const {
68
- cvv,
69
- expiration
70
- } = schema,
71
- creditCard = _tslib.__rest(schema, ["cvv", "expiration"]);
72
- const creditCardVendor = (_a = cardValidator.number(creditCard.number).card) === null || _a === void 0 ? void 0 : _a.type;
73
- const [expirationMonth, expirationYear] = expiration.split("/").map(v => parseInt(v, 10));
74
- return {
75
- cardNumber: creditCard.number,
76
- cvv: cvv,
77
- expirationMonth: expirationMonth,
78
- expirationYear: expirationYear,
79
- name: creditCard.name,
80
- provider: creditCardVendor === "american-express" ? "american_express" : creditCardVendor
81
- };
82
- });
83
48
  const getWalletSchema = (emailRequirement, blackboxRequirement) => {
84
49
  const billingAddressSchema = getBillingAddressSchema(emailRequirement);
85
50
  return zod.z.object({
86
51
  address: billingAddressSchema,
87
- creditCard: creditCardSchema,
52
+ paymentMethod: zod.z.enum(["credit_card", "pay_by_bank_us"]).default("credit_card"),
88
53
  iovationBlackbox: walletBlackboxSchemas[blackboxRequirement]
89
54
  });
90
55
  };
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ var paymentMethodSelector = require('./payment-method-selector.cjs');
4
+
5
+
6
+
7
+ exports.PaymentMethodSelector = paymentMethodSelector.PaymentMethodSelector;
@@ -0,0 +1,55 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('@emotion/react/jsx-runtime');
4
+ var giger = require('@shipengine/giger');
5
+ var gigerTheme = require('@shipengine/giger-theme');
6
+ var reactI18next = require('react-i18next');
7
+ var paymentMethodSelector_styles = require('./payment-method-selector.styles.cjs');
8
+
9
+ const PaymentMethodSelector = ({
10
+ name = "paymentMethod",
11
+ onChange,
12
+ payByBankEnabled = false,
13
+ value
14
+ }) => {
15
+ const {
16
+ t
17
+ } = reactI18next.useTranslation("register-wallet");
18
+ const paymentMethods = [{
19
+ value: "credit_card",
20
+ icon: gigerTheme.IconNames.CREDIT_CARD,
21
+ label: t("sections.paymentMethod.creditCard")
22
+ }, payByBankEnabled ? {
23
+ value: "pay_by_bank_us",
24
+ icon: gigerTheme.IconNames.BANK,
25
+ label: t("sections.paymentMethod.payByBank")
26
+ } : undefined];
27
+ return jsxRuntime.jsx("div", {
28
+ css: paymentMethodSelector_styles.styles.paymentMethodSelector,
29
+ children: jsxRuntime.jsx(giger.RadioGroup, {
30
+ name: name,
31
+ onChange: e => onChange(e.target.value),
32
+ value: value,
33
+ children: paymentMethods.map(method => {
34
+ return method !== undefined ? jsxRuntime.jsx("div", {
35
+ css: [paymentMethodSelector_styles.styles.paymentMethodOption, value === method.value && paymentMethodSelector_styles.styles.paymentMethodOptionSelected],
36
+ onClick: () => onChange(method.value),
37
+ children: jsxRuntime.jsx(giger.Radio, {
38
+ checked: value === method.value,
39
+ readOnly: true,
40
+ value: method.value,
41
+ children: jsxRuntime.jsxs("div", {
42
+ css: paymentMethodSelector_styles.styles.paymentMethodOptionContent,
43
+ children: [jsxRuntime.jsx(giger.Icon, {
44
+ name: method.icon,
45
+ size: giger.IconSize.SIZE_SMALL
46
+ }), method.label]
47
+ })
48
+ })
49
+ }, method.value) : null;
50
+ })
51
+ })
52
+ });
53
+ };
54
+
55
+ exports.PaymentMethodSelector = PaymentMethodSelector;
@@ -0,0 +1,58 @@
1
+ 'use strict';
2
+
3
+ var styles$1 = require('../../../utilities/styles.cjs');
4
+
5
+ const styles = styles$1.createStyles({
6
+ paymentMethodSelector: () => ({
7
+ display: "flex",
8
+ flexDirection: "column",
9
+ gap: "12px",
10
+ "& .giger-radio-group": {
11
+ display: "flex",
12
+ flexDirection: "column",
13
+ gap: "12px"
14
+ }
15
+ }),
16
+ paymentMethodOption: theme => ({
17
+ padding: styles$1.scopeTheme(theme).spacing(2),
18
+ border: `1px solid ${styles$1.scopeTheme(theme).palette.gray.light}`,
19
+ borderRadius: styles$1.scopeTheme(theme).spacing(),
20
+ background: styles$1.scopeTheme(theme).palette.white,
21
+ marginBottom: styles$1.scopeTheme(theme).spacing(1),
22
+ transition: "all 0.2s ease",
23
+ cursor: "pointer",
24
+ "&:hover": {
25
+ borderColor: styles$1.scopeTheme(theme).palette.primary.main
26
+ },
27
+ "& .giger-radio": {
28
+ margin: 0,
29
+ width: "100%",
30
+ pointerEvents: "none",
31
+ // Disable pointer events on radio to let div handle clicks
32
+ "& .giger-radio__container": {
33
+ width: "100%",
34
+ justifyContent: "flex-start"
35
+ },
36
+ "& .giger-radio__label": {
37
+ fontWeight: 500,
38
+ marginLeft: styles$1.scopeTheme(theme).spacing(1),
39
+ flex: 1,
40
+ cursor: "pointer"
41
+ },
42
+ "& .giger-radio__input": {
43
+ pointerEvents: "auto" // Re-enable pointer events on the actual input
44
+ }
45
+ }
46
+ }),
47
+ paymentMethodOptionSelected: theme => ({
48
+ borderColor: styles$1.scopeTheme(theme).palette.primary.main,
49
+ backgroundColor: styles$1.scopeTheme(theme).palette.gray.megaLight
50
+ }),
51
+ paymentMethodOptionContent: () => ({
52
+ display: "flex",
53
+ alignItems: "center",
54
+ gap: "8px"
55
+ })
56
+ });
57
+
58
+ exports.styles = styles;