@easypayment/medusa-payment-paypal 0.9.4 → 0.9.5

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 (190) hide show
  1. package/.medusa/server/src/admin/index.d.ts +2 -0
  2. package/.medusa/server/src/admin/index.d.ts.map +1 -0
  3. package/.medusa/server/src/admin/index.js +194 -239
  4. package/.medusa/server/src/admin/index.js.map +1 -0
  5. package/.medusa/server/src/admin/index.mjs +195 -240
  6. package/.medusa/server/src/admin/routes/settings/paypal/_components/FieldRow.d.ts +8 -0
  7. package/.medusa/server/src/admin/routes/settings/paypal/_components/FieldRow.d.ts.map +1 -0
  8. package/.medusa/server/src/admin/routes/settings/paypal/_components/FieldRow.js +8 -0
  9. package/.medusa/server/src/admin/routes/settings/paypal/_components/FieldRow.js.map +1 -0
  10. package/.medusa/server/src/admin/routes/settings/paypal/_components/SectionCard.d.ts +8 -0
  11. package/.medusa/server/src/admin/routes/settings/paypal/_components/SectionCard.d.ts.map +1 -0
  12. package/.medusa/server/src/admin/routes/settings/paypal/_components/SectionCard.js +8 -0
  13. package/.medusa/server/src/admin/routes/settings/paypal/_components/SectionCard.js.map +1 -0
  14. package/.medusa/server/src/admin/routes/settings/paypal/_components/Tabs.d.ts +2 -0
  15. package/.medusa/server/src/admin/routes/settings/paypal/_components/Tabs.d.ts.map +1 -0
  16. package/.medusa/server/src/admin/routes/settings/paypal/_components/Tabs.js +25 -0
  17. package/.medusa/server/src/admin/routes/settings/paypal/_components/Tabs.js.map +1 -0
  18. package/.medusa/server/src/admin/routes/settings/paypal/_components/Toast.d.ts +12 -0
  19. package/.medusa/server/src/admin/routes/settings/paypal/_components/Toast.d.ts.map +1 -0
  20. package/.medusa/server/src/admin/routes/settings/paypal/_components/Toast.js +22 -0
  21. package/.medusa/server/src/admin/routes/settings/paypal/_components/Toast.js.map +1 -0
  22. package/.medusa/server/src/admin/routes/settings/paypal/_utils/adminFetch.d.ts +7 -0
  23. package/.medusa/server/src/admin/routes/settings/paypal/_utils/adminFetch.d.ts.map +1 -0
  24. package/.medusa/server/src/admin/routes/settings/paypal/_utils/adminFetch.js +40 -0
  25. package/.medusa/server/src/admin/routes/settings/paypal/_utils/adminFetch.js.map +1 -0
  26. package/.medusa/server/src/admin/routes/settings/paypal/additional-settings/page.d.ts +2 -0
  27. package/.medusa/server/src/admin/routes/settings/paypal/additional-settings/page.d.ts.map +1 -0
  28. package/.medusa/server/src/admin/routes/settings/paypal/additional-settings/page.js +76 -0
  29. package/.medusa/server/src/admin/routes/settings/paypal/additional-settings/page.js.map +1 -0
  30. package/.medusa/server/src/admin/routes/settings/paypal/advanced-card-payments/page.d.ts +2 -0
  31. package/.medusa/server/src/admin/routes/settings/paypal/advanced-card-payments/page.d.ts.map +1 -0
  32. package/.medusa/server/src/admin/routes/settings/paypal/advanced-card-payments/page.js +81 -0
  33. package/.medusa/server/src/admin/routes/settings/paypal/advanced-card-payments/page.js.map +1 -0
  34. package/.medusa/server/src/admin/routes/settings/paypal/apple-pay/page.d.ts +2 -0
  35. package/.medusa/server/src/admin/routes/settings/paypal/apple-pay/page.d.ts.map +1 -0
  36. package/.medusa/server/src/admin/routes/settings/paypal/apple-pay/page.js +9 -0
  37. package/.medusa/server/src/admin/routes/settings/paypal/apple-pay/page.js.map +1 -0
  38. package/.medusa/server/src/admin/routes/settings/paypal/connection/page.d.ts +20 -0
  39. package/.medusa/server/src/admin/routes/settings/paypal/connection/page.d.ts.map +1 -0
  40. package/.medusa/server/src/admin/routes/settings/paypal/connection/page.js +440 -0
  41. package/.medusa/server/src/admin/routes/settings/paypal/connection/page.js.map +1 -0
  42. package/.medusa/server/src/admin/routes/settings/paypal/google-pay/page.d.ts +2 -0
  43. package/.medusa/server/src/admin/routes/settings/paypal/google-pay/page.d.ts.map +1 -0
  44. package/.medusa/server/src/admin/routes/settings/paypal/google-pay/page.js +9 -0
  45. package/.medusa/server/src/admin/routes/settings/paypal/google-pay/page.js.map +1 -0
  46. package/.medusa/server/src/admin/routes/settings/paypal/page.d.ts +4 -0
  47. package/.medusa/server/src/admin/routes/settings/paypal/page.d.ts.map +1 -0
  48. package/.medusa/server/src/admin/routes/settings/paypal/page.js +14 -0
  49. package/.medusa/server/src/admin/routes/settings/paypal/page.js.map +1 -0
  50. package/.medusa/server/src/admin/routes/settings/paypal/pay-later-messaging/page.d.ts +2 -0
  51. package/.medusa/server/src/admin/routes/settings/paypal/pay-later-messaging/page.d.ts.map +1 -0
  52. package/.medusa/server/src/admin/routes/settings/paypal/pay-later-messaging/page.js +9 -0
  53. package/.medusa/server/src/admin/routes/settings/paypal/pay-later-messaging/page.js.map +1 -0
  54. package/.medusa/server/src/admin/routes/settings/paypal/paypal-settings/page.d.ts +2 -0
  55. package/.medusa/server/src/admin/routes/settings/paypal/paypal-settings/page.d.ts.map +1 -0
  56. package/.medusa/server/src/admin/routes/settings/paypal/paypal-settings/page.js +109 -0
  57. package/.medusa/server/src/admin/routes/settings/paypal/paypal-settings/page.js.map +1 -0
  58. package/.medusa/server/src/api/admin/payment-collections/[id]/payment-sessions/route.d.ts +1 -1
  59. package/.medusa/server/src/api/admin/payment-collections/[id]/payment-sessions/route.d.ts.map +1 -1
  60. package/.medusa/server/src/api/admin/payment-collections/[id]/payment-sessions/route.js +24 -9
  61. package/.medusa/server/src/api/admin/payment-collections/[id]/payment-sessions/route.js.map +1 -1
  62. package/.medusa/server/src/api/admin/paypal/disconnect/route.d.ts.map +1 -1
  63. package/.medusa/server/src/api/admin/paypal/disconnect/route.js +10 -3
  64. package/.medusa/server/src/api/admin/paypal/disconnect/route.js.map +1 -1
  65. package/.medusa/server/src/api/admin/paypal/environment/route.js +2 -2
  66. package/.medusa/server/src/api/admin/paypal/environment/route.js.map +1 -1
  67. package/.medusa/server/src/api/admin/paypal/onboard-complete/route.d.ts.map +1 -1
  68. package/.medusa/server/src/api/admin/paypal/onboard-complete/route.js +3 -2
  69. package/.medusa/server/src/api/admin/paypal/onboard-complete/route.js.map +1 -1
  70. package/.medusa/server/src/api/admin/paypal/onboarding-link/route.js +1 -1
  71. package/.medusa/server/src/api/admin/paypal/onboarding-link/route.js.map +1 -1
  72. package/.medusa/server/src/api/admin/paypal/onboarding-status/route.js +4 -4
  73. package/.medusa/server/src/api/admin/paypal/onboarding-status/route.js.map +1 -1
  74. package/.medusa/server/src/api/admin/paypal/save-credentials/route.d.ts.map +1 -1
  75. package/.medusa/server/src/api/admin/paypal/save-credentials/route.js +21 -8
  76. package/.medusa/server/src/api/admin/paypal/save-credentials/route.js.map +1 -1
  77. package/.medusa/server/src/api/admin/paypal/settings/route.d.ts.map +1 -1
  78. package/.medusa/server/src/api/admin/paypal/settings/route.js +34 -4
  79. package/.medusa/server/src/api/admin/paypal/settings/route.js.map +1 -1
  80. package/.medusa/server/src/api/admin/paypal/status/route.d.ts.map +1 -1
  81. package/.medusa/server/src/api/admin/paypal/status/route.js +11 -5
  82. package/.medusa/server/src/api/admin/paypal/status/route.js.map +1 -1
  83. package/.medusa/server/src/api/store/paypal/capture-order/route.d.ts.map +1 -1
  84. package/.medusa/server/src/api/store/paypal/capture-order/route.js +21 -3
  85. package/.medusa/server/src/api/store/paypal/capture-order/route.js.map +1 -1
  86. package/.medusa/server/src/api/store/paypal/config/route.js +2 -2
  87. package/.medusa/server/src/api/store/paypal/config/route.js.map +1 -1
  88. package/.medusa/server/src/api/store/paypal/create-order/route.d.ts.map +1 -1
  89. package/.medusa/server/src/api/store/paypal/create-order/route.js +13 -9
  90. package/.medusa/server/src/api/store/paypal/create-order/route.js.map +1 -1
  91. package/.medusa/server/src/api/store/paypal/settings/route.js +3 -3
  92. package/.medusa/server/src/api/store/paypal/settings/route.js.map +1 -1
  93. package/.medusa/server/src/api/store/paypal/webhook/route.d.ts.map +1 -1
  94. package/.medusa/server/src/api/store/paypal/webhook/route.js +10 -3
  95. package/.medusa/server/src/api/store/paypal/webhook/route.js.map +1 -1
  96. package/.medusa/server/src/api/store/paypal-complete/route.d.ts.map +1 -1
  97. package/.medusa/server/src/api/store/paypal-complete/route.js +7 -4
  98. package/.medusa/server/src/api/store/paypal-complete/route.js.map +1 -1
  99. package/.medusa/server/src/modules/paypal/clients/paypal-seller.client.js +3 -3
  100. package/.medusa/server/src/modules/paypal/clients/paypal-seller.client.js.map +1 -1
  101. package/.medusa/server/src/modules/paypal/migrations/20270101090000_set_paypal_environment_default_live.d.ts +1 -1
  102. package/.medusa/server/src/modules/paypal/migrations/20270101090000_set_paypal_environment_default_live.d.ts.map +1 -1
  103. package/.medusa/server/src/modules/paypal/migrations/20270101090000_set_paypal_environment_default_live.js +1 -1
  104. package/.medusa/server/src/modules/paypal/migrations/20270101090000_set_paypal_environment_default_live.js.map +1 -1
  105. package/.medusa/server/src/modules/paypal/migrations/20270102090000_add_paypal_seller_email.d.ts +1 -1
  106. package/.medusa/server/src/modules/paypal/migrations/20270102090000_add_paypal_seller_email.d.ts.map +1 -1
  107. package/.medusa/server/src/modules/paypal/migrations/20270102090000_add_paypal_seller_email.js +1 -1
  108. package/.medusa/server/src/modules/paypal/migrations/20270102090000_add_paypal_seller_email.js.map +1 -1
  109. package/.medusa/server/src/modules/paypal/migrations/20270103090000_add_paypal_seller_merchant_id.d.ts +1 -1
  110. package/.medusa/server/src/modules/paypal/migrations/20270103090000_add_paypal_seller_merchant_id.d.ts.map +1 -1
  111. package/.medusa/server/src/modules/paypal/migrations/20270103090000_add_paypal_seller_merchant_id.js +1 -1
  112. package/.medusa/server/src/modules/paypal/migrations/20270103090000_add_paypal_seller_merchant_id.js.map +1 -1
  113. package/.medusa/server/src/modules/paypal/migrations/20270202000000_align_nullable_defaults.d.ts +6 -0
  114. package/.medusa/server/src/modules/paypal/migrations/20270202000000_align_nullable_defaults.d.ts.map +1 -0
  115. package/.medusa/server/src/modules/paypal/migrations/20270202000000_align_nullable_defaults.js +25 -0
  116. package/.medusa/server/src/modules/paypal/migrations/20270202000000_align_nullable_defaults.js.map +1 -0
  117. package/.medusa/server/src/modules/paypal/models/paypal_connection.d.ts +1 -1
  118. package/.medusa/server/src/modules/paypal/models/paypal_connection.js +3 -3
  119. package/.medusa/server/src/modules/paypal/models/paypal_connection.js.map +1 -1
  120. package/.medusa/server/src/modules/paypal/models/paypal_metric.d.ts +1 -1
  121. package/.medusa/server/src/modules/paypal/models/paypal_metric.js +1 -1
  122. package/.medusa/server/src/modules/paypal/models/paypal_metric.js.map +1 -1
  123. package/.medusa/server/src/modules/paypal/models/paypal_webhook_event.d.ts +1 -1
  124. package/.medusa/server/src/modules/paypal/models/paypal_webhook_event.js +1 -1
  125. package/.medusa/server/src/modules/paypal/models/paypal_webhook_event.js.map +1 -1
  126. package/.medusa/server/src/modules/paypal/payment-provider/card-service.d.ts.map +1 -1
  127. package/.medusa/server/src/modules/paypal/payment-provider/card-service.js +95 -76
  128. package/.medusa/server/src/modules/paypal/payment-provider/card-service.js.map +1 -1
  129. package/.medusa/server/src/modules/paypal/payment-provider/service.d.ts.map +1 -1
  130. package/.medusa/server/src/modules/paypal/payment-provider/service.js +39 -89
  131. package/.medusa/server/src/modules/paypal/payment-provider/service.js.map +1 -1
  132. package/.medusa/server/src/modules/paypal/payment-provider/webhook-utils.d.ts.map +1 -1
  133. package/.medusa/server/src/modules/paypal/payment-provider/webhook-utils.js +7 -0
  134. package/.medusa/server/src/modules/paypal/payment-provider/webhook-utils.js.map +1 -1
  135. package/.medusa/server/src/modules/paypal/service.d.ts +10 -8
  136. package/.medusa/server/src/modules/paypal/service.d.ts.map +1 -1
  137. package/.medusa/server/src/modules/paypal/service.js +56 -51
  138. package/.medusa/server/src/modules/paypal/service.js.map +1 -1
  139. package/.medusa/server/src/modules/paypal/types/config.d.ts.map +1 -1
  140. package/.medusa/server/src/modules/paypal/types/config.js +11 -2
  141. package/.medusa/server/src/modules/paypal/types/config.js.map +1 -1
  142. package/.medusa/server/src/modules/paypal/utils/paypal-auth.d.ts.map +1 -1
  143. package/.medusa/server/src/modules/paypal/utils/paypal-auth.js +1 -0
  144. package/.medusa/server/src/modules/paypal/utils/paypal-auth.js.map +1 -1
  145. package/.medusa/server/src/modules/paypal/webhook-processor.d.ts.map +1 -1
  146. package/.medusa/server/src/modules/paypal/webhook-processor.js +1 -1
  147. package/.medusa/server/src/modules/paypal/webhook-processor.js.map +1 -1
  148. package/.medusa/server/src/subscribers/paypal-order-invoice.js +4 -4
  149. package/.medusa/server/src/subscribers/paypal-order-invoice.js.map +1 -1
  150. package/package.json +1 -1
  151. package/src/admin/index.ts +1 -7
  152. package/src/admin/routes/settings/paypal/_components/FieldRow.tsx +29 -0
  153. package/src/admin/routes/settings/paypal/_components/SectionCard.tsx +26 -0
  154. package/src/admin/routes/settings/paypal/_components/Toast.tsx +4 -3
  155. package/src/admin/routes/settings/paypal/_utils/adminFetch.ts +32 -0
  156. package/src/admin/routes/settings/paypal/additional-settings/page.tsx +23 -83
  157. package/src/admin/routes/settings/paypal/advanced-card-payments/page.tsx +17 -77
  158. package/src/admin/routes/settings/paypal/connection/page.tsx +86 -45
  159. package/src/admin/routes/settings/paypal/paypal-settings/page.tsx +23 -101
  160. package/src/api/admin/payment-collections/[id]/payment-sessions/route.ts +26 -9
  161. package/src/api/admin/paypal/disconnect/route.ts +9 -3
  162. package/src/api/admin/paypal/environment/route.ts +2 -2
  163. package/src/api/admin/paypal/onboard-complete/route.ts +4 -3
  164. package/src/api/admin/paypal/onboarding-link/route.ts +1 -1
  165. package/src/api/admin/paypal/onboarding-status/route.ts +5 -5
  166. package/src/api/admin/paypal/save-credentials/route.ts +24 -9
  167. package/src/api/admin/paypal/settings/route.ts +35 -4
  168. package/src/api/admin/paypal/status/route.ts +10 -5
  169. package/src/api/store/paypal/capture-order/route.ts +27 -3
  170. package/src/api/store/paypal/config/route.ts +2 -2
  171. package/src/api/store/paypal/create-order/route.ts +16 -10
  172. package/src/api/store/paypal/settings/route.ts +3 -3
  173. package/src/api/store/paypal/webhook/route.ts +13 -3
  174. package/src/api/store/paypal-complete/route.ts +8 -4
  175. package/src/modules/paypal/clients/paypal-seller.client.ts +3 -3
  176. package/src/modules/paypal/migrations/20270101090000_set_paypal_environment_default_live.ts +1 -1
  177. package/src/modules/paypal/migrations/20270102090000_add_paypal_seller_email.ts +1 -1
  178. package/src/modules/paypal/migrations/20270103090000_add_paypal_seller_merchant_id.ts +1 -1
  179. package/src/modules/paypal/migrations/20270202000000_align_nullable_defaults.ts +44 -0
  180. package/src/modules/paypal/models/paypal_connection.ts +3 -3
  181. package/src/modules/paypal/models/paypal_metric.ts +1 -1
  182. package/src/modules/paypal/models/paypal_webhook_event.ts +1 -1
  183. package/src/modules/paypal/payment-provider/card-service.ts +120 -80
  184. package/src/modules/paypal/payment-provider/service.ts +44 -93
  185. package/src/modules/paypal/payment-provider/webhook-utils.ts +9 -0
  186. package/src/modules/paypal/service.ts +79 -66
  187. package/src/modules/paypal/types/config.ts +18 -2
  188. package/src/modules/paypal/utils/paypal-auth.ts +1 -0
  189. package/src/modules/paypal/webhook-processor.ts +8 -5
  190. package/src/subscribers/paypal-order-invoice.ts +4 -4
@@ -34,7 +34,73 @@ function PayPalTabs() {
34
34
  );
35
35
  }) }) });
36
36
  }
37
- async function adminFetch$2(path, opts = {}) {
37
+ function SectionCard({
38
+ title,
39
+ description,
40
+ children,
41
+ right
42
+ }) {
43
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-xl border border-ui-border-base bg-ui-bg-base shadow-sm", children: [
44
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-4 border-b border-ui-border-base p-4", children: [
45
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
46
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base font-semibold text-ui-fg-base", children: title }),
47
+ description ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 text-sm text-ui-fg-subtle", children: description }) : null
48
+ ] }),
49
+ right
50
+ ] }),
51
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-4", children })
52
+ ] });
53
+ }
54
+ function FieldRow({
55
+ label,
56
+ hint,
57
+ htmlFor,
58
+ children
59
+ }) {
60
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-12 items-start gap-4 py-3", children: [
61
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "col-span-12 md:col-span-4", children: [
62
+ htmlFor ? /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor, className: "text-sm font-medium text-ui-fg-base", children: label }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm font-medium text-ui-fg-base", children: label }),
63
+ hint ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 text-xs text-ui-fg-subtle", children: hint }) : null
64
+ ] }),
65
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-12 md:col-span-8", children })
66
+ ] });
67
+ }
68
+ function Toast({ toast, onClose }) {
69
+ react.useEffect(() => {
70
+ if (!toast) return;
71
+ const duration = toast.kind === "error" ? 5e3 : 2500;
72
+ const t = setTimeout(() => onClose(), duration);
73
+ return () => clearTimeout(t);
74
+ }, [toast, onClose]);
75
+ if (!toast) return null;
76
+ const isSuccess = toast.kind === "success";
77
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "fixed right-6 top-6 z-[9999]", children: /* @__PURE__ */ jsxRuntime.jsx(
78
+ "div",
79
+ {
80
+ className: [
81
+ "min-w-[280px] max-w-[420px] rounded-lg border px-4 py-3 shadow-md",
82
+ isSuccess ? "border-emerald-500/30 bg-emerald-500/10" : "border-rose-500/30 bg-rose-500/10"
83
+ ].join(" "),
84
+ role: isSuccess ? "status" : "alert",
85
+ "aria-live": isSuccess ? "polite" : "assertive",
86
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3", children: [
87
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: ["mt-0.5 h-2.5 w-2.5 rounded-full", isSuccess ? "bg-emerald-500" : "bg-rose-500"].join(" ") }),
88
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 text-sm text-ui-fg-base", children: toast.message }),
89
+ /* @__PURE__ */ jsxRuntime.jsx(
90
+ "button",
91
+ {
92
+ type: "button",
93
+ onClick: onClose,
94
+ className: "text-ui-fg-subtle hover:text-ui-fg-base",
95
+ "aria-label": "Close",
96
+ children: "×"
97
+ }
98
+ )
99
+ ] })
100
+ }
101
+ ) });
102
+ }
103
+ async function adminFetch(path, opts = {}) {
38
104
  var _a;
39
105
  const { method = "GET", body, query } = opts;
40
106
  let url = path;
@@ -73,7 +139,7 @@ const DEFAULT_FORM$1 = {
73
139
  landingPage: "no_preference",
74
140
  requireInstantPayment: false,
75
141
  sendItemDetails: true,
76
- invoicePrefix: "WC-",
142
+ invoicePrefix: "PP-",
77
143
  creditCardStatementName: "PayPal"
78
144
  };
79
145
  function mergeWithDefaults$1(saved) {
@@ -81,40 +147,20 @@ function mergeWithDefaults$1(saved) {
81
147
  const entries = Object.entries(saved).filter(([, value]) => value !== void 0);
82
148
  return { ...DEFAULT_FORM$1, ...Object.fromEntries(entries) };
83
149
  }
84
- function SectionCard$2({ title, description, right, children }) {
85
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-xl border border-ui-border-base bg-ui-bg-base shadow-sm", children: [
86
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-4 border-b border-ui-border-base p-4", children: [
87
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
88
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base font-semibold text-ui-fg-base", children: title }),
89
- description ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 text-sm text-ui-fg-subtle", children: description }) : null
90
- ] }),
91
- right
92
- ] }),
93
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-4", children })
94
- ] });
95
- }
96
- function FieldRow$2({ label, hint, children }) {
97
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-12 items-start gap-4 py-3", children: [
98
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "col-span-12 md:col-span-4", children: [
99
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm font-medium text-ui-fg-base", children: label }),
100
- hint ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 text-xs text-ui-fg-subtle", children: hint }) : null
101
- ] }),
102
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-12 md:col-span-8", children })
103
- ] });
104
- }
105
150
  function AdditionalSettingsTab() {
106
151
  const [form, setForm] = react.useState(() => ({ ...DEFAULT_FORM$1 }));
107
152
  const [loading, setLoading] = react.useState(false);
108
153
  const [saving, setSaving] = react.useState(false);
109
154
  const [toast, setToast] = react.useState(null);
110
155
  const didInit = react.useRef(false);
156
+ const dismissToast = react.useCallback(() => setToast(null), []);
111
157
  react.useEffect(() => {
112
158
  if (didInit.current) return;
113
159
  didInit.current = true;
114
160
  (async () => {
115
161
  try {
116
162
  setLoading(true);
117
- const json = await adminFetch$2("/admin/paypal/settings");
163
+ const json = await adminFetch("/admin/paypal/settings");
118
164
  const payload = (json == null ? void 0 : json.data) ?? json;
119
165
  const saved = payload == null ? void 0 : payload.additional_settings;
120
166
  if (saved && typeof saved === "object") setForm(mergeWithDefaults$1(saved));
@@ -128,15 +174,13 @@ function AdditionalSettingsTab() {
128
174
  try {
129
175
  setSaving(true);
130
176
  setToast(null);
131
- const json = await adminFetch$2("/admin/paypal/settings", { method: "POST", body: { additional_settings: form } });
177
+ const json = await adminFetch("/admin/paypal/settings", { method: "POST", body: { additional_settings: form } });
132
178
  const payload = (json == null ? void 0 : json.data) ?? json;
133
179
  const saved = payload == null ? void 0 : payload.additional_settings;
134
180
  if (saved && typeof saved === "object") setForm(mergeWithDefaults$1(saved));
135
- setToast({ type: "success", message: "Settings saved" });
136
- window.setTimeout(() => setToast(null), 2500);
181
+ setToast({ kind: "success", message: "Settings saved" });
137
182
  } catch (e) {
138
- setToast({ type: "error", message: e instanceof Error ? e.message : "Failed to save settings" });
139
- window.setTimeout(() => setToast(null), 3500);
183
+ setToast({ kind: "error", message: e instanceof Error ? e.message : "Failed to save settings" });
140
184
  } finally {
141
185
  setSaving(false);
142
186
  }
@@ -144,74 +188,44 @@ function AdditionalSettingsTab() {
144
188
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-6", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-6", children: [
145
189
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-start justify-between gap-4", children: /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-xl font-semibold text-ui-fg-base", children: "PayPal Gateway By Easy Payment" }) }) }),
146
190
  /* @__PURE__ */ jsxRuntime.jsx(PayPalTabs, {}),
147
- toast ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "fixed right-6 top-6 z-50 rounded-md border border-ui-border-base bg-ui-bg-base px-4 py-3 text-sm shadow-lg", role: "status", "aria-live": "polite", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: toast.type === "success" ? "text-ui-fg-base" : "text-ui-fg-error", children: toast.message }) }) : null,
191
+ /* @__PURE__ */ jsxRuntime.jsx(Toast, { toast, onClose: dismissToast }),
148
192
  /* @__PURE__ */ jsxRuntime.jsx(
149
- SectionCard$2,
193
+ SectionCard,
150
194
  {
151
195
  title: "Additional Settings",
152
196
  description: "These settings control checkout behavior and PayPal experience.",
153
197
  right: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
154
198
  /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: onSave, disabled: saving || loading, className: "transition-fg relative inline-flex w-fit items-center justify-center overflow-hidden rounded-md outline-none shadow-buttons-neutral text-ui-fg-base bg-ui-button-neutral after:transition-fg after:absolute after:inset-0 after:content-[''] after:button-neutral-gradient hover:bg-ui-button-neutral-hover hover:after:button-neutral-hover-gradient active:bg-ui-button-neutral-pressed active:after:button-neutral-pressed-gradient focus-visible:shadow-buttons-neutral-focus disabled:bg-ui-bg-disabled disabled:border-ui-border-base disabled:text-ui-fg-disabled disabled:shadow-buttons-neutral disabled:after:hidden txt-compact-small-plus px-3 py-1.5", children: saving ? "Saving..." : "Save settings" }),
155
- loading ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-ui-fg-subtle", children: "Loading..." }) : null
199
+ loading ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-ui-fg-subtle", children: "Loading" }) : null
156
200
  ] }),
157
201
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "divide-y divide-ui-border-base", children: [
158
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow$2, { label: "Payment action", children: /* @__PURE__ */ jsxRuntime.jsxs("select", { value: form.paymentAction, onChange: (e) => setForm((p) => ({ ...p, paymentAction: e.target.value })), className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive", children: [
202
+ /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Payment action", htmlFor: "as-payment-action", children: /* @__PURE__ */ jsxRuntime.jsxs("select", { id: "as-payment-action", value: form.paymentAction, onChange: (e) => setForm((p) => ({ ...p, paymentAction: e.target.value })), className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive", children: [
159
203
  /* @__PURE__ */ jsxRuntime.jsx("option", { value: "capture", children: "Capture" }),
160
204
  /* @__PURE__ */ jsxRuntime.jsx("option", { value: "authorize", children: "Authorize" })
161
205
  ] }) }),
162
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow$2, { label: "Brand Name", children: /* @__PURE__ */ jsxRuntime.jsx("input", { value: form.brandName, onChange: (e) => setForm((p) => ({ ...p, brandName: e.target.value })), className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive", placeholder: "PayPal" }) }),
163
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow$2, { label: "Landing Page", children: /* @__PURE__ */ jsxRuntime.jsxs("select", { value: form.landingPage, onChange: (e) => setForm((p) => ({ ...p, landingPage: e.target.value })), className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive", children: [
206
+ /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Brand Name", htmlFor: "as-brand-name", children: /* @__PURE__ */ jsxRuntime.jsx("input", { id: "as-brand-name", value: form.brandName, onChange: (e) => setForm((p) => ({ ...p, brandName: e.target.value })), className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive", placeholder: "PayPal" }) }),
207
+ /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Landing Page", htmlFor: "as-landing-page", children: /* @__PURE__ */ jsxRuntime.jsxs("select", { id: "as-landing-page", value: form.landingPage, onChange: (e) => setForm((p) => ({ ...p, landingPage: e.target.value })), className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive", children: [
164
208
  /* @__PURE__ */ jsxRuntime.jsx("option", { value: "no_preference", children: "No Preference" }),
165
209
  /* @__PURE__ */ jsxRuntime.jsx("option", { value: "login", children: "Login" }),
166
210
  /* @__PURE__ */ jsxRuntime.jsx("option", { value: "billing", children: "Billing" })
167
211
  ] }) }),
168
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow$2, { label: "Instant Payments", children: /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "inline-flex items-center gap-2", children: [
212
+ /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Instant Payments", children: /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "inline-flex items-center gap-2", children: [
169
213
  /* @__PURE__ */ jsxRuntime.jsx("input", { type: "checkbox", checked: form.requireInstantPayment, onChange: (e) => setForm((p) => ({ ...p, requireInstantPayment: e.target.checked })), className: "h-4 w-4 rounded border-ui-border-base" }),
170
214
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-ui-fg-base", children: "Require Instant Payment" })
171
215
  ] }) }),
172
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow$2, { label: "Send Item Details", hint: "Include all line item details in the payment request to PayPal so that they can be seen from the PayPal transaction details page.", children: /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "inline-flex items-center gap-2", children: [
216
+ /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Send Item Details", hint: "Include all line item details in the payment request to PayPal so that they can be seen from the PayPal transaction details page.", children: /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "inline-flex items-center gap-2", children: [
173
217
  /* @__PURE__ */ jsxRuntime.jsx("input", { type: "checkbox", checked: form.sendItemDetails, onChange: (e) => setForm((p) => ({ ...p, sendItemDetails: e.target.checked })), className: "h-4 w-4 rounded border-ui-border-base" }),
174
218
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-ui-fg-base", children: "Send line item details to PayPal" })
175
219
  ] }) }),
176
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow$2, { label: "Invoice prefix", children: /* @__PURE__ */ jsxRuntime.jsx("input", { value: form.invoicePrefix, onChange: (e) => setForm((p) => ({ ...p, invoicePrefix: e.target.value })), className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive", placeholder: "WC-" }) }),
177
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow$2, { label: "Credit Card Statement Name", children: /* @__PURE__ */ jsxRuntime.jsx("input", { value: form.creditCardStatementName, onChange: (e) => setForm((p) => ({ ...p, creditCardStatementName: e.target.value })), className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive", placeholder: "PayPal" }) })
220
+ /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Invoice prefix", htmlFor: "as-invoice-prefix", children: /* @__PURE__ */ jsxRuntime.jsx("input", { id: "as-invoice-prefix", value: form.invoicePrefix, onChange: (e) => setForm((p) => ({ ...p, invoicePrefix: e.target.value })), className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive", placeholder: "PP-" }) }),
221
+ /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Credit Card Statement Name", htmlFor: "as-cc-statement", children: /* @__PURE__ */ jsxRuntime.jsx("input", { id: "as-cc-statement", value: form.creditCardStatementName, onChange: (e) => setForm((p) => ({ ...p, creditCardStatementName: e.target.value })), className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive", placeholder: "PayPal" }) })
178
222
  ] })
179
223
  }
180
224
  )
181
225
  ] }) });
182
226
  }
183
- async function adminFetch$1(path, opts = {}) {
184
- var _a;
185
- const { method = "GET", body, query } = opts;
186
- let url = path;
187
- if (query && Object.keys(query).length > 0) {
188
- const params = new URLSearchParams(query);
189
- url = `${path}?${params.toString()}`;
190
- }
191
- const headers = { Accept: "application/json" };
192
- if (body !== void 0) headers["Content-Type"] = "application/json";
193
- if (typeof window !== "undefined") {
194
- const token = (_a = window.__medusa__) == null ? void 0 : _a.token;
195
- if (token) headers["Authorization"] = `Bearer ${token}`;
196
- }
197
- const res = await fetch(url, {
198
- method,
199
- headers,
200
- credentials: "include",
201
- body: body !== void 0 ? JSON.stringify(body) : void 0
202
- });
203
- const text = await res.text().catch(() => "");
204
- if (!res.ok) {
205
- if (res.status === 401) throw new Error("Unauthorized (401) - session may have expired. Please reload and log in again.");
206
- if (res.status === 403) throw new Error("Forbidden (403) - you do not have permission to perform this action.");
207
- throw new Error(text || `Request failed with status ${res.status}`);
208
- }
209
- if (!text) return {};
210
- try {
211
- return JSON.parse(text);
212
- } catch {
213
- return {};
214
- }
227
+ function PayPalApplePayPage() {
228
+ return /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Navigate, { to: "/settings/paypal/connection", replace: true });
215
229
  }
216
230
  const DEFAULT_FORM = {
217
231
  enabled: true,
@@ -228,27 +242,6 @@ const THREE_DS_OPTIONS = [
228
242
  { value: "sli", label: "3D Secure (SCA) / liability shift (recommended)", hint: "Attempts to optimize for liability shift while remaining compliant." },
229
243
  { value: "always", label: "Always request 3D Secure", hint: "Forces 3DS challenge whenever possible (may reduce conversion)." }
230
244
  ];
231
- function SectionCard$1({ title, description, right, children }) {
232
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-xl border border-ui-border-base bg-ui-bg-base shadow-sm", children: [
233
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-4 border-b border-ui-border-base p-4", children: [
234
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
235
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base font-semibold text-ui-fg-base", children: title }),
236
- description ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 text-sm text-ui-fg-subtle", children: description }) : null
237
- ] }),
238
- right
239
- ] }),
240
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-4", children })
241
- ] });
242
- }
243
- function FieldRow$1({ label, hint, children }) {
244
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-12 items-start gap-4 py-3", children: [
245
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "col-span-12 md:col-span-4", children: [
246
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm font-medium text-ui-fg-base", children: label }),
247
- hint ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 text-xs text-ui-fg-subtle", children: hint }) : null
248
- ] }),
249
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-12 md:col-span-8", children })
250
- ] });
251
- }
252
245
  function AdvancedCardPaymentsTab() {
253
246
  var _a, _b;
254
247
  const [form, setForm] = react.useState(() => ({ ...DEFAULT_FORM }));
@@ -256,13 +249,14 @@ function AdvancedCardPaymentsTab() {
256
249
  const [saving, setSaving] = react.useState(false);
257
250
  const [toast, setToast] = react.useState(null);
258
251
  const didInit = react.useRef(false);
252
+ const dismissToast = react.useCallback(() => setToast(null), []);
259
253
  react.useEffect(() => {
260
254
  if (didInit.current) return;
261
255
  didInit.current = true;
262
256
  (async () => {
263
257
  try {
264
258
  setLoading(true);
265
- const json = await adminFetch$1("/admin/paypal/settings");
259
+ const json = await adminFetch("/admin/paypal/settings");
266
260
  const payload = (json == null ? void 0 : json.data) ?? json;
267
261
  const saved = payload == null ? void 0 : payload.advanced_card_payments;
268
262
  if (saved && typeof saved === "object") setForm(mergeWithDefaults(saved));
@@ -275,18 +269,16 @@ function AdvancedCardPaymentsTab() {
275
269
  async function onSave() {
276
270
  try {
277
271
  setSaving(true);
278
- const json = await adminFetch$1("/admin/paypal/settings", {
272
+ const json = await adminFetch("/admin/paypal/settings", {
279
273
  method: "POST",
280
274
  body: { advanced_card_payments: form }
281
275
  });
282
276
  const payload = (json == null ? void 0 : json.data) ?? json;
283
277
  const saved = payload == null ? void 0 : payload.advanced_card_payments;
284
278
  if (saved && typeof saved === "object") setForm(mergeWithDefaults(saved));
285
- setToast({ type: "success", message: "Settings saved" });
286
- window.setTimeout(() => setToast(null), 2500);
279
+ setToast({ kind: "success", message: "Settings saved" });
287
280
  } catch (e) {
288
- setToast({ type: "error", message: (e instanceof Error ? e.message : "") || "Failed to save settings." });
289
- window.setTimeout(() => setToast(null), 3500);
281
+ setToast({ kind: "error", message: (e instanceof Error ? e.message : "") || "Failed to save settings." });
290
282
  } finally {
291
283
  setSaving(false);
292
284
  }
@@ -294,24 +286,24 @@ function AdvancedCardPaymentsTab() {
294
286
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-6", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-6", children: [
295
287
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-start justify-between gap-4", children: /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-xl font-semibold text-ui-fg-base", children: "PayPal Gateway By Easy Payment" }) }) }),
296
288
  /* @__PURE__ */ jsxRuntime.jsx(PayPalTabs, {}),
297
- toast ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "fixed right-6 top-6 z-50 rounded-md border border-ui-border-base bg-ui-bg-base px-4 py-3 text-sm shadow-lg", role: "status", "aria-live": "polite", children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: toast.type === "success" ? "text-ui-fg-base" : "text-ui-fg-error", children: toast.message }) }) : null,
289
+ /* @__PURE__ */ jsxRuntime.jsx(Toast, { toast, onClose: dismissToast }),
298
290
  /* @__PURE__ */ jsxRuntime.jsx(
299
- SectionCard$1,
291
+ SectionCard,
300
292
  {
301
293
  title: "Advanced Card Payments",
302
294
  description: "Control card checkout settings and 3D Secure behavior.",
303
295
  right: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
304
296
  /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", onClick: onSave, disabled: saving || loading, className: "transition-fg relative inline-flex w-fit items-center justify-center overflow-hidden rounded-md outline-none shadow-buttons-neutral text-ui-fg-base bg-ui-button-neutral after:transition-fg after:absolute after:inset-0 after:content-[''] after:button-neutral-gradient hover:bg-ui-button-neutral-hover hover:after:button-neutral-hover-gradient active:bg-ui-button-neutral-pressed active:after:button-neutral-pressed-gradient focus-visible:shadow-buttons-neutral-focus disabled:bg-ui-bg-disabled disabled:border-ui-border-base disabled:text-ui-fg-disabled disabled:shadow-buttons-neutral disabled:after:hidden txt-compact-small-plus px-3 py-1.5", children: saving ? "Saving..." : "Save settings" }),
305
- loading ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-ui-fg-subtle", children: "Loading..." }) : null
297
+ loading ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-ui-fg-subtle", children: "Loading" }) : null
306
298
  ] }),
307
299
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "divide-y divide-ui-border-base", children: [
308
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow$1, { label: "Enable/Disable", children: /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "inline-flex items-center gap-2", children: [
300
+ /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Enable/Disable", children: /* @__PURE__ */ jsxRuntime.jsxs("label", { className: "inline-flex items-center gap-2", children: [
309
301
  /* @__PURE__ */ jsxRuntime.jsx("input", { type: "checkbox", checked: form.enabled, onChange: (e) => setForm((p) => ({ ...p, enabled: e.target.checked })), className: "h-4 w-4 rounded border-ui-border-base" }),
310
302
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-ui-fg-base", children: "Enable Advanced Credit/Debit Card" })
311
303
  ] }) }),
312
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow$1, { label: "Title", children: /* @__PURE__ */ jsxRuntime.jsx("input", { value: form.title, onChange: (e) => setForm((p) => ({ ...p, title: e.target.value })), className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive", placeholder: "Credit or Debit Card" }) }),
313
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow$1, { label: "Contingency for 3D Secure", hint: "Choose when 3D Secure should be triggered during card payments.", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
314
- /* @__PURE__ */ jsxRuntime.jsx("select", { value: form.threeDS, onChange: (e) => setForm((p) => ({ ...p, threeDS: e.target.value })), className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive", children: THREE_DS_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: o.label }, o.value)) }),
304
+ /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Title", htmlFor: "acp-title", children: /* @__PURE__ */ jsxRuntime.jsx("input", { id: "acp-title", value: form.title, onChange: (e) => setForm((p) => ({ ...p, title: e.target.value })), className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive", placeholder: "Credit or Debit Card" }) }),
305
+ /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Contingency for 3D Secure", hint: "Choose when 3D Secure should be triggered during card payments.", htmlFor: "acp-threeds", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
306
+ /* @__PURE__ */ jsxRuntime.jsx("select", { id: "acp-threeds", value: form.threeDS, onChange: (e) => setForm((p) => ({ ...p, threeDS: e.target.value })), className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive", children: THREE_DS_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: o.label }, o.value)) }),
315
307
  ((_a = THREE_DS_OPTIONS.find((o) => o.value === form.threeDS)) == null ? void 0 : _a.hint) ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs text-ui-fg-subtle", children: (_b = THREE_DS_OPTIONS.find((o) => o.value === form.threeDS)) == null ? void 0 : _b.hint }) : null
316
308
  ] }) })
317
309
  ] })
@@ -319,42 +311,15 @@ function AdvancedCardPaymentsTab() {
319
311
  )
320
312
  ] }) });
321
313
  }
322
- function PayPalApplePayPage() {
323
- return /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Navigate, { to: "/settings/paypal/connection", replace: true });
324
- }
325
314
  function PayPalGooglePayPage() {
326
315
  return /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Navigate, { to: "/settings/paypal/connection", replace: true });
327
316
  }
328
317
  const config = adminSdk.defineRouteConfig({
329
- label: "PayPal Connection",
330
- hide: true
318
+ label: "PayPal Connection"
331
319
  });
332
- if (typeof window !== "undefined") {
333
- const preloadHref = "https://www.paypal.com/webapps/merchantboarding/js/lib/lightbox/partner.js";
334
- const existingPreload = document.head.querySelector(
335
- `link[rel="preload"][href="${preloadHref}"]`
336
- );
337
- if (!existingPreload) {
338
- const preloadLink = document.createElement("link");
339
- preloadLink.rel = "preload";
340
- preloadLink.href = preloadHref;
341
- preloadLink.as = "script";
342
- document.head.appendChild(preloadLink);
343
- }
344
- const existingScript = document.getElementById(
345
- "paypal-partner-js"
346
- );
347
- if (!existingScript) {
348
- const ppScript = document.createElement("script");
349
- ppScript.id = "paypal-partner-js";
350
- ppScript.src = preloadHref;
351
- ppScript.async = true;
352
- document.head.appendChild(ppScript);
353
- }
354
- }
320
+ const PARTNER_JS_URL = "https://www.paypal.com/webapps/merchantboarding/js/lib/lightbox/partner.js";
355
321
  const SERVICE_URL = "/admin/paypal/onboarding-link";
356
322
  const CACHE_KEY = "pp_onboard_cache";
357
- const RELOAD_KEY = "pp_onboard_reloaded_once";
358
323
  const CACHE_EXPIRY = 10 * 60 * 1e3;
359
324
  const ONBOARDING_COMPLETE_ENDPOINT = "/admin/paypal/onboard-complete";
360
325
  const STATUS_ENDPOINT = "/admin/paypal/status";
@@ -377,12 +342,45 @@ if (typeof window !== "undefined") {
377
342
  function PayPalConnectionPage() {
378
343
  const [env, setEnv] = react.useState("live");
379
344
  react.useEffect(() => {
380
- fetch("/admin/paypal/environment", { method: "GET" }).then((r) => r.json()).then((d) => {
345
+ fetch("/admin/paypal/environment", { method: "GET", credentials: "include" }).then((r) => r.json()).then((d) => {
381
346
  const v = (d == null ? void 0 : d.environment) === "sandbox" ? "sandbox" : "live";
382
347
  setEnv(v);
383
348
  }).catch(() => {
384
349
  });
385
350
  }, []);
351
+ react.useEffect(() => {
352
+ const preloadHref = PARTNER_JS_URL;
353
+ let preloadLink = null;
354
+ const existingPreload = document.head.querySelector(
355
+ `link[rel="preload"][href="${preloadHref}"]`
356
+ );
357
+ if (!existingPreload) {
358
+ preloadLink = document.createElement("link");
359
+ preloadLink.rel = "preload";
360
+ preloadLink.href = preloadHref;
361
+ preloadLink.as = "script";
362
+ document.head.appendChild(preloadLink);
363
+ }
364
+ let ppScript = null;
365
+ const existingScript = document.getElementById(
366
+ "paypal-partner-js"
367
+ );
368
+ if (!existingScript) {
369
+ ppScript = document.createElement("script");
370
+ ppScript.id = "paypal-partner-js";
371
+ ppScript.src = preloadHref;
372
+ ppScript.async = true;
373
+ document.head.appendChild(ppScript);
374
+ }
375
+ return () => {
376
+ if (preloadLink && preloadLink.parentNode) {
377
+ preloadLink.parentNode.removeChild(preloadLink);
378
+ }
379
+ if (ppScript && ppScript.parentNode) {
380
+ ppScript.parentNode.removeChild(ppScript);
381
+ }
382
+ };
383
+ }, []);
386
384
  const [connState, setConnState] = react.useState("loading");
387
385
  const [error, setError] = react.useState(null);
388
386
  const [finalUrl, setFinalUrl] = react.useState("");
@@ -411,10 +409,14 @@ function PayPalConnectionPage() {
411
409
  fetch(SERVICE_URL, {
412
410
  method: "POST",
413
411
  headers: { "content-type": "application/json" },
412
+ credentials: "include",
414
413
  body: JSON.stringify({
415
414
  products: ["PPCP"]
416
415
  })
417
- }).then((r) => r.json()).then((data) => {
416
+ }).then((r) => {
417
+ if (!r.ok) throw new Error(`Service returned ${r.status}`);
418
+ return r.json();
419
+ }).then((data) => {
418
420
  if (runId !== currentRunId.current) return;
419
421
  const href = data == null ? void 0 : data.onboarding_url;
420
422
  if (!href) {
@@ -429,11 +431,6 @@ function PayPalConnectionPage() {
429
431
  ts: Date.now()
430
432
  })
431
433
  );
432
- if (!localStorage.getItem(RELOAD_KEY)) {
433
- localStorage.setItem(RELOAD_KEY, "1");
434
- window.location.reload();
435
- return;
436
- }
437
434
  activatePayPal(finalUrl2, runId);
438
435
  }).catch(() => {
439
436
  if (runId !== currentRunId.current) return;
@@ -460,6 +457,8 @@ function PayPalConnectionPage() {
460
457
  paypalButtonRef.current.href = url;
461
458
  }
462
459
  setFinalUrl(url);
460
+ let attempts = 0;
461
+ const MAX_ATTEMPTS = 200;
463
462
  const tryInit = () => {
464
463
  var _a, _b;
465
464
  if (runId !== currentRunId.current) return;
@@ -467,6 +466,11 @@ function PayPalConnectionPage() {
467
466
  showUI();
468
467
  return;
469
468
  }
469
+ attempts++;
470
+ if (attempts >= MAX_ATTEMPTS) {
471
+ showError("PayPal partner script failed to load. Please refresh and try again.");
472
+ return;
473
+ }
470
474
  setTimeout(tryInit, 50);
471
475
  };
472
476
  tryInit();
@@ -483,7 +487,8 @@ function PayPalConnectionPage() {
483
487
  setFinalUrl("");
484
488
  try {
485
489
  const r = await fetch(`${STATUS_ENDPOINT}?environment=${env}`, {
486
- method: "GET"
490
+ method: "GET",
491
+ credentials: "include"
487
492
  });
488
493
  const st = await r.json().catch(() => ({}));
489
494
  if (cancelled || runId !== currentRunId.current) return;
@@ -513,8 +518,7 @@ function PayPalConnectionPage() {
513
518
  window.onboardingCallback = async function(authCode, sharedId) {
514
519
  var _a, _b, _c, _d, _e, _f, _g;
515
520
  try {
516
- ;
517
- window.onbeforeunload = "";
521
+ window.onbeforeunload = null;
518
522
  } catch {
519
523
  }
520
524
  setOnboardingInProgress(true);
@@ -529,6 +533,7 @@ function PayPalConnectionPage() {
529
533
  const res = await fetch(ONBOARDING_COMPLETE_ENDPOINT, {
530
534
  method: "POST",
531
535
  headers: { "content-type": "application/json" },
536
+ credentials: "include",
532
537
  body: JSON.stringify(payload)
533
538
  });
534
539
  if (!res.ok) {
@@ -547,10 +552,22 @@ function PayPalConnectionPage() {
547
552
  }
548
553
  try {
549
554
  localStorage.removeItem(CACHE_KEY);
550
- localStorage.removeItem(RELOAD_KEY);
551
555
  } catch {
552
556
  }
553
- window.location.href = window.location.href;
557
+ try {
558
+ const statusRes = await fetch(`${STATUS_ENDPOINT}?environment=${env}`, {
559
+ method: "GET",
560
+ credentials: "include"
561
+ });
562
+ const refreshedStatus = await statusRes.json().catch(() => ({}));
563
+ setStatusInfo(refreshedStatus || null);
564
+ setConnState("connected");
565
+ setShowManual(false);
566
+ } catch {
567
+ setConnState("connected");
568
+ setShowManual(false);
569
+ }
570
+ setOnboardingInProgress(false);
554
571
  } catch (e) {
555
572
  console.error(e);
556
573
  setConnState("error");
@@ -596,6 +613,7 @@ function PayPalConnectionPage() {
596
613
  const res = await fetch(SAVE_CREDENTIALS_ENDPOINT, {
597
614
  method: "POST",
598
615
  headers: { "content-type": "application/json" },
616
+ credentials: "include",
599
617
  body: JSON.stringify({
600
618
  clientId: clientId.trim(),
601
619
  clientSecret: secret.trim(),
@@ -607,7 +625,8 @@ function PayPalConnectionPage() {
607
625
  throw new Error(txt || `Save credentials failed (${res.status})`);
608
626
  }
609
627
  const statusRes = await fetch(`${STATUS_ENDPOINT}?environment=${env}`, {
610
- method: "GET"
628
+ method: "GET",
629
+ credentials: "include"
611
630
  });
612
631
  const refreshedStatus = await statusRes.json().catch(() => ({}));
613
632
  setConnState("connected");
@@ -615,7 +634,6 @@ function PayPalConnectionPage() {
615
634
  setShowManual(false);
616
635
  try {
617
636
  localStorage.removeItem(CACHE_KEY);
618
- localStorage.removeItem(RELOAD_KEY);
619
637
  } catch {
620
638
  }
621
639
  } catch (e) {
@@ -634,10 +652,12 @@ function PayPalConnectionPage() {
634
652
  setError(null);
635
653
  setFinalUrl("");
636
654
  setShowManual(false);
655
+ setStatusInfo(null);
637
656
  try {
638
657
  const res = await fetch(DISCONNECT_ENDPOINT, {
639
658
  method: "POST",
640
659
  headers: { "content-type": "application/json" },
660
+ credentials: "include",
641
661
  body: JSON.stringify({ environment: env })
642
662
  });
643
663
  if (!res.ok) {
@@ -646,7 +666,6 @@ function PayPalConnectionPage() {
646
666
  }
647
667
  try {
648
668
  localStorage.removeItem(CACHE_KEY);
649
- localStorage.removeItem(RELOAD_KEY);
650
669
  } catch {
651
670
  }
652
671
  currentRunId.current = ++runIdRef.current;
@@ -668,19 +687,19 @@ function PayPalConnectionPage() {
668
687
  await fetch("/admin/paypal/environment", {
669
688
  method: "POST",
670
689
  headers: { "content-type": "application/json" },
690
+ credentials: "include",
671
691
  body: JSON.stringify({ environment: next })
672
692
  });
673
693
  } catch {
674
694
  }
675
695
  try {
676
696
  localStorage.removeItem(CACHE_KEY);
677
- localStorage.removeItem(RELOAD_KEY);
678
697
  } catch {
679
698
  }
680
699
  };
681
700
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-6", children: [
682
701
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-6", children: [
683
- /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-xl font-semibold", children: "PayPal Gateway By Easy Payment" }),
702
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-start justify-between gap-4", children: /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-xl font-semibold text-ui-fg-base", children: "PayPal Gateway By Easy Payment" }) }) }),
684
703
  /* @__PURE__ */ jsxRuntime.jsx(PayPalTabs, {}),
685
704
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-xl border border-ui-border-base bg-ui-bg-base shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-y-6 p-4 md:grid-cols-[260px_1fr] md:items-start", children: [
686
705
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm font-medium pt-2", children: "Environment" }),
@@ -810,10 +829,11 @@ function PayPalConnectionPage() {
810
829
  ] }) }),
811
830
  showManual && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "md:col-span-2", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-[260px] max-w-xl mt-4 grid grid-cols-1 gap-3 md:grid-cols-2", children: [
812
831
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
813
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-sm font-medium", children: "Client ID" }),
832
+ /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: "pp-manual-client-id", className: "text-sm font-medium", children: "Client ID" }),
814
833
  /* @__PURE__ */ jsxRuntime.jsx(
815
834
  "input",
816
835
  {
836
+ id: "pp-manual-client-id",
817
837
  type: "text",
818
838
  value: clientId,
819
839
  onChange: (e) => setClientId(e.target.value),
@@ -824,10 +844,11 @@ function PayPalConnectionPage() {
824
844
  )
825
845
  ] }),
826
846
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-1", children: [
827
- /* @__PURE__ */ jsxRuntime.jsx("label", { className: "text-sm font-medium", children: "Secret" }),
847
+ /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: "pp-manual-secret", className: "text-sm font-medium", children: "Secret" }),
828
848
  /* @__PURE__ */ jsxRuntime.jsx(
829
849
  "input",
830
850
  {
851
+ id: "pp-manual-secret",
831
852
  type: "password",
832
853
  value: secret,
833
854
  onChange: (e) => setSecret(e.target.value),
@@ -921,39 +942,6 @@ function PayPalConnectionPage() {
921
942
  function PayPalPayLaterMessagingPage() {
922
943
  return /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Navigate, { to: "/settings/paypal/connection", replace: true });
923
944
  }
924
- async function adminFetch(path, opts = {}) {
925
- var _a;
926
- const { method = "GET", body, query } = opts;
927
- let url = path;
928
- if (query && Object.keys(query).length > 0) {
929
- const params = new URLSearchParams(query);
930
- url = `${path}?${params.toString()}`;
931
- }
932
- const headers = { Accept: "application/json" };
933
- if (body !== void 0) headers["Content-Type"] = "application/json";
934
- if (typeof window !== "undefined") {
935
- const token = (_a = window.__medusa__) == null ? void 0 : _a.token;
936
- if (token) headers["Authorization"] = `Bearer ${token}`;
937
- }
938
- const res = await fetch(url, {
939
- method,
940
- headers,
941
- credentials: "include",
942
- body: body !== void 0 ? JSON.stringify(body) : void 0
943
- });
944
- const text = await res.text().catch(() => "");
945
- if (!res.ok) {
946
- if (res.status === 401) throw new Error("Unauthorized (401) - session may have expired. Please reload and log in again.");
947
- if (res.status === 403) throw new Error("Forbidden (403) - you do not have permission to perform this action.");
948
- throw new Error(text || `Request failed with status ${res.status}`);
949
- }
950
- if (!text) return {};
951
- try {
952
- return JSON.parse(text);
953
- } catch {
954
- return {};
955
- }
956
- }
957
945
  const COLOR_OPTIONS = [
958
946
  { value: "gold", label: "Gold (Recommended)" },
959
947
  { value: "blue", label: "Blue" },
@@ -978,36 +966,6 @@ const LABEL_OPTIONS = [
978
966
  { value: "buynow", label: "Buy Now" },
979
967
  { value: "pay", label: "Pay" }
980
968
  ];
981
- function SectionCard({
982
- title,
983
- description,
984
- children,
985
- right
986
- }) {
987
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rounded-xl border border-ui-border-base bg-ui-bg-base shadow-sm", children: [
988
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-4 border-b border-ui-border-base p-4", children: [
989
- /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
990
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-base font-semibold text-ui-fg-base", children: title }),
991
- description ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 text-sm text-ui-fg-subtle", children: description }) : null
992
- ] }),
993
- right
994
- ] }),
995
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-4", children })
996
- ] });
997
- }
998
- function FieldRow({
999
- label,
1000
- hint,
1001
- children
1002
- }) {
1003
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-12 items-start gap-4 py-3", children: [
1004
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "col-span-12 md:col-span-4", children: [
1005
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm font-medium text-ui-fg-base", children: label }),
1006
- hint ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 text-xs text-ui-fg-subtle", children: hint }) : null
1007
- ] }),
1008
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "col-span-12 md:col-span-8", children })
1009
- ] });
1010
- }
1011
969
  function PayPalSettingsTab() {
1012
970
  const [form, setForm] = react.useState({
1013
971
  enabled: true,
@@ -1023,6 +981,7 @@ function PayPalSettingsTab() {
1023
981
  const [saving, setSaving] = react.useState(false);
1024
982
  const [toast, setToast] = react.useState(null);
1025
983
  const didInit = react.useRef(false);
984
+ const dismissToast = react.useCallback(() => setToast(null), []);
1026
985
  react.useEffect(() => {
1027
986
  if (didInit.current) return;
1028
987
  didInit.current = true;
@@ -1065,14 +1024,12 @@ function PayPalSettingsTab() {
1065
1024
  ...saved
1066
1025
  }));
1067
1026
  }
1068
- setToast({ type: "success", message: "Settings saved" });
1069
- window.setTimeout(() => setToast(null), 2500);
1027
+ setToast({ kind: "success", message: "Settings saved" });
1070
1028
  } catch (e) {
1071
1029
  setToast({
1072
- type: "error",
1030
+ kind: "error",
1073
1031
  message: (e instanceof Error ? e.message : "") || "Failed to save settings."
1074
1032
  });
1075
- window.setTimeout(() => setToast(null), 3500);
1076
1033
  } finally {
1077
1034
  setSaving(false);
1078
1035
  }
@@ -1083,15 +1040,7 @@ function PayPalSettingsTab() {
1083
1040
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-2" })
1084
1041
  ] }),
1085
1042
  /* @__PURE__ */ jsxRuntime.jsx(PayPalTabs, {}),
1086
- toast ? /* @__PURE__ */ jsxRuntime.jsx(
1087
- "div",
1088
- {
1089
- className: "fixed right-6 top-6 z-50 rounded-md border border-ui-border-base bg-ui-bg-base px-4 py-3 text-sm shadow-lg",
1090
- role: "status",
1091
- "aria-live": "polite",
1092
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: toast.type === "success" ? "text-ui-fg-base" : "text-ui-fg-error", children: toast.message })
1093
- }
1094
- ) : null,
1043
+ /* @__PURE__ */ jsxRuntime.jsx(Toast, { toast, onClose: dismissToast }),
1095
1044
  /* @__PURE__ */ jsxRuntime.jsx(
1096
1045
  SectionCard,
1097
1046
  {
@@ -1123,9 +1072,10 @@ function PayPalSettingsTab() {
1123
1072
  ),
1124
1073
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-ui-fg-base", children: "Enable PayPal" })
1125
1074
  ] }) }),
1126
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Title", children: /* @__PURE__ */ jsxRuntime.jsx(
1075
+ /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Title", htmlFor: "pp-title", children: /* @__PURE__ */ jsxRuntime.jsx(
1127
1076
  "input",
1128
1077
  {
1078
+ id: "pp-title",
1129
1079
  value: form.title,
1130
1080
  onChange: (e) => setForm((p) => ({ ...p, title: e.target.value })),
1131
1081
  className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive",
@@ -1141,36 +1091,40 @@ function PayPalSettingsTab() {
1141
1091
  title: "Button Appearance",
1142
1092
  description: "Control PayPal Smart Button styling (color/shape/size/label).",
1143
1093
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "divide-y divide-ui-border-base", children: [
1144
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Button Color", children: /* @__PURE__ */ jsxRuntime.jsx(
1094
+ /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Button Color", htmlFor: "pp-btn-color", children: /* @__PURE__ */ jsxRuntime.jsx(
1145
1095
  "select",
1146
1096
  {
1097
+ id: "pp-btn-color",
1147
1098
  value: form.buttonColor,
1148
1099
  onChange: (e) => setForm((p) => ({ ...p, buttonColor: e.target.value })),
1149
1100
  className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive",
1150
1101
  children: COLOR_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: o.label }, o.value))
1151
1102
  }
1152
1103
  ) }),
1153
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Button Shape", children: /* @__PURE__ */ jsxRuntime.jsx(
1104
+ /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Button Shape", htmlFor: "pp-btn-shape", children: /* @__PURE__ */ jsxRuntime.jsx(
1154
1105
  "select",
1155
1106
  {
1107
+ id: "pp-btn-shape",
1156
1108
  value: form.buttonShape,
1157
1109
  onChange: (e) => setForm((p) => ({ ...p, buttonShape: e.target.value })),
1158
1110
  className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive",
1159
1111
  children: SHAPE_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: o.label }, o.value))
1160
1112
  }
1161
1113
  ) }),
1162
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Button Width", children: /* @__PURE__ */ jsxRuntime.jsx(
1114
+ /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Button Width", htmlFor: "pp-btn-width", children: /* @__PURE__ */ jsxRuntime.jsx(
1163
1115
  "select",
1164
1116
  {
1117
+ id: "pp-btn-width",
1165
1118
  value: form.buttonWidth,
1166
1119
  onChange: (e) => setForm((p) => ({ ...p, buttonWidth: e.target.value })),
1167
1120
  className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive",
1168
1121
  children: WIDTH_OPTIONS.map((o) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: o.value, children: o.label }, o.value))
1169
1122
  }
1170
1123
  ) }),
1171
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Button Height", children: /* @__PURE__ */ jsxRuntime.jsx(
1124
+ /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Button Height", htmlFor: "pp-btn-height", children: /* @__PURE__ */ jsxRuntime.jsx(
1172
1125
  "select",
1173
1126
  {
1127
+ id: "pp-btn-height",
1174
1128
  value: String(form.buttonHeight),
1175
1129
  onChange: (e) => setForm((p) => ({ ...p, buttonHeight: Number(e.target.value) })),
1176
1130
  className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive",
@@ -1180,9 +1134,10 @@ function PayPalSettingsTab() {
1180
1134
  ] }, h))
1181
1135
  }
1182
1136
  ) }),
1183
- /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Button Label", children: /* @__PURE__ */ jsxRuntime.jsx(
1137
+ /* @__PURE__ */ jsxRuntime.jsx(FieldRow, { label: "Button Label", htmlFor: "pp-btn-label", children: /* @__PURE__ */ jsxRuntime.jsx(
1184
1138
  "select",
1185
1139
  {
1140
+ id: "pp-btn-label",
1186
1141
  value: form.buttonLabel,
1187
1142
  onChange: (e) => setForm((p) => ({ ...p, buttonLabel: e.target.value })),
1188
1143
  className: "w-full rounded-md border border-ui-border-base bg-ui-bg-base px-3 py-2 text-sm text-ui-fg-base outline-none focus:ring-2 focus:ring-ui-border-interactive",
@@ -1205,14 +1160,14 @@ const routeModule = {
1205
1160
  Component: AdditionalSettingsTab,
1206
1161
  path: "/settings/paypal/additional-settings"
1207
1162
  },
1208
- {
1209
- Component: AdvancedCardPaymentsTab,
1210
- path: "/settings/paypal/advanced-card-payments"
1211
- },
1212
1163
  {
1213
1164
  Component: PayPalApplePayPage,
1214
1165
  path: "/settings/paypal/apple-pay"
1215
1166
  },
1167
+ {
1168
+ Component: AdvancedCardPaymentsTab,
1169
+ path: "/settings/paypal/advanced-card-payments"
1170
+ },
1216
1171
  {
1217
1172
  Component: PayPalGooglePayPage,
1218
1173
  path: "/settings/paypal/google-pay"