@movmo_app/payments 0.1.0 → 0.2.1

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.
package/dist/index.es.js CHANGED
@@ -1,5 +1,5 @@
1
- import Je, { useState as M, useRef as ye, useEffect as he, useCallback as ge, useMemo as Cr } from "react";
2
- var be = { exports: {} }, q = {};
1
+ import Er, { useState as P, useRef as B, useEffect as L, useCallback as H, useMemo as Ue } from "react";
2
+ var rr = { exports: {} }, $e = {};
3
3
  /**
4
4
  * @license React
5
5
  * react-jsx-runtime.production.min.js
@@ -9,21 +9,21 @@ var be = { exports: {} }, q = {};
9
9
  * This source code is licensed under the MIT license found in the
10
10
  * LICENSE file in the root directory of this source tree.
11
11
  */
12
- var We;
13
- function Tr() {
14
- if (We) return q;
15
- We = 1;
16
- var n = Je, o = Symbol.for("react.element"), c = Symbol.for("react.fragment"), i = Object.prototype.hasOwnProperty, v = n.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, w = { key: !0, ref: !0, __self: !0, __source: !0 };
17
- function A(O, b, S) {
18
- var E, y = {}, D = null, C = null;
19
- S !== void 0 && (D = "" + S), b.key !== void 0 && (D = "" + b.key), b.ref !== void 0 && (C = b.ref);
20
- for (E in b) i.call(b, E) && !w.hasOwnProperty(E) && (y[E] = b[E]);
21
- if (O && O.defaultProps) for (E in b = O.defaultProps, b) y[E] === void 0 && (y[E] = b[E]);
22
- return { $$typeof: o, type: O, key: D, ref: C, props: y, _owner: v.current };
12
+ var fr;
13
+ function zr() {
14
+ if (fr) return $e;
15
+ fr = 1;
16
+ var r = Er, t = Symbol.for("react.element"), s = Symbol.for("react.fragment"), o = Object.prototype.hasOwnProperty, l = r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner, c = { key: !0, ref: !0, __self: !0, __source: !0 };
17
+ function f(p, y, W) {
18
+ var N, b = {}, D = null, M = null;
19
+ W !== void 0 && (D = "" + W), y.key !== void 0 && (D = "" + y.key), y.ref !== void 0 && (M = y.ref);
20
+ for (N in y) o.call(y, N) && !c.hasOwnProperty(N) && (b[N] = y[N]);
21
+ if (p && p.defaultProps) for (N in y = p.defaultProps, y) b[N] === void 0 && (b[N] = y[N]);
22
+ return { $$typeof: t, type: p, key: D, ref: M, props: b, _owner: l.current };
23
23
  }
24
- return q.Fragment = c, q.jsx = A, q.jsxs = A, q;
24
+ return $e.Fragment = s, $e.jsx = f, $e.jsxs = f, $e;
25
25
  }
26
- var B = {};
26
+ var Ae = {};
27
27
  /**
28
28
  * @license React
29
29
  * react-jsx-runtime.development.js
@@ -33,91 +33,91 @@ var B = {};
33
33
  * This source code is licensed under the MIT license found in the
34
34
  * LICENSE file in the root directory of this source tree.
35
35
  */
36
- var Ve;
37
- function jr() {
38
- return Ve || (Ve = 1, process.env.NODE_ENV !== "production" && function() {
39
- var n = Je, o = Symbol.for("react.element"), c = Symbol.for("react.portal"), i = Symbol.for("react.fragment"), v = Symbol.for("react.strict_mode"), w = Symbol.for("react.profiler"), A = Symbol.for("react.provider"), O = Symbol.for("react.context"), b = Symbol.for("react.forward_ref"), S = Symbol.for("react.suspense"), E = Symbol.for("react.suspense_list"), y = Symbol.for("react.memo"), D = Symbol.for("react.lazy"), C = Symbol.for("react.offscreen"), h = Symbol.iterator, R = "@@iterator";
40
- function j(e) {
36
+ var pr;
37
+ function Vr() {
38
+ return pr || (pr = 1, process.env.NODE_ENV !== "production" && function() {
39
+ var r = Er, t = Symbol.for("react.element"), s = Symbol.for("react.portal"), o = Symbol.for("react.fragment"), l = Symbol.for("react.strict_mode"), c = Symbol.for("react.profiler"), f = Symbol.for("react.provider"), p = Symbol.for("react.context"), y = Symbol.for("react.forward_ref"), W = Symbol.for("react.suspense"), N = Symbol.for("react.suspense_list"), b = Symbol.for("react.memo"), D = Symbol.for("react.lazy"), M = Symbol.for("react.offscreen"), X = Symbol.iterator, T = "@@iterator";
40
+ function se(e) {
41
41
  if (e === null || typeof e != "object")
42
42
  return null;
43
- var r = h && e[h] || e[R];
44
- return typeof r == "function" ? r : null;
43
+ var n = X && e[X] || e[T];
44
+ return typeof n == "function" ? n : null;
45
45
  }
46
- var x = n.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
47
- function p(e) {
46
+ var E = r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
47
+ function S(e) {
48
48
  {
49
- for (var r = arguments.length, t = new Array(r > 1 ? r - 1 : 0), a = 1; a < r; a++)
50
- t[a - 1] = arguments[a];
51
- K("error", e, t);
49
+ for (var n = arguments.length, i = new Array(n > 1 ? n - 1 : 0), m = 1; m < n; m++)
50
+ i[m - 1] = arguments[m];
51
+ q("error", e, i);
52
52
  }
53
53
  }
54
- function K(e, r, t) {
54
+ function q(e, n, i) {
55
55
  {
56
- var a = x.ReactDebugCurrentFrame, u = a.getStackAddendum();
57
- u !== "" && (r += "%s", t = t.concat([u]));
58
- var f = t.map(function(l) {
59
- return String(l);
56
+ var m = E.ReactDebugCurrentFrame, j = m.getStackAddendum();
57
+ j !== "" && (n += "%s", i = i.concat([j]));
58
+ var k = i.map(function(x) {
59
+ return String(x);
60
60
  });
61
- f.unshift("Warning: " + r), Function.prototype.apply.call(console[e], console, f);
61
+ k.unshift("Warning: " + n), Function.prototype.apply.call(console[e], console, k);
62
62
  }
63
63
  }
64
- var G = !1, oe = !1, U = !1, ie = !1, se = !1, H;
65
- H = Symbol.for("react.module.reference");
66
- function Y(e) {
67
- return !!(typeof e == "string" || typeof e == "function" || e === i || e === w || se || e === v || e === S || e === E || ie || e === C || G || oe || U || typeof e == "object" && e !== null && (e.$$typeof === D || e.$$typeof === y || e.$$typeof === A || e.$$typeof === O || e.$$typeof === b || // This needs to include all possible module reference object
64
+ var ue = !1, re = !1, g = !1, ne = !1, ye = !1, I;
65
+ I = Symbol.for("react.module.reference");
66
+ function R(e) {
67
+ return !!(typeof e == "string" || typeof e == "function" || e === o || e === c || ye || e === l || e === W || e === N || ne || e === M || ue || re || g || typeof e == "object" && e !== null && (e.$$typeof === D || e.$$typeof === b || e.$$typeof === f || e.$$typeof === p || e.$$typeof === y || // This needs to include all possible module reference object
68
68
  // types supported by any Flight configuration anywhere since
69
69
  // we don't know which Flight build this will end up being used
70
70
  // with.
71
- e.$$typeof === H || e.getModuleId !== void 0));
71
+ e.$$typeof === I || e.getModuleId !== void 0));
72
72
  }
73
- function X(e, r, t) {
74
- var a = e.displayName;
75
- if (a)
76
- return a;
77
- var u = r.displayName || r.name || "";
78
- return u !== "" ? t + "(" + u + ")" : t;
73
+ function d(e, n, i) {
74
+ var m = e.displayName;
75
+ if (m)
76
+ return m;
77
+ var j = n.displayName || n.name || "";
78
+ return j !== "" ? i + "(" + j + ")" : i;
79
79
  }
80
- function Z(e) {
80
+ function C(e) {
81
81
  return e.displayName || "Context";
82
82
  }
83
- function N(e) {
83
+ function w(e) {
84
84
  if (e == null)
85
85
  return null;
86
- if (typeof e.tag == "number" && p("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."), typeof e == "function")
86
+ if (typeof e.tag == "number" && S("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."), typeof e == "function")
87
87
  return e.displayName || e.name || null;
88
88
  if (typeof e == "string")
89
89
  return e;
90
90
  switch (e) {
91
- case i:
91
+ case o:
92
92
  return "Fragment";
93
- case c:
93
+ case s:
94
94
  return "Portal";
95
- case w:
95
+ case c:
96
96
  return "Profiler";
97
- case v:
97
+ case l:
98
98
  return "StrictMode";
99
- case S:
99
+ case W:
100
100
  return "Suspense";
101
- case E:
101
+ case N:
102
102
  return "SuspenseList";
103
103
  }
104
104
  if (typeof e == "object")
105
105
  switch (e.$$typeof) {
106
- case O:
107
- var r = e;
108
- return Z(r) + ".Consumer";
109
- case A:
110
- var t = e;
111
- return Z(t._context) + ".Provider";
112
- case b:
113
- return X(e, e.render, "ForwardRef");
106
+ case p:
107
+ var n = e;
108
+ return C(n) + ".Consumer";
109
+ case f:
110
+ var i = e;
111
+ return C(i._context) + ".Provider";
114
112
  case y:
115
- var a = e.displayName || null;
116
- return a !== null ? a : N(e.type) || "Memo";
113
+ return d(e, e.render, "ForwardRef");
114
+ case b:
115
+ var m = e.displayName || null;
116
+ return m !== null ? m : w(e.type) || "Memo";
117
117
  case D: {
118
- var u = e, f = u._payload, l = u._init;
118
+ var j = e, k = j._payload, x = j._init;
119
119
  try {
120
- return N(l(f));
120
+ return w(x(k));
121
121
  } catch {
122
122
  return null;
123
123
  }
@@ -125,18 +125,18 @@ function jr() {
125
125
  }
126
126
  return null;
127
127
  }
128
- var d = Object.assign, k = 0, L, Ee, _e, Re, xe, we, Se;
129
- function Ce() {
128
+ var $ = Object.assign, J = 0, Y, Q, z, _, F, fe, ve;
129
+ function ge() {
130
130
  }
131
- Ce.__reactDisabledLog = !0;
132
- function Qe() {
131
+ ge.__reactDisabledLog = !0;
132
+ function we() {
133
133
  {
134
- if (k === 0) {
135
- L = console.log, Ee = console.info, _e = console.warn, Re = console.error, xe = console.group, we = console.groupCollapsed, Se = console.groupEnd;
134
+ if (J === 0) {
135
+ Y = console.log, Q = console.info, z = console.warn, _ = console.error, F = console.group, fe = console.groupCollapsed, ve = console.groupEnd;
136
136
  var e = {
137
137
  configurable: !0,
138
138
  enumerable: !0,
139
- value: Ce,
139
+ value: ge,
140
140
  writable: !0
141
141
  };
142
142
  Object.defineProperties(console, {
@@ -149,332 +149,332 @@ function jr() {
149
149
  groupEnd: e
150
150
  });
151
151
  }
152
- k++;
152
+ J++;
153
153
  }
154
154
  }
155
- function er() {
155
+ function me() {
156
156
  {
157
- if (k--, k === 0) {
157
+ if (J--, J === 0) {
158
158
  var e = {
159
159
  configurable: !0,
160
160
  enumerable: !0,
161
161
  writable: !0
162
162
  };
163
163
  Object.defineProperties(console, {
164
- log: d({}, e, {
165
- value: L
164
+ log: $({}, e, {
165
+ value: Y
166
166
  }),
167
- info: d({}, e, {
168
- value: Ee
167
+ info: $({}, e, {
168
+ value: Q
169
169
  }),
170
- warn: d({}, e, {
171
- value: _e
170
+ warn: $({}, e, {
171
+ value: z
172
172
  }),
173
- error: d({}, e, {
174
- value: Re
173
+ error: $({}, e, {
174
+ value: _
175
175
  }),
176
- group: d({}, e, {
177
- value: xe
176
+ group: $({}, e, {
177
+ value: F
178
178
  }),
179
- groupCollapsed: d({}, e, {
180
- value: we
179
+ groupCollapsed: $({}, e, {
180
+ value: fe
181
181
  }),
182
- groupEnd: d({}, e, {
183
- value: Se
182
+ groupEnd: $({}, e, {
183
+ value: ve
184
184
  })
185
185
  });
186
186
  }
187
- k < 0 && p("disabledDepth fell below zero. This is a bug in React. Please file an issue.");
187
+ J < 0 && S("disabledDepth fell below zero. This is a bug in React. Please file an issue.");
188
188
  }
189
189
  }
190
- var le = x.ReactCurrentDispatcher, ce;
191
- function Q(e, r, t) {
190
+ var je = E.ReactCurrentDispatcher, he;
191
+ function G(e, n, i) {
192
192
  {
193
- if (ce === void 0)
193
+ if (he === void 0)
194
194
  try {
195
195
  throw Error();
196
- } catch (u) {
197
- var a = u.stack.trim().match(/\n( *(at )?)/);
198
- ce = a && a[1] || "";
196
+ } catch (j) {
197
+ var m = j.stack.trim().match(/\n( *(at )?)/);
198
+ he = m && m[1] || "";
199
199
  }
200
200
  return `
201
- ` + ce + e;
201
+ ` + he + e;
202
202
  }
203
203
  }
204
- var ue = !1, ee;
204
+ var oe = !1, ie;
205
205
  {
206
- var rr = typeof WeakMap == "function" ? WeakMap : Map;
207
- ee = new rr();
206
+ var xe = typeof WeakMap == "function" ? WeakMap : Map;
207
+ ie = new xe();
208
208
  }
209
- function Te(e, r) {
210
- if (!e || ue)
209
+ function Ee(e, n) {
210
+ if (!e || oe)
211
211
  return "";
212
212
  {
213
- var t = ee.get(e);
214
- if (t !== void 0)
215
- return t;
213
+ var i = ie.get(e);
214
+ if (i !== void 0)
215
+ return i;
216
216
  }
217
- var a;
218
- ue = !0;
219
- var u = Error.prepareStackTrace;
217
+ var m;
218
+ oe = !0;
219
+ var j = Error.prepareStackTrace;
220
220
  Error.prepareStackTrace = void 0;
221
- var f;
222
- f = le.current, le.current = null, Qe();
221
+ var k;
222
+ k = je.current, je.current = null, we();
223
223
  try {
224
- if (r) {
225
- var l = function() {
224
+ if (n) {
225
+ var x = function() {
226
226
  throw Error();
227
227
  };
228
- if (Object.defineProperty(l.prototype, "props", {
228
+ if (Object.defineProperty(x.prototype, "props", {
229
229
  set: function() {
230
230
  throw Error();
231
231
  }
232
232
  }), typeof Reflect == "object" && Reflect.construct) {
233
233
  try {
234
- Reflect.construct(l, []);
235
- } catch (P) {
236
- a = P;
234
+ Reflect.construct(x, []);
235
+ } catch (ae) {
236
+ m = ae;
237
237
  }
238
- Reflect.construct(e, [], l);
238
+ Reflect.construct(e, [], x);
239
239
  } else {
240
240
  try {
241
- l.call();
242
- } catch (P) {
243
- a = P;
241
+ x.call();
242
+ } catch (ae) {
243
+ m = ae;
244
244
  }
245
- e.call(l.prototype);
245
+ e.call(x.prototype);
246
246
  }
247
247
  } else {
248
248
  try {
249
249
  throw Error();
250
- } catch (P) {
251
- a = P;
250
+ } catch (ae) {
251
+ m = ae;
252
252
  }
253
253
  e();
254
254
  }
255
- } catch (P) {
256
- if (P && a && typeof P.stack == "string") {
257
- for (var s = P.stack.split(`
258
- `), T = a.stack.split(`
259
- `), g = s.length - 1, _ = T.length - 1; g >= 1 && _ >= 0 && s[g] !== T[_]; )
260
- _--;
261
- for (; g >= 1 && _ >= 0; g--, _--)
262
- if (s[g] !== T[_]) {
263
- if (g !== 1 || _ !== 1)
255
+ } catch (ae) {
256
+ if (ae && m && typeof ae.stack == "string") {
257
+ for (var h = ae.stack.split(`
258
+ `), ee = m.stack.split(`
259
+ `), A = h.length - 1, U = ee.length - 1; A >= 1 && U >= 0 && h[A] !== ee[U]; )
260
+ U--;
261
+ for (; A >= 1 && U >= 0; A--, U--)
262
+ if (h[A] !== ee[U]) {
263
+ if (A !== 1 || U !== 1)
264
264
  do
265
- if (g--, _--, _ < 0 || s[g] !== T[_]) {
266
- var F = `
267
- ` + s[g].replace(" at new ", " at ");
268
- return e.displayName && F.includes("<anonymous>") && (F = F.replace("<anonymous>", e.displayName)), typeof e == "function" && ee.set(e, F), F;
265
+ if (A--, U--, U < 0 || h[A] !== ee[U]) {
266
+ var de = `
267
+ ` + h[A].replace(" at new ", " at ");
268
+ return e.displayName && de.includes("<anonymous>") && (de = de.replace("<anonymous>", e.displayName)), typeof e == "function" && ie.set(e, de), de;
269
269
  }
270
- while (g >= 1 && _ >= 0);
270
+ while (A >= 1 && U >= 0);
271
271
  break;
272
272
  }
273
273
  }
274
274
  } finally {
275
- ue = !1, le.current = f, er(), Error.prepareStackTrace = u;
275
+ oe = !1, je.current = k, me(), Error.prepareStackTrace = j;
276
276
  }
277
- var W = e ? e.displayName || e.name : "", I = W ? Q(W) : "";
278
- return typeof e == "function" && ee.set(e, I), I;
277
+ var Pe = e ? e.displayName || e.name : "", Re = Pe ? G(Pe) : "";
278
+ return typeof e == "function" && ie.set(e, Re), Re;
279
279
  }
280
- function tr(e, r, t) {
281
- return Te(e, !1);
280
+ function Ne(e, n, i) {
281
+ return Ee(e, !1);
282
282
  }
283
- function nr(e) {
284
- var r = e.prototype;
285
- return !!(r && r.isReactComponent);
283
+ function _e(e) {
284
+ var n = e.prototype;
285
+ return !!(n && n.isReactComponent);
286
286
  }
287
- function re(e, r, t) {
287
+ function le(e, n, i) {
288
288
  if (e == null)
289
289
  return "";
290
290
  if (typeof e == "function")
291
- return Te(e, nr(e));
291
+ return Ee(e, _e(e));
292
292
  if (typeof e == "string")
293
- return Q(e);
293
+ return G(e);
294
294
  switch (e) {
295
- case S:
296
- return Q("Suspense");
297
- case E:
298
- return Q("SuspenseList");
295
+ case W:
296
+ return G("Suspense");
297
+ case N:
298
+ return G("SuspenseList");
299
299
  }
300
300
  if (typeof e == "object")
301
301
  switch (e.$$typeof) {
302
- case b:
303
- return tr(e.render);
304
302
  case y:
305
- return re(e.type, r, t);
303
+ return Ne(e.render);
304
+ case b:
305
+ return le(e.type, n, i);
306
306
  case D: {
307
- var a = e, u = a._payload, f = a._init;
307
+ var m = e, j = m._payload, k = m._init;
308
308
  try {
309
- return re(f(u), r, t);
309
+ return le(k(j), n, i);
310
310
  } catch {
311
311
  }
312
312
  }
313
313
  }
314
314
  return "";
315
315
  }
316
- var z = Object.prototype.hasOwnProperty, je = {}, Pe = x.ReactDebugCurrentFrame;
317
- function te(e) {
316
+ var v = Object.prototype.hasOwnProperty, O = {}, V = E.ReactDebugCurrentFrame;
317
+ function pe(e) {
318
318
  if (e) {
319
- var r = e._owner, t = re(e.type, e._source, r ? r.type : null);
320
- Pe.setExtraStackFrame(t);
319
+ var n = e._owner, i = le(e.type, e._source, n ? n.type : null);
320
+ V.setExtraStackFrame(i);
321
321
  } else
322
- Pe.setExtraStackFrame(null);
322
+ V.setExtraStackFrame(null);
323
323
  }
324
- function ar(e, r, t, a, u) {
324
+ function Ye(e, n, i, m, j) {
325
325
  {
326
- var f = Function.call.bind(z);
327
- for (var l in e)
328
- if (f(e, l)) {
329
- var s = void 0;
326
+ var k = Function.call.bind(v);
327
+ for (var x in e)
328
+ if (k(e, x)) {
329
+ var h = void 0;
330
330
  try {
331
- if (typeof e[l] != "function") {
332
- var T = Error((a || "React class") + ": " + t + " type `" + l + "` is invalid; it must be a function, usually from the `prop-types` package, but received `" + typeof e[l] + "`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.");
333
- throw T.name = "Invariant Violation", T;
331
+ if (typeof e[x] != "function") {
332
+ var ee = Error((m || "React class") + ": " + i + " type `" + x + "` is invalid; it must be a function, usually from the `prop-types` package, but received `" + typeof e[x] + "`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.");
333
+ throw ee.name = "Invariant Violation", ee;
334
334
  }
335
- s = e[l](r, l, a, t, null, "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED");
336
- } catch (g) {
337
- s = g;
335
+ h = e[x](n, x, m, i, null, "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED");
336
+ } catch (A) {
337
+ h = A;
338
338
  }
339
- s && !(s instanceof Error) && (te(u), p("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).", a || "React class", t, l, typeof s), te(null)), s instanceof Error && !(s.message in je) && (je[s.message] = !0, te(u), p("Failed %s type: %s", t, s.message), te(null));
339
+ h && !(h instanceof Error) && (pe(j), S("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).", m || "React class", i, x, typeof h), pe(null)), h instanceof Error && !(h.message in O) && (O[h.message] = !0, pe(j), S("Failed %s type: %s", i, h.message), pe(null));
340
340
  }
341
341
  }
342
342
  }
343
- var or = Array.isArray;
344
- function de(e) {
345
- return or(e);
343
+ var ze = Array.isArray;
344
+ function u(e) {
345
+ return ze(e);
346
346
  }
347
- function ir(e) {
347
+ function ce(e) {
348
348
  {
349
- var r = typeof Symbol == "function" && Symbol.toStringTag, t = r && e[Symbol.toStringTag] || e.constructor.name || "Object";
350
- return t;
349
+ var n = typeof Symbol == "function" && Symbol.toStringTag, i = n && e[Symbol.toStringTag] || e.constructor.name || "Object";
350
+ return i;
351
351
  }
352
352
  }
353
- function sr(e) {
353
+ function te(e) {
354
354
  try {
355
- return Oe(e), !1;
355
+ return K(e), !1;
356
356
  } catch {
357
357
  return !0;
358
358
  }
359
359
  }
360
- function Oe(e) {
360
+ function K(e) {
361
361
  return "" + e;
362
362
  }
363
- function ke(e) {
364
- if (sr(e))
365
- return p("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.", ir(e)), Oe(e);
363
+ function Le(e) {
364
+ if (te(e))
365
+ return S("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.", ce(e)), K(e);
366
366
  }
367
- var Fe = x.ReactCurrentOwner, lr = {
367
+ var be = E.ReactCurrentOwner, Ve = {
368
368
  key: !0,
369
369
  ref: !0,
370
370
  __self: !0,
371
371
  __source: !0
372
- }, Ae, De;
373
- function cr(e) {
374
- if (z.call(e, "ref")) {
375
- var r = Object.getOwnPropertyDescriptor(e, "ref").get;
376
- if (r && r.isReactWarning)
372
+ }, nr, sr;
373
+ function Cr(e) {
374
+ if (v.call(e, "ref")) {
375
+ var n = Object.getOwnPropertyDescriptor(e, "ref").get;
376
+ if (n && n.isReactWarning)
377
377
  return !1;
378
378
  }
379
379
  return e.ref !== void 0;
380
380
  }
381
- function ur(e) {
382
- if (z.call(e, "key")) {
383
- var r = Object.getOwnPropertyDescriptor(e, "key").get;
384
- if (r && r.isReactWarning)
381
+ function kr(e) {
382
+ if (v.call(e, "key")) {
383
+ var n = Object.getOwnPropertyDescriptor(e, "key").get;
384
+ if (n && n.isReactWarning)
385
385
  return !1;
386
386
  }
387
387
  return e.key !== void 0;
388
388
  }
389
- function dr(e, r) {
390
- typeof e.ref == "string" && Fe.current;
389
+ function Pr(e, n) {
390
+ typeof e.ref == "string" && be.current;
391
391
  }
392
- function fr(e, r) {
392
+ function Tr(e, n) {
393
393
  {
394
- var t = function() {
395
- Ae || (Ae = !0, p("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", r));
394
+ var i = function() {
395
+ nr || (nr = !0, S("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", n));
396
396
  };
397
- t.isReactWarning = !0, Object.defineProperty(e, "key", {
398
- get: t,
397
+ i.isReactWarning = !0, Object.defineProperty(e, "key", {
398
+ get: i,
399
399
  configurable: !0
400
400
  });
401
401
  }
402
402
  }
403
- function mr(e, r) {
403
+ function Sr(e, n) {
404
404
  {
405
- var t = function() {
406
- De || (De = !0, p("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", r));
405
+ var i = function() {
406
+ sr || (sr = !0, S("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)", n));
407
407
  };
408
- t.isReactWarning = !0, Object.defineProperty(e, "ref", {
409
- get: t,
408
+ i.isReactWarning = !0, Object.defineProperty(e, "ref", {
409
+ get: i,
410
410
  configurable: !0
411
411
  });
412
412
  }
413
413
  }
414
- var vr = function(e, r, t, a, u, f, l) {
415
- var s = {
414
+ var Fr = function(e, n, i, m, j, k, x) {
415
+ var h = {
416
416
  // This tag allows us to uniquely identify this as a React Element
417
- $$typeof: o,
417
+ $$typeof: t,
418
418
  // Built-in properties that belong on the element
419
419
  type: e,
420
- key: r,
421
- ref: t,
422
- props: l,
420
+ key: n,
421
+ ref: i,
422
+ props: x,
423
423
  // Record the component responsible for creating this element.
424
- _owner: f
424
+ _owner: k
425
425
  };
426
- return s._store = {}, Object.defineProperty(s._store, "validated", {
426
+ return h._store = {}, Object.defineProperty(h._store, "validated", {
427
427
  configurable: !1,
428
428
  enumerable: !1,
429
429
  writable: !0,
430
430
  value: !1
431
- }), Object.defineProperty(s, "_self", {
431
+ }), Object.defineProperty(h, "_self", {
432
432
  configurable: !1,
433
433
  enumerable: !1,
434
434
  writable: !1,
435
- value: a
436
- }), Object.defineProperty(s, "_source", {
435
+ value: m
436
+ }), Object.defineProperty(h, "_source", {
437
437
  configurable: !1,
438
438
  enumerable: !1,
439
439
  writable: !1,
440
- value: u
441
- }), Object.freeze && (Object.freeze(s.props), Object.freeze(s)), s;
440
+ value: j
441
+ }), Object.freeze && (Object.freeze(h.props), Object.freeze(h)), h;
442
442
  };
443
- function pr(e, r, t, a, u) {
443
+ function Or(e, n, i, m, j) {
444
444
  {
445
- var f, l = {}, s = null, T = null;
446
- t !== void 0 && (ke(t), s = "" + t), ur(r) && (ke(r.key), s = "" + r.key), cr(r) && (T = r.ref, dr(r, u));
447
- for (f in r)
448
- z.call(r, f) && !lr.hasOwnProperty(f) && (l[f] = r[f]);
445
+ var k, x = {}, h = null, ee = null;
446
+ i !== void 0 && (Le(i), h = "" + i), kr(n) && (Le(n.key), h = "" + n.key), Cr(n) && (ee = n.ref, Pr(n, j));
447
+ for (k in n)
448
+ v.call(n, k) && !Ve.hasOwnProperty(k) && (x[k] = n[k]);
449
449
  if (e && e.defaultProps) {
450
- var g = e.defaultProps;
451
- for (f in g)
452
- l[f] === void 0 && (l[f] = g[f]);
450
+ var A = e.defaultProps;
451
+ for (k in A)
452
+ x[k] === void 0 && (x[k] = A[k]);
453
453
  }
454
- if (s || T) {
455
- var _ = typeof e == "function" ? e.displayName || e.name || "Unknown" : e;
456
- s && fr(l, _), T && mr(l, _);
454
+ if (h || ee) {
455
+ var U = typeof e == "function" ? e.displayName || e.name || "Unknown" : e;
456
+ h && Tr(x, U), ee && Sr(x, U);
457
457
  }
458
- return vr(e, s, T, u, a, Fe.current, l);
458
+ return Fr(e, h, ee, j, m, be.current, x);
459
459
  }
460
460
  }
461
- var fe = x.ReactCurrentOwner, Ne = x.ReactDebugCurrentFrame;
462
- function $(e) {
461
+ var Ke = E.ReactCurrentOwner, or = E.ReactDebugCurrentFrame;
462
+ function ke(e) {
463
463
  if (e) {
464
- var r = e._owner, t = re(e.type, e._source, r ? r.type : null);
465
- Ne.setExtraStackFrame(t);
464
+ var n = e._owner, i = le(e.type, e._source, n ? n.type : null);
465
+ or.setExtraStackFrame(i);
466
466
  } else
467
- Ne.setExtraStackFrame(null);
467
+ or.setExtraStackFrame(null);
468
468
  }
469
- var me;
470
- me = !1;
471
- function ve(e) {
472
- return typeof e == "object" && e !== null && e.$$typeof === o;
469
+ var qe;
470
+ qe = !1;
471
+ function Ge(e) {
472
+ return typeof e == "object" && e !== null && e.$$typeof === t;
473
473
  }
474
- function Le() {
474
+ function ir() {
475
475
  {
476
- if (fe.current) {
477
- var e = N(fe.current.type);
476
+ if (Ke.current) {
477
+ var e = w(Ke.current.type);
478
478
  if (e)
479
479
  return `
480
480
 
@@ -483,497 +483,1621 @@ Check the render method of \`` + e + "`.";
483
483
  return "";
484
484
  }
485
485
  }
486
- function yr(e) {
486
+ function Wr(e) {
487
487
  return "";
488
488
  }
489
- var Ue = {};
490
- function hr(e) {
489
+ var lr = {};
490
+ function Dr(e) {
491
491
  {
492
- var r = Le();
493
- if (!r) {
494
- var t = typeof e == "string" ? e : e.displayName || e.name;
495
- t && (r = `
492
+ var n = ir();
493
+ if (!n) {
494
+ var i = typeof e == "string" ? e : e.displayName || e.name;
495
+ i && (n = `
496
496
 
497
- Check the top-level render call using <` + t + ">.");
497
+ Check the top-level render call using <` + i + ">.");
498
498
  }
499
- return r;
499
+ return n;
500
500
  }
501
501
  }
502
- function Ye(e, r) {
502
+ function cr(e, n) {
503
503
  {
504
504
  if (!e._store || e._store.validated || e.key != null)
505
505
  return;
506
506
  e._store.validated = !0;
507
- var t = hr(r);
508
- if (Ue[t])
507
+ var i = Dr(n);
508
+ if (lr[i])
509
509
  return;
510
- Ue[t] = !0;
511
- var a = "";
512
- e && e._owner && e._owner !== fe.current && (a = " It was passed a child from " + N(e._owner.type) + "."), $(e), p('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.', t, a), $(null);
510
+ lr[i] = !0;
511
+ var m = "";
512
+ e && e._owner && e._owner !== Ke.current && (m = " It was passed a child from " + w(e._owner.type) + "."), ke(e), S('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.', i, m), ke(null);
513
513
  }
514
514
  }
515
- function Me(e, r) {
515
+ function dr(e, n) {
516
516
  {
517
517
  if (typeof e != "object")
518
518
  return;
519
- if (de(e))
520
- for (var t = 0; t < e.length; t++) {
521
- var a = e[t];
522
- ve(a) && Ye(a, r);
519
+ if (u(e))
520
+ for (var i = 0; i < e.length; i++) {
521
+ var m = e[i];
522
+ Ge(m) && cr(m, n);
523
523
  }
524
- else if (ve(e))
524
+ else if (Ge(e))
525
525
  e._store && (e._store.validated = !0);
526
526
  else if (e) {
527
- var u = j(e);
528
- if (typeof u == "function" && u !== e.entries)
529
- for (var f = u.call(e), l; !(l = f.next()).done; )
530
- ve(l.value) && Ye(l.value, r);
527
+ var j = se(e);
528
+ if (typeof j == "function" && j !== e.entries)
529
+ for (var k = j.call(e), x; !(x = k.next()).done; )
530
+ Ge(x.value) && cr(x.value, n);
531
531
  }
532
532
  }
533
533
  }
534
- function gr(e) {
534
+ function $r(e) {
535
535
  {
536
- var r = e.type;
537
- if (r == null || typeof r == "string")
536
+ var n = e.type;
537
+ if (n == null || typeof n == "string")
538
538
  return;
539
- var t;
540
- if (typeof r == "function")
541
- t = r.propTypes;
542
- else if (typeof r == "object" && (r.$$typeof === b || // Note: Memo only checks outer props here.
539
+ var i;
540
+ if (typeof n == "function")
541
+ i = n.propTypes;
542
+ else if (typeof n == "object" && (n.$$typeof === y || // Note: Memo only checks outer props here.
543
543
  // Inner props are checked in the reconciler.
544
- r.$$typeof === y))
545
- t = r.propTypes;
544
+ n.$$typeof === b))
545
+ i = n.propTypes;
546
546
  else
547
547
  return;
548
- if (t) {
549
- var a = N(r);
550
- ar(t, e.props, "prop", a, e);
551
- } else if (r.PropTypes !== void 0 && !me) {
552
- me = !0;
553
- var u = N(r);
554
- p("Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?", u || "Unknown");
548
+ if (i) {
549
+ var m = w(n);
550
+ Ye(i, e.props, "prop", m, e);
551
+ } else if (n.PropTypes !== void 0 && !qe) {
552
+ qe = !0;
553
+ var j = w(n);
554
+ S("Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?", j || "Unknown");
555
555
  }
556
- typeof r.getDefaultProps == "function" && !r.getDefaultProps.isReactClassApproved && p("getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead.");
556
+ typeof n.getDefaultProps == "function" && !n.getDefaultProps.isReactClassApproved && S("getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead.");
557
557
  }
558
558
  }
559
- function br(e) {
559
+ function Ar(e) {
560
560
  {
561
- for (var r = Object.keys(e.props), t = 0; t < r.length; t++) {
562
- var a = r[t];
563
- if (a !== "children" && a !== "key") {
564
- $(e), p("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.", a), $(null);
561
+ for (var n = Object.keys(e.props), i = 0; i < n.length; i++) {
562
+ var m = n[i];
563
+ if (m !== "children" && m !== "key") {
564
+ ke(e), S("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.", m), ke(null);
565
565
  break;
566
566
  }
567
567
  }
568
- e.ref !== null && ($(e), p("Invalid attribute `ref` supplied to `React.Fragment`."), $(null));
568
+ e.ref !== null && (ke(e), S("Invalid attribute `ref` supplied to `React.Fragment`."), ke(null));
569
569
  }
570
570
  }
571
- var Ie = {};
572
- function $e(e, r, t, a, u, f) {
571
+ var ur = {};
572
+ function mr(e, n, i, m, j, k) {
573
573
  {
574
- var l = Y(e);
575
- if (!l) {
576
- var s = "";
577
- (e === void 0 || typeof e == "object" && e !== null && Object.keys(e).length === 0) && (s += " You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.");
578
- var T = yr();
579
- T ? s += T : s += Le();
580
- var g;
581
- e === null ? g = "null" : de(e) ? g = "array" : e !== void 0 && e.$$typeof === o ? (g = "<" + (N(e.type) || "Unknown") + " />", s = " Did you accidentally export a JSX literal instead of a component?") : g = typeof e, p("React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s", g, s);
574
+ var x = R(e);
575
+ if (!x) {
576
+ var h = "";
577
+ (e === void 0 || typeof e == "object" && e !== null && Object.keys(e).length === 0) && (h += " You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.");
578
+ var ee = Wr();
579
+ ee ? h += ee : h += ir();
580
+ var A;
581
+ e === null ? A = "null" : u(e) ? A = "array" : e !== void 0 && e.$$typeof === t ? (A = "<" + (w(e.type) || "Unknown") + " />", h = " Did you accidentally export a JSX literal instead of a component?") : A = typeof e, S("React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s", A, h);
582
582
  }
583
- var _ = pr(e, r, t, u, f);
584
- if (_ == null)
585
- return _;
586
- if (l) {
587
- var F = r.children;
588
- if (F !== void 0)
589
- if (a)
590
- if (de(F)) {
591
- for (var W = 0; W < F.length; W++)
592
- Me(F[W], e);
593
- Object.freeze && Object.freeze(F);
583
+ var U = Or(e, n, i, j, k);
584
+ if (U == null)
585
+ return U;
586
+ if (x) {
587
+ var de = n.children;
588
+ if (de !== void 0)
589
+ if (m)
590
+ if (u(de)) {
591
+ for (var Pe = 0; Pe < de.length; Pe++)
592
+ dr(de[Pe], e);
593
+ Object.freeze && Object.freeze(de);
594
594
  } else
595
- p("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");
595
+ S("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");
596
596
  else
597
- Me(F, e);
597
+ dr(de, e);
598
598
  }
599
- if (z.call(r, "key")) {
600
- var I = N(e), P = Object.keys(r).filter(function(Sr) {
601
- return Sr !== "key";
602
- }), pe = P.length > 0 ? "{key: someKey, " + P.join(": ..., ") + ": ...}" : "{key: someKey}";
603
- if (!Ie[I + pe]) {
604
- var wr = P.length > 0 ? "{" + P.join(": ..., ") + ": ...}" : "{}";
605
- p(`A props object containing a "key" prop is being spread into JSX:
599
+ if (v.call(n, "key")) {
600
+ var Re = w(e), ae = Object.keys(n).filter(function(Yr) {
601
+ return Yr !== "key";
602
+ }), Je = ae.length > 0 ? "{key: someKey, " + ae.join(": ..., ") + ": ...}" : "{key: someKey}";
603
+ if (!ur[Re + Je]) {
604
+ var Br = ae.length > 0 ? "{" + ae.join(": ..., ") + ": ...}" : "{}";
605
+ S(`A props object containing a "key" prop is being spread into JSX:
606
606
  let props = %s;
607
607
  <%s {...props} />
608
608
  React keys must be passed directly to JSX without using spread:
609
609
  let props = %s;
610
- <%s key={someKey} {...props} />`, pe, I, wr, I), Ie[I + pe] = !0;
610
+ <%s key={someKey} {...props} />`, Je, Re, Br, Re), ur[Re + Je] = !0;
611
611
  }
612
612
  }
613
- return e === i ? br(_) : gr(_), _;
613
+ return e === o ? Ar(U) : $r(U), U;
614
614
  }
615
615
  }
616
- function Er(e, r, t) {
617
- return $e(e, r, t, !0);
616
+ function Mr(e, n, i) {
617
+ return mr(e, n, i, !0);
618
618
  }
619
- function _r(e, r, t) {
620
- return $e(e, r, t, !1);
619
+ function Ir(e, n, i) {
620
+ return mr(e, n, i, !1);
621
621
  }
622
- var Rr = _r, xr = Er;
623
- B.Fragment = i, B.jsx = Rr, B.jsxs = xr;
624
- }()), B;
622
+ var Ur = Ir, Lr = Mr;
623
+ Ae.Fragment = o, Ae.jsx = Ur, Ae.jsxs = Lr;
624
+ }()), Ae;
625
625
  }
626
- process.env.NODE_ENV === "production" ? be.exports = Tr() : be.exports = jr();
627
- var m = be.exports;
628
- function Ke(n) {
629
- var o, c, i = "";
630
- if (typeof n == "string" || typeof n == "number") i += n;
631
- else if (typeof n == "object") if (Array.isArray(n)) {
632
- var v = n.length;
633
- for (o = 0; o < v; o++) n[o] && (c = Ke(n[o])) && (i && (i += " "), i += c);
634
- } else for (c in n) n[c] && (i && (i += " "), i += c);
635
- return i;
626
+ process.env.NODE_ENV === "production" ? rr.exports = zr() : rr.exports = Vr();
627
+ var a = rr.exports;
628
+ function _r(r) {
629
+ var t, s, o = "";
630
+ if (typeof r == "string" || typeof r == "number") o += r;
631
+ else if (typeof r == "object") if (Array.isArray(r)) {
632
+ var l = r.length;
633
+ for (t = 0; t < l; t++) r[t] && (s = _r(r[t])) && (o && (o += " "), o += s);
634
+ } else for (s in r) r[s] && (o && (o += " "), o += s);
635
+ return o;
636
636
  }
637
- function ze() {
638
- for (var n, o, c = 0, i = "", v = arguments.length; c < v; c++) (n = arguments[c]) && (o = Ke(n)) && (i && (i += " "), i += o);
639
- return i;
637
+ function Z() {
638
+ for (var r, t, s = 0, o = "", l = arguments.length; s < l; s++) (r = arguments[s]) && (t = _r(r)) && (o && (o += " "), o += t);
639
+ return o;
640
640
  }
641
- const Pr = "https://core.spreedly.com/iframe/iframe-v1.min.js";
642
- let ae = {};
643
- const $r = (n) => {
644
- ae = { ...ae, ...n };
645
- }, qe = (n) => {
646
- var c;
647
- const o = globalThis.process;
648
- return (c = o == null ? void 0 : o.env) == null ? void 0 : c[n];
649
- }, Ge = () => ({
650
- baseUrl: ae.baseUrl ?? qe("REACT_APP_MOVMO_API_URL") ?? "",
651
- spreedlyScriptUrl: ae.spreedlyScriptUrl ?? qe("REACT_APP_SPREEDLY_SCRIPT_URL") ?? Pr
652
- }), He = {
641
+ const Kr = "https://core.spreedly.com/iframe/iframe-v1.min.js", qr = "https://cdn.e2e.movmo.io";
642
+ let Te = {};
643
+ const wt = (r) => {
644
+ Te = { ...Te, ...r };
645
+ }, He = (r) => {
646
+ var s;
647
+ const t = globalThis.process;
648
+ return (s = t == null ? void 0 : t.env) == null ? void 0 : s[r];
649
+ }, De = () => ({
650
+ baseUrl: Te.baseUrl ?? He("REACT_APP_MOVMO_API_URL") ?? "",
651
+ spreedlyScriptUrl: Te.spreedlyScriptUrl ?? He("REACT_APP_SPREEDLY_SCRIPT_URL") ?? Kr,
652
+ iconCdnBaseUrl: Te.iconCdnBaseUrl ?? He("REACT_APP_MOVMO_ICON_CDN_URL") ?? qr,
653
+ fetch: Te.fetch ?? (typeof globalThis < "u" && typeof globalThis.fetch == "function" ? globalThis.fetch.bind(globalThis) : (() => {
654
+ throw new Error("@movmo_app/payments: no fetch available");
655
+ })())
656
+ }), tr = (r) => ({
657
+ id: r.id,
658
+ last4: r.last4,
659
+ brand: r.brand,
660
+ expMonth: r.expMonth,
661
+ expYear: r.expYear,
662
+ isDefault: r.isDefault
663
+ }), Se = {
653
664
  Accept: "application/json",
654
665
  "Content-Type": "application/json"
655
- }, Xe = (n) => {
656
- const { baseUrl: o } = Ge();
657
- if (!o)
666
+ }, Fe = (r) => {
667
+ const { baseUrl: t } = De();
668
+ if (!t)
658
669
  throw new Error(
659
670
  "@movmo_app/payments: baseUrl is not configured. Call setPaymentsConfig({ baseUrl }) at app boot, or set REACT_APP_MOVMO_API_URL."
660
671
  );
661
- return `${o}${n}`;
662
- }, Ze = async (n, o) => {
672
+ return `${t}${r}`;
673
+ }, Oe = (r, t) => {
674
+ const { fetch: s } = De();
675
+ return s(r, t);
676
+ }, We = async (r, t) => {
663
677
  try {
664
- return (await n.json()).message || o;
678
+ return (await r.json()).message || t;
665
679
  } catch {
666
- return o;
680
+ return t;
667
681
  }
668
- }, Or = async () => {
669
- const n = await fetch(Xe("/v1/payments/tokenization-session"), {
682
+ };
683
+ let Me = null;
684
+ const ar = () => {
685
+ if (Me) return Me;
686
+ const r = (async () => {
687
+ const t = await Oe(Fe("/v1/payments/tokenization-session"), {
688
+ method: "GET",
689
+ headers: Se,
690
+ credentials: "include"
691
+ });
692
+ if (!t.ok)
693
+ throw new Error(
694
+ await We(t, `Failed to fetch tokenization session (${t.status})`)
695
+ );
696
+ return await t.json();
697
+ })();
698
+ return Me = r, r.finally(() => {
699
+ Me === r && (Me = null);
700
+ }).catch(() => {
701
+ }), r;
702
+ }, Gr = (r) => typeof r.brand == "string" && typeof r.last4 == "string" && typeof r.expMonth == "number" && typeof r.expYear == "number", Jr = async (r, t, s) => {
703
+ const o = await Oe(
704
+ Fe(`/v1/users/${encodeURIComponent(r)}/payment-methods/from-token`),
705
+ {
706
+ method: "POST",
707
+ headers: Se,
708
+ credentials: "include",
709
+ body: JSON.stringify({ tokenizedPaymentMethodId: t, isDefault: s })
710
+ }
711
+ );
712
+ if (!o.ok)
713
+ throw new Error(await We(o, `Failed to save payment method (${o.status})`));
714
+ const l = await o.json();
715
+ if (Gr(l))
716
+ return tr(l);
717
+ const c = await Oe(
718
+ Fe(
719
+ `/v1/users/${encodeURIComponent(r)}/payment-methods/${encodeURIComponent(l.id)}`
720
+ ),
721
+ {
722
+ method: "GET",
723
+ headers: Se,
724
+ credentials: "include"
725
+ }
726
+ );
727
+ if (!c.ok)
728
+ throw new Error(
729
+ await We(c, `Failed to fetch saved payment method (${c.status})`)
730
+ );
731
+ const f = await c.json();
732
+ return tr(f);
733
+ }, Hr = async (r) => {
734
+ const t = await Oe(Fe(`/v1/users/${encodeURIComponent(r)}/payment-methods`), {
670
735
  method: "GET",
671
- headers: He,
736
+ headers: Se,
672
737
  credentials: "include"
673
738
  });
674
- if (!n.ok)
675
- throw new Error(await Ze(n, `Failed to fetch tokenization session (${n.status})`));
676
- return await n.json();
677
- }, kr = async (n, o, c) => {
678
- const i = await fetch(Xe(`/v1/users/${encodeURIComponent(n)}/payment-methods/from-token`), {
679
- method: "POST",
680
- headers: He,
681
- credentials: "include",
682
- body: JSON.stringify({ tokenizedPaymentMethodId: o, isDefault: c })
683
- });
684
- if (!i.ok)
685
- throw new Error(await Ze(i, `Failed to save payment method (${i.status})`));
686
- const v = await i.json();
687
- return {
688
- id: v.id,
689
- last4: v.last4,
690
- brand: v.brand,
691
- expMonth: v.expMonth,
692
- expYear: v.expYear,
693
- isDefault: v.isDefault
694
- };
739
+ if (!t.ok)
740
+ throw new Error(await We(t, `Failed to fetch payment methods (${t.status})`));
741
+ return (await t.json() ?? []).map(tr);
742
+ }, Zr = async (r, t) => {
743
+ const s = await Oe(
744
+ Fe(
745
+ `/v1/users/${encodeURIComponent(r)}/payment-methods/${encodeURIComponent(t)}`
746
+ ),
747
+ {
748
+ method: "DELETE",
749
+ headers: Se,
750
+ credentials: "include"
751
+ }
752
+ );
753
+ if (!s.ok)
754
+ throw new Error(await We(s, `Failed to delete payment method (${s.status})`));
755
+ }, Xr = async (r, t, s) => {
756
+ const o = await Oe(
757
+ Fe(
758
+ `/v1/users/${encodeURIComponent(r)}/payment-methods/${encodeURIComponent(t)}`
759
+ ),
760
+ {
761
+ method: "PUT",
762
+ headers: Se,
763
+ credentials: "include",
764
+ body: JSON.stringify(s)
765
+ }
766
+ );
767
+ if (!o.ok)
768
+ throw new Error(await We(o, `Failed to update payment method (${o.status})`));
769
+ }, Qr = {
770
+ visa: "visa",
771
+ master: "mastercard",
772
+ mastercard: "mastercard",
773
+ american_express: "amex",
774
+ amex: "amex",
775
+ discover: "discover"
776
+ }, et = 28, Ce = ({
777
+ brand: r,
778
+ className: t,
779
+ width: s = 46
780
+ }) => {
781
+ const o = r ? Qr[r.toLowerCase()] ?? "credit-card" : "credit-card", l = Math.max(s, et), c = Math.round(l * 24 / 34), { iconCdnBaseUrl: f } = De();
782
+ return /* @__PURE__ */ a.jsx(
783
+ "img",
784
+ {
785
+ src: `${f}/website/assets/icons/payments/${o}.svg`,
786
+ alt: o === "credit-card" ? "card" : `${o} card`,
787
+ "data-testid": `card-brand-${r.toLowerCase()}`,
788
+ className: t,
789
+ width: l,
790
+ height: c,
791
+ loading: "lazy"
792
+ }
793
+ );
695
794
  };
696
- let J = null;
697
- const Fr = () => {
795
+ let Ie = null;
796
+ const rt = () => {
698
797
  if (typeof window > "u")
699
798
  return Promise.reject(new Error("Spreedly can only be loaded in a browser environment."));
700
799
  if (window.Spreedly)
701
800
  return Promise.resolve(window.Spreedly);
702
- if (J)
703
- return J;
704
- const { spreedlyScriptUrl: n } = Ge();
705
- return J = new Promise((o, c) => {
706
- const i = document.querySelector(
707
- `script[src="${n}"]`
708
- ), v = () => {
709
- window.Spreedly ? o(window.Spreedly) : c(new Error("Spreedly script loaded but window.Spreedly is undefined."));
801
+ if (Ie)
802
+ return Ie;
803
+ const { spreedlyScriptUrl: r } = De();
804
+ return Ie = new Promise((t, s) => {
805
+ const o = document.querySelector(
806
+ `script[src="${r}"]`
807
+ ), l = () => {
808
+ window.Spreedly ? t(window.Spreedly) : s(new Error("Spreedly script loaded but window.Spreedly is undefined."));
710
809
  };
711
- if (i) {
810
+ if (o) {
712
811
  if (window.Spreedly) {
713
- v();
812
+ l();
714
813
  return;
715
814
  }
716
- i.addEventListener("load", v, { once: !0 }), i.addEventListener(
815
+ o.addEventListener("load", l, { once: !0 }), o.addEventListener(
717
816
  "error",
718
817
  () => {
719
- i.remove(), c(new Error("Failed to load Spreedly iframe script."));
818
+ o.remove(), s(new Error("Failed to load Spreedly iframe script."));
720
819
  },
721
820
  { once: !0 }
722
821
  );
723
822
  return;
724
823
  }
725
- const w = document.createElement("script");
726
- w.src = n, w.async = !0, w.onload = v, w.onerror = () => {
727
- w.remove(), c(new Error("Failed to load Spreedly iframe script."));
728
- }, document.head.appendChild(w);
729
- }).catch((o) => {
730
- throw J = null, o;
731
- }), J;
732
- }, Ar = "movmo-card-number", Dr = "movmo-card-cvv", Nr = (n) => ({
733
- first_name: n.firstName,
734
- last_name: n.lastName,
735
- month: n.month,
736
- year: n.year,
737
- ...n.email ? { email: n.email } : {},
738
- ...n.zip ? { zip: n.zip } : {}
739
- }), Lr = (n = {}) => {
824
+ const c = document.createElement("script");
825
+ c.src = r, c.async = !0, c.onload = l, c.onerror = () => {
826
+ c.remove(), s(new Error("Failed to load Spreedly iframe script."));
827
+ }, document.head.appendChild(c);
828
+ }).catch((t) => {
829
+ throw Ie = null, t;
830
+ }), Ie;
831
+ }, tt = "movmo-card-number", at = "movmo-card-cvv", nt = (r) => ({
832
+ first_name: r.firstName,
833
+ last_name: r.lastName,
834
+ month: r.month,
835
+ year: r.year,
836
+ ...r.email ? { email: r.email } : {},
837
+ ...r.zip ? { zip: r.zip } : {}
838
+ }), st = (r = {}) => {
740
839
  const {
741
- numberEl: o = Ar,
742
- cvvEl: c = Dr,
743
- onCardTokenized: i,
744
- onFieldErrors: v
745
- } = n, [w, A] = M("idle"), [O, b] = M(null), S = ye(null), E = ye(i), y = ye(v);
746
- he(() => {
747
- E.current = i;
748
- }, [i]), he(() => {
749
- y.current = v;
750
- }, [v]), he(() => {
751
- let C = !1;
752
- return A("loading"), b(null), (async () => {
840
+ numberEl: t = tt,
841
+ cvvEl: s = at,
842
+ onCardTokenized: o,
843
+ onFieldErrors: l,
844
+ onValidityChange: c,
845
+ onBrandChange: f
846
+ } = r, [p, y] = P("idle"), [W, N] = P(null), [b, D] = P({ number: !1, cvv: !1 }), [M, X] = P(null), [T, se] = P({ number: !1, cvv: !1 }), E = B(null), S = B(o), q = B(l), ue = B(c), re = B(f);
847
+ L(() => {
848
+ S.current = o;
849
+ }, [o]), L(() => {
850
+ q.current = l;
851
+ }, [l]), L(() => {
852
+ ue.current = c;
853
+ }, [c]), L(() => {
854
+ re.current = f;
855
+ }, [f]);
856
+ const g = B({ number: !1, cvv: !1 });
857
+ L(() => {
858
+ let I = !1;
859
+ return y("loading"), N(null), D({ number: !1, cvv: !1 }), X(null), g.current = { number: !1, cvv: !1 }, (async () => {
753
860
  try {
754
- const [h, R] = await Promise.all([
755
- Or(),
756
- Fr()
861
+ const [R, d] = await Promise.all([
862
+ ar(),
863
+ rt()
757
864
  ]);
758
- if (C) return;
759
- S.current = R, R.on("ready", () => {
760
- C || A("ready");
761
- }), R.on("paymentMethod", (j) => {
762
- var x;
763
- (x = E.current) == null || x.call(E, j);
764
- }), R.on("errors", (j) => {
765
- var x;
766
- (x = y.current) == null || x.call(y, j);
767
- }), R.on("consoleError", (j) => {
768
- var p;
769
- const x = j instanceof Error ? j.message : "An unexpected error occurred while securing your card.";
770
- (p = y.current) == null || p.call(y, [{ message: x }]);
771
- }), R.init(h.environmentKey, {
772
- numberEl: o,
773
- cvvEl: c,
774
- nonce: h.nonce,
775
- timestamp: String(h.timestamp),
776
- certificateToken: h.certificateToken,
777
- signature: h.signature
865
+ if (I) return;
866
+ E.current = d, d.on("ready", () => {
867
+ var C, w, $, J, Y, Q;
868
+ if (!I) {
869
+ y("ready");
870
+ try {
871
+ (C = d.setFieldType) == null || C.call(d, "number", "tel"), (w = d.setFieldType) == null || w.call(d, "cvv", "tel");
872
+ } catch {
873
+ }
874
+ try {
875
+ typeof d.setNumberFormat == "function" ? d.setNumberFormat("prettyFormat") : console.warn(
876
+ "@movmo_app/payments: Spreedly.setNumberFormat is missing card-number digits will not be space-grouped."
877
+ );
878
+ } catch (z) {
879
+ console.warn("@movmo_app/payments: setNumberFormat failed", z);
880
+ }
881
+ try {
882
+ ($ = d.setPlaceholder) == null || $.call(d, "number", "Card number"), (J = d.setPlaceholder) == null || J.call(d, "cvv", "CVV");
883
+ const z = 'box-sizing: border-box;width: 100%;height: 100%;margin: 0;padding: 0;border: 0;background: transparent;outline: none;font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;font-size: 14px;font-weight: 400;line-height: 20px;color: rgb(28 25 23);letter-spacing: 0;vertical-align: middle;';
884
+ (Y = d.setStyle) == null || Y.call(d, "number", z), (Q = d.setStyle) == null || Q.call(d, "cvv", z);
885
+ } catch {
886
+ }
887
+ }
888
+ }), d.on("paymentMethod", (C) => {
889
+ var w;
890
+ (w = S.current) == null || w.call(S, C);
891
+ }), d.on("errors", (C) => {
892
+ var w;
893
+ (w = q.current) == null || w.call(q, C);
894
+ }), d.on("fieldEvent", (C, w, $, J) => {
895
+ var z;
896
+ if (I) return;
897
+ if (w === "focus") {
898
+ se((_) => _[C] ? _ : { ..._, [C]: !0 });
899
+ return;
900
+ }
901
+ if (w === "blur") {
902
+ se((_) => _[C] ? { ..._, [C]: !1 } : _);
903
+ return;
904
+ }
905
+ if (w !== "input") return;
906
+ const Y = J ?? {};
907
+ if (C === "number") {
908
+ if (Y.numberLength === 0)
909
+ X((_) => {
910
+ var F;
911
+ return _ !== null && ((F = re.current) == null || F.call(re, null)), null;
912
+ });
913
+ else if (Y.cardType !== void 0) {
914
+ const _ = Y.cardType || null;
915
+ X((F) => {
916
+ var fe;
917
+ return F !== _ && ((fe = re.current) == null || fe.call(re, _)), _;
918
+ });
919
+ }
920
+ }
921
+ const Q = C === "number" ? typeof Y.validNumber == "boolean" ? Y.validNumber : void 0 : typeof Y.validCvv == "boolean" ? Y.validCvv : void 0;
922
+ if (typeof Q == "boolean") {
923
+ const _ = g.current, F = C === "number" ? { ..._, number: Q } : { ..._, cvv: Q };
924
+ (F.number !== _.number || F.cvv !== _.cvv) && (g.current = F, D(F), (z = ue.current) == null || z.call(ue, F));
925
+ }
926
+ }), d.on("consoleError", (C) => {
927
+ var $;
928
+ const w = C instanceof Error ? C.message : "An unexpected error occurred while securing your card.";
929
+ ($ = q.current) == null || $.call(q, [{ message: w }]);
930
+ }), d.init(R.environmentKey, {
931
+ numberEl: t,
932
+ cvvEl: s,
933
+ nonce: R.nonce,
934
+ timestamp: String(R.timestamp),
935
+ certificateToken: R.certificateToken,
936
+ signature: R.signature
778
937
  });
779
- } catch (h) {
780
- if (C) return;
781
- const R = h instanceof Error ? h.message : "Failed to initialize card form.";
782
- b(R), A("error");
938
+ } catch (R) {
939
+ if (I) return;
940
+ const d = R instanceof Error ? R.message : "Failed to initialize card form.";
941
+ N(d), y("error");
783
942
  }
784
943
  })(), () => {
785
- var h, R;
786
- C = !0;
944
+ var R, d;
945
+ I = !0;
787
946
  try {
788
- (R = (h = S.current) == null ? void 0 : h.removeHandlers) == null || R.call(h);
947
+ (d = (R = E.current) == null ? void 0 : R.removeHandlers) == null || d.call(R);
789
948
  } catch {
790
949
  }
791
- S.current = null;
950
+ E.current = null;
792
951
  };
793
- }, [o, c]);
794
- const D = ge((C) => {
795
- var h;
796
- (h = S.current) == null || h.tokenizeCreditCard(Nr(C));
952
+ }, [t, s]);
953
+ const ne = H((I) => {
954
+ var R;
955
+ (R = E.current) == null || R.tokenizeCreditCard(nt(I));
956
+ }, []), ye = H((I) => {
957
+ var R, d;
958
+ (d = (R = E.current) == null ? void 0 : R.transferFocus) == null || d.call(R, I);
797
959
  }, []);
798
- return { status: w, error: O, tokenize: D };
799
- }, ne = "h-11 w-full rounded-md border border-grayWarm-300 bg-white px-3 py-2 text-sm text-grayWarm-900 placeholder:text-grayWarm-400 focus:border-brand-500 focus:outline-none focus:ring-1 focus:ring-brand-500", Be = "h-11 w-full rounded-md border border-grayWarm-300 bg-white px-3 py-2 focus-within:border-brand-500 focus-within:ring-1 focus-within:ring-brand-500", V = "mb-1 block text-xs font-medium text-grayWarm-700", Ur = Array.from({ length: 12 }, (n, o) => String(o + 1).padStart(2, "0")), Yr = (() => {
800
- const n = (/* @__PURE__ */ new Date()).getFullYear();
801
- return Array.from({ length: 15 }, (o, c) => String(n + c));
802
- })(), Mr = ({
803
- userId: n,
804
- onSuccess: o,
805
- onError: c,
806
- isDefault: i = !1,
807
- className: v,
808
- defaultCardholderFirstName: w = "",
809
- defaultCardholderLastName: A = ""
960
+ return { status: p, error: W, tokenize: ne, validity: b, brand: M, focused: T, focusField: ye };
961
+ }, Ze = "h-11 w-full rounded-md border border-grayWarm-300 bg-white px-3 py-2 text-sm text-grayWarm-900 placeholder:text-grayWarm-400 outline-none focus:border-grayWarm-950 focus:shadow-[0_0_0_1px_#1c1917]", yr = "flex h-11 w-full items-center gap-2 rounded-md border bg-white px-3 py-2 transition-shadow", vr = "border-grayWarm-950 shadow-[0_0_0_1px_#1c1917]", hr = "border-grayWarm-300", ot = (r) => {
962
+ const t = r.trim();
963
+ if (!t) return { firstName: "", lastName: "" };
964
+ const s = t.lastIndexOf(" ");
965
+ return s === -1 ? { firstName: t, lastName: "" } : {
966
+ firstName: t.slice(0, s).trim(),
967
+ lastName: t.slice(s + 1).trim()
968
+ };
969
+ }, Nr = (r) => {
970
+ const t = r.replace(/\D/g, "");
971
+ if (t.length < 4) return { month: "", year: "" };
972
+ const s = t.slice(0, 2), o = t.slice(2), l = o.length === 2 ? `20${o}` : o.slice(0, 4);
973
+ return { month: s, year: l };
974
+ }, it = (r) => {
975
+ const t = r.replace(/\D/g, "").slice(0, 4);
976
+ return t.length <= 2 ? t : `${t.slice(0, 2)} / ${t.slice(2)}`;
977
+ }, Xe = (r) => {
978
+ const { month: t, year: s } = Nr(r);
979
+ if (!t || !s) return !1;
980
+ const o = parseInt(t, 10), l = parseInt(s, 10);
981
+ if (isNaN(o) || o < 1 || o > 12) return !1;
982
+ const c = /* @__PURE__ */ new Date();
983
+ return !(l < c.getFullYear() || l > c.getFullYear() + 20 || l === c.getFullYear() && o < c.getMonth() + 1);
984
+ }, Qe = (r) => /^\d{5}(-\d{4})?$/.test(r.trim()), lt = (r) => {
985
+ const t = r.replace(/[^\d]/g, "").slice(0, 9);
986
+ return t.length <= 5 ? t : `${t.slice(0, 5)}-${t.slice(5)}`;
987
+ }, Rr = ({
988
+ userId: r,
989
+ onSuccess: t,
990
+ onError: s,
991
+ isDefault: o = !1,
992
+ className: l,
993
+ defaultCardholderName: c,
994
+ defaultCardholderFirstName: f = "",
995
+ defaultCardholderLastName: p = "",
996
+ autoSave: y = !1,
997
+ formId: W = "movmo-card-form",
998
+ hideInternalSaveButton: N = !1,
999
+ onCanSubmitChange: b,
1000
+ onSavingChange: D,
1001
+ autoFocus: M
810
1002
  }) => {
811
- const [O, b] = M(w), [S, E] = M(A), [y, D] = M(""), [C, h] = M(""), [R, j] = M("idle"), [x, p] = M(null), K = ge(
812
- async (d) => {
813
- j("saving");
1003
+ const X = c ?? [f, p].filter(Boolean).join(" "), [T, se] = P(X), [E, S] = P(""), [q, ue] = P(""), [re, g] = P("idle"), ne = B(!1), ye = H(
1004
+ async (v) => {
1005
+ g("saving");
814
1006
  try {
815
- const k = await kr(n, d, i);
816
- j("ready"), o(k);
817
- } catch (k) {
818
- const L = k instanceof Error ? k.message : "Failed to save payment method.";
819
- p(L), j("ready"), c(L);
1007
+ const O = await Jr(r, v, o);
1008
+ g("ready"), t(O);
1009
+ } catch (O) {
1010
+ const V = O instanceof Error ? O.message : "Failed to save payment method.";
1011
+ g("ready"), ne.current = !1, s(V);
820
1012
  }
821
1013
  },
822
- [n, i, o, c]
823
- ), G = ge(
824
- (d) => {
825
- const k = d.map((L) => L.message).filter(Boolean).join("; ") || "Card validation failed.";
826
- p(k), j((L) => L === "tokenizing" ? "ready" : L), c(k);
1014
+ [r, o, t, s]
1015
+ ), I = H(
1016
+ (v) => {
1017
+ const O = v.map((V) => V.message).filter(Boolean).join("; ") || "Card validation failed.";
1018
+ g((V) => V === "tokenizing" ? "ready" : V), ne.current = !1, s(O);
827
1019
  },
828
- [c]
829
- ), oe = Cr(
1020
+ [s]
1021
+ ), R = Ue(
830
1022
  () => ({
831
- onCardTokenized: K,
832
- onFieldErrors: G
1023
+ onCardTokenized: ye,
1024
+ onFieldErrors: I
833
1025
  }),
834
- [K, G]
835
- ), { status: U, error: ie, tokenize: se } = Lr(oe), H = !O.trim() || !S.trim() || !y || !C, Y = R === "tokenizing" || R === "saving", X = U === "ready" && !Y && !H, Z = (d) => {
836
- d.preventDefault(), X && (p(null), j("tokenizing"), se({
837
- firstName: O.trim(),
838
- lastName: S.trim(),
839
- month: y,
840
- year: C
841
- }));
842
- }, N = x ?? ie;
843
- return /* @__PURE__ */ m.jsxs(
1026
+ [ye, I]
1027
+ ), {
1028
+ status: d,
1029
+ error: C,
1030
+ tokenize: w,
1031
+ validity: $,
1032
+ brand: J,
1033
+ focused: Y,
1034
+ focusField: Q
1035
+ } = st(R), z = B(!1);
1036
+ L(() => {
1037
+ !M || d !== "ready" || z.current || (z.current = !0, Q(M));
1038
+ }, [M, d, Q]);
1039
+ const _ = T.trim().split(/\s+/).length >= 2, F = Xe(E), fe = Qe(q), ve = B(!1), ge = B(!1), we = B(!1), me = B(null), je = B(null);
1040
+ L(() => {
1041
+ var v;
1042
+ $.cvv ? ge.current || (ge.current = !0, (v = me.current) == null || v.focus()) : ge.current = !1;
1043
+ }, [$.cvv]);
1044
+ const he = !_ || !F || !fe || !$.number || !$.cvv, G = re === "tokenizing" || re === "saving", oe = d === "ready" && !G && !he, ie = B(b);
1045
+ L(() => {
1046
+ ie.current = b;
1047
+ }, [b]), L(() => {
1048
+ var v;
1049
+ (v = ie.current) == null || v.call(ie, oe);
1050
+ }, [oe]);
1051
+ const xe = B(D);
1052
+ L(() => {
1053
+ xe.current = D;
1054
+ }, [D]), L(() => {
1055
+ var v;
1056
+ (v = xe.current) == null || v.call(xe, G);
1057
+ }, [G]);
1058
+ const Ee = H(() => {
1059
+ const { firstName: v, lastName: O } = ot(T), { month: V, year: pe } = Nr(E);
1060
+ g("tokenizing"), w({ firstName: v, lastName: O, month: V, year: pe, zip: q.trim() });
1061
+ }, [T, E, q, w]);
1062
+ L(() => {
1063
+ if (!y || !oe || ne.current) return;
1064
+ const v = setTimeout(() => {
1065
+ ne.current = !0, Ee();
1066
+ }, 1200);
1067
+ return () => clearTimeout(v);
1068
+ }, [y, oe, Ee]);
1069
+ const Ne = (v) => {
1070
+ v.preventDefault(), oe && Ee();
1071
+ }, _e = d !== "ready" || G, le = B(s);
1072
+ return L(() => {
1073
+ le.current = s;
1074
+ }, [s]), L(() => {
1075
+ var v;
1076
+ C && ((v = le.current) == null || v.call(le, C));
1077
+ }, [C]), /* @__PURE__ */ a.jsxs(
844
1078
  "form",
845
1079
  {
846
- onSubmit: Z,
847
- className: ze("flex w-full flex-col gap-4", v),
1080
+ id: W,
1081
+ onSubmit: Ne,
1082
+ className: Z("flex w-full flex-col gap-3", l),
848
1083
  "data-testid": "movmo-card-form",
849
1084
  children: [
850
- /* @__PURE__ */ m.jsxs("div", { className: "grid grid-cols-1 gap-3 sm:grid-cols-2", children: [
851
- /* @__PURE__ */ m.jsxs("div", { children: [
852
- /* @__PURE__ */ m.jsx("label", { htmlFor: "movmo-card-first-name", className: V, children: "First name" }),
853
- /* @__PURE__ */ m.jsx(
1085
+ /* @__PURE__ */ a.jsxs("div", { children: [
1086
+ /* @__PURE__ */ a.jsx("span", { id: "movmo-card-number-label", className: "sr-only", children: "Card number" }),
1087
+ /* @__PURE__ */ a.jsxs(
1088
+ "div",
1089
+ {
1090
+ className: Z(
1091
+ yr,
1092
+ Y.number ? vr : hr
1093
+ ),
1094
+ children: [
1095
+ /* @__PURE__ */ a.jsx(Ce, { brand: J ?? "", width: 32, className: "flex-shrink-0" }),
1096
+ /* @__PURE__ */ a.jsxs("div", { className: "relative h-full flex-1", children: [
1097
+ /* @__PURE__ */ a.jsx(
1098
+ "div",
1099
+ {
1100
+ id: "movmo-card-number",
1101
+ "aria-labelledby": "movmo-card-number-label",
1102
+ "aria-busy": d !== "ready",
1103
+ className: "absolute inset-0",
1104
+ "data-testid": "movmo-card-number-mount"
1105
+ }
1106
+ ),
1107
+ d !== "ready" ? /* @__PURE__ */ a.jsx(
1108
+ "div",
1109
+ {
1110
+ "aria-hidden": "true",
1111
+ className: "pointer-events-none absolute inset-y-2 left-0 right-2 animate-pulse rounded bg-grayWarm-200"
1112
+ }
1113
+ ) : null
1114
+ ] })
1115
+ ]
1116
+ }
1117
+ )
1118
+ ] }),
1119
+ /* @__PURE__ */ a.jsxs("div", { className: "grid grid-cols-3 gap-3", children: [
1120
+ /* @__PURE__ */ a.jsxs("div", { children: [
1121
+ /* @__PURE__ */ a.jsx("label", { htmlFor: "movmo-card-expiry", className: "sr-only", children: "Expiry MM / YY" }),
1122
+ /* @__PURE__ */ a.jsx(
854
1123
  "input",
855
1124
  {
856
- id: "movmo-card-first-name",
1125
+ id: "movmo-card-expiry",
857
1126
  type: "text",
858
- autoComplete: "cc-given-name",
859
- value: O,
860
- onChange: (d) => b(d.target.value),
861
- className: ne,
862
- disabled: U !== "ready" || Y,
863
- required: !0
1127
+ inputMode: "numeric",
1128
+ autoComplete: "cc-exp",
1129
+ placeholder: "MM / YY",
1130
+ value: E,
1131
+ onChange: (v) => {
1132
+ const O = it(v.target.value);
1133
+ S(O), Xe(O) && !ve.current ? (ve.current = !0, Q("cvv")) : Xe(O) || (ve.current = !1);
1134
+ },
1135
+ className: Z(Ze, E && !F && "border-error-500"),
1136
+ disabled: _e,
1137
+ required: !0,
1138
+ "data-testid": "movmo-card-expiry-input"
864
1139
  }
865
1140
  )
866
1141
  ] }),
867
- /* @__PURE__ */ m.jsxs("div", { children: [
868
- /* @__PURE__ */ m.jsx("label", { htmlFor: "movmo-card-last-name", className: V, children: "Last name" }),
869
- /* @__PURE__ */ m.jsx(
1142
+ /* @__PURE__ */ a.jsxs("div", { className: "relative", children: [
1143
+ /* @__PURE__ */ a.jsx("span", { id: "movmo-card-cvv-label", className: "sr-only", children: "CVV" }),
1144
+ /* @__PURE__ */ a.jsxs(
1145
+ "div",
1146
+ {
1147
+ className: Z(
1148
+ yr,
1149
+ Y.cvv ? vr : hr
1150
+ ),
1151
+ children: [
1152
+ /* @__PURE__ */ a.jsxs("div", { className: "relative h-full flex-1", children: [
1153
+ /* @__PURE__ */ a.jsx(
1154
+ "div",
1155
+ {
1156
+ id: "movmo-card-cvv",
1157
+ "aria-labelledby": "movmo-card-cvv-label",
1158
+ "aria-busy": d !== "ready",
1159
+ className: "absolute inset-0",
1160
+ "data-testid": "movmo-card-cvv-mount"
1161
+ }
1162
+ ),
1163
+ d !== "ready" ? /* @__PURE__ */ a.jsx(
1164
+ "div",
1165
+ {
1166
+ "aria-hidden": "true",
1167
+ className: "pointer-events-none absolute inset-y-2 left-0 right-2 animate-pulse rounded bg-grayWarm-200"
1168
+ }
1169
+ ) : null
1170
+ ] }),
1171
+ /* @__PURE__ */ a.jsx(
1172
+ "button",
1173
+ {
1174
+ type: "button",
1175
+ "aria-label": "CVV help",
1176
+ tabIndex: -1,
1177
+ className: "flex h-5 w-5 flex-shrink-0 items-center justify-center rounded-full border border-grayWarm-300 text-xs text-grayWarm-500",
1178
+ title: J === "american_express" ? "The 4 numbers on the front of your card." : "The 3 numbers on the back of your card.",
1179
+ "data-testid": "movmo-cvv-help",
1180
+ children: "?"
1181
+ }
1182
+ )
1183
+ ]
1184
+ }
1185
+ )
1186
+ ] }),
1187
+ /* @__PURE__ */ a.jsxs("div", { children: [
1188
+ /* @__PURE__ */ a.jsx("label", { htmlFor: "movmo-card-zip", className: "sr-only", children: "ZIP code" }),
1189
+ /* @__PURE__ */ a.jsx(
870
1190
  "input",
871
1191
  {
872
- id: "movmo-card-last-name",
1192
+ id: "movmo-card-zip",
1193
+ ref: me,
873
1194
  type: "text",
874
- autoComplete: "cc-family-name",
875
- value: S,
876
- onChange: (d) => E(d.target.value),
877
- className: ne,
878
- disabled: U !== "ready" || Y,
879
- required: !0
1195
+ inputMode: "numeric",
1196
+ autoComplete: "postal-code",
1197
+ placeholder: "ZIP code",
1198
+ value: q,
1199
+ onChange: (v) => {
1200
+ var V;
1201
+ const O = lt(v.target.value);
1202
+ ue(O), Qe(O) && !we.current ? (we.current = !0, (V = je.current) == null || V.focus()) : Qe(O) || (we.current = !1);
1203
+ },
1204
+ className: Z(Ze, q && !fe && "border-error-500"),
1205
+ disabled: _e,
1206
+ required: !0,
1207
+ "data-testid": "movmo-card-zip-input"
880
1208
  }
881
1209
  )
882
1210
  ] })
883
1211
  ] }),
884
- /* @__PURE__ */ m.jsxs("div", { children: [
885
- /* @__PURE__ */ m.jsx("span", { id: "movmo-card-number-label", className: V, children: "Card number" }),
886
- /* @__PURE__ */ m.jsx(
887
- "div",
1212
+ /* @__PURE__ */ a.jsxs("div", { children: [
1213
+ /* @__PURE__ */ a.jsx("label", { htmlFor: "movmo-card-cardholder-name", className: "sr-only", children: "Cardholder name" }),
1214
+ /* @__PURE__ */ a.jsx(
1215
+ "input",
888
1216
  {
889
- id: "movmo-card-number",
890
- "aria-labelledby": "movmo-card-number-label",
891
- className: Be,
892
- "data-testid": "movmo-card-number-mount"
1217
+ id: "movmo-card-cardholder-name",
1218
+ ref: je,
1219
+ type: "text",
1220
+ autoComplete: "cc-name",
1221
+ placeholder: "Cardholder name",
1222
+ value: T,
1223
+ onChange: (v) => se(v.target.value),
1224
+ className: Ze,
1225
+ disabled: _e,
1226
+ required: !0,
1227
+ "data-testid": "movmo-card-cardholder-name-input"
893
1228
  }
894
1229
  )
895
1230
  ] }),
896
- /* @__PURE__ */ m.jsxs("div", { className: "grid grid-cols-3 gap-3", children: [
897
- /* @__PURE__ */ m.jsxs("div", { children: [
898
- /* @__PURE__ */ m.jsx("label", { htmlFor: "movmo-card-exp-month", className: V, children: "Month" }),
899
- /* @__PURE__ */ m.jsxs(
900
- "select",
1231
+ !y && !N ? /* @__PURE__ */ a.jsx(
1232
+ "button",
1233
+ {
1234
+ type: "submit",
1235
+ disabled: !oe,
1236
+ className: Z(
1237
+ "inline-flex h-11 items-center justify-center rounded-md bg-brand-500 px-4 text-sm font-semibold text-white transition-colors hover:bg-brand-600",
1238
+ "disabled:cursor-not-allowed disabled:bg-grayWarm-300 disabled:text-grayWarm-500"
1239
+ ),
1240
+ "data-testid": "movmo-card-save",
1241
+ children: G ? "Saving…" : d === "loading" ? "Loading…" : "Save card"
1242
+ }
1243
+ ) : G && y ? (
1244
+ // In autoSave mode (empty-state inline form, no Save button at all),
1245
+ // surface the in-flight state as inline text. The modal flow uses a
1246
+ // spinner inside the modal-footer Save button instead — see
1247
+ // AddPaymentMethodModal.isSaving.
1248
+ /* @__PURE__ */ a.jsx(
1249
+ "p",
1250
+ {
1251
+ className: "text-center text-sm text-grayWarm-500",
1252
+ "aria-live": "polite",
1253
+ "data-testid": "movmo-card-autosaving",
1254
+ children: "Saving card…"
1255
+ }
1256
+ )
1257
+ ) : null
1258
+ ]
1259
+ }
1260
+ );
1261
+ };
1262
+ Rr.displayName = "MovmoCardForm";
1263
+ const ct = (r) => {
1264
+ const [t, s] = P("idle"), [o, l] = P(null);
1265
+ return { deletePaymentMethod: H(
1266
+ async (f) => {
1267
+ s("pending"), l(null);
1268
+ try {
1269
+ await Zr(r, f), s("idle");
1270
+ } catch (p) {
1271
+ const y = p instanceof Error ? p.message : "Failed to delete payment method.";
1272
+ throw l(y), s("error"), p;
1273
+ }
1274
+ },
1275
+ [r]
1276
+ ), status: t, error: o };
1277
+ }, dt = (r) => {
1278
+ const [t, s] = P("idle"), [o, l] = P(null);
1279
+ return { setDefault: H(
1280
+ async (f) => {
1281
+ s("pending"), l(null);
1282
+ try {
1283
+ await Xr(r, f, { isDefault: !0 }), s("idle");
1284
+ } catch (p) {
1285
+ const y = p instanceof Error ? p.message : "Failed to set default payment method.";
1286
+ throw l(y), s("error"), p;
1287
+ }
1288
+ },
1289
+ [r]
1290
+ ), status: t, error: o };
1291
+ }, ut = (r) => {
1292
+ const [t, s] = P([]), [o, l] = P("idle"), [c, f] = P(null), [p, y] = P(0), W = B(null);
1293
+ L(() => {
1294
+ var D;
1295
+ (D = W.current) == null || D.abort();
1296
+ const b = new AbortController();
1297
+ return W.current = b, l("loading"), f(null), Hr(r).then((M) => {
1298
+ b.signal.aborted || (s(M), l("ready"));
1299
+ }).catch((M) => {
1300
+ if (b.signal.aborted) return;
1301
+ const X = M instanceof Error ? M.message : "Failed to fetch payment methods.";
1302
+ f(X), l("error");
1303
+ }), () => {
1304
+ b.abort();
1305
+ };
1306
+ }, [r, p]);
1307
+ const N = H(() => {
1308
+ y((b) => b + 1);
1309
+ }, []);
1310
+ return { items: t, status: o, error: c, refetch: N };
1311
+ }, mt = ({
1312
+ open: r,
1313
+ onClose: t,
1314
+ formId: s,
1315
+ saveDisabled: o,
1316
+ saveLabel: l = "Save",
1317
+ isSaving: c = !1,
1318
+ children: f
1319
+ }) => (L(() => {
1320
+ if (!r) return;
1321
+ const p = (y) => {
1322
+ y.key === "Escape" && t();
1323
+ };
1324
+ return document.addEventListener("keydown", p), () => document.removeEventListener("keydown", p);
1325
+ }, [r, t]), L(() => {
1326
+ if (!r) return;
1327
+ const p = document.body.style.overflow;
1328
+ return document.body.style.overflow = "hidden", () => {
1329
+ document.body.style.overflow = p;
1330
+ };
1331
+ }, [r]), r ? /* @__PURE__ */ a.jsx(
1332
+ "div",
1333
+ {
1334
+ role: "dialog",
1335
+ "aria-modal": "true",
1336
+ "aria-labelledby": "movmo-add-payment-title",
1337
+ className: "fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4",
1338
+ onClick: (p) => {
1339
+ p.target === p.currentTarget && t();
1340
+ },
1341
+ "data-testid": "add-payment-method-modal",
1342
+ children: /* @__PURE__ */ a.jsxs("div", { className: "flex max-h-full w-full max-w-md flex-col rounded-xl bg-white shadow-2xl", children: [
1343
+ /* @__PURE__ */ a.jsxs("div", { className: "flex items-center gap-3 border-b border-grayWarm-200 px-4 py-3", children: [
1344
+ /* @__PURE__ */ a.jsx(
1345
+ "button",
1346
+ {
1347
+ type: "button",
1348
+ onClick: t,
1349
+ "aria-label": "Close add-payment dialog",
1350
+ className: "flex h-9 w-9 flex-shrink-0 items-center justify-center rounded-lg bg-grayWarm-100 p-2 text-grayWarm-950 transition-colors hover:bg-grayWarm-200",
1351
+ "data-testid": "add-payment-method-close",
1352
+ children: /* @__PURE__ */ a.jsx("svg", { viewBox: "0 0 20 20", width: "20", height: "20", "aria-hidden": "true", children: /* @__PURE__ */ a.jsx(
1353
+ "path",
901
1354
  {
902
- id: "movmo-card-exp-month",
903
- value: y,
904
- onChange: (d) => D(d.target.value),
905
- className: ne,
906
- disabled: U !== "ready" || Y,
907
- required: !0,
908
- children: [
909
- /* @__PURE__ */ m.jsx("option", { value: "", children: "MM" }),
910
- Ur.map((d) => /* @__PURE__ */ m.jsx("option", { value: d, children: d }, d))
911
- ]
1355
+ d: "M5 5L15 15M15 5L5 15",
1356
+ stroke: "currentColor",
1357
+ strokeWidth: "1.67",
1358
+ strokeLinecap: "round",
1359
+ strokeLinejoin: "round"
912
1360
  }
913
- )
914
- ] }),
915
- /* @__PURE__ */ m.jsxs("div", { children: [
916
- /* @__PURE__ */ m.jsx("label", { htmlFor: "movmo-card-exp-year", className: V, children: "Year" }),
917
- /* @__PURE__ */ m.jsxs(
918
- "select",
1361
+ ) })
1362
+ }
1363
+ ),
1364
+ /* @__PURE__ */ a.jsx(
1365
+ "h2",
1366
+ {
1367
+ id: "movmo-add-payment-title",
1368
+ className: "flex-1 text-center text-base font-semibold text-grayWarm-900",
1369
+ children: "Add payment method"
1370
+ }
1371
+ ),
1372
+ /* @__PURE__ */ a.jsx("span", { "aria-hidden": "true", className: "h-9 w-9 flex-shrink-0" })
1373
+ ] }),
1374
+ /* @__PURE__ */ a.jsx("div", { className: "flex-1 overflow-y-auto p-4", children: f }),
1375
+ /* @__PURE__ */ a.jsxs("div", { className: "flex gap-3 border-t border-grayWarm-200 p-4", children: [
1376
+ /* @__PURE__ */ a.jsx(
1377
+ "button",
1378
+ {
1379
+ type: "button",
1380
+ onClick: t,
1381
+ className: "inline-flex h-11 flex-1 items-center justify-center rounded-lg border border-grayWarm-300 px-4 text-sm font-semibold text-grayWarm-900 transition-colors hover:border-grayWarm-900 hover:shadow-[0_0_0_1px_#1c1917]",
1382
+ "data-testid": "add-payment-method-cancel",
1383
+ children: "Cancel"
1384
+ }
1385
+ ),
1386
+ /* @__PURE__ */ a.jsx(
1387
+ "button",
1388
+ {
1389
+ type: "submit",
1390
+ form: s,
1391
+ disabled: c ? !1 : o,
1392
+ "aria-disabled": c || o,
1393
+ "aria-busy": c,
1394
+ className: Z(
1395
+ "inline-flex h-11 flex-1 items-center justify-center rounded-lg bg-brand-500 px-4 text-sm font-semibold text-white transition-colors",
1396
+ c ? "cursor-not-allowed opacity-90 pointer-events-none" : "hover:bg-brand-600 disabled:cursor-not-allowed disabled:bg-grayWarm-300 disabled:text-grayWarm-500"
1397
+ ),
1398
+ "data-testid": "add-payment-method-save",
1399
+ children: c ? /* @__PURE__ */ a.jsxs(a.Fragment, { children: [
1400
+ /* @__PURE__ */ a.jsxs(
1401
+ "svg",
1402
+ {
1403
+ className: "h-[18px] w-[18px] animate-spin",
1404
+ viewBox: "0 0 24 24",
1405
+ fill: "none",
1406
+ "aria-hidden": "true",
1407
+ children: [
1408
+ /* @__PURE__ */ a.jsx(
1409
+ "circle",
1410
+ {
1411
+ cx: "12",
1412
+ cy: "12",
1413
+ r: "10",
1414
+ stroke: "currentColor",
1415
+ strokeWidth: "3",
1416
+ strokeOpacity: "0.25"
1417
+ }
1418
+ ),
1419
+ /* @__PURE__ */ a.jsx(
1420
+ "path",
1421
+ {
1422
+ d: "M22 12a10 10 0 0 1-10 10",
1423
+ stroke: "currentColor",
1424
+ strokeWidth: "3",
1425
+ strokeLinecap: "round"
1426
+ }
1427
+ )
1428
+ ]
1429
+ }
1430
+ ),
1431
+ /* @__PURE__ */ a.jsx("span", { className: "sr-only", children: "Saving card" })
1432
+ ] }) : l
1433
+ }
1434
+ )
1435
+ ] })
1436
+ ] })
1437
+ }
1438
+ ) : null), ft = (r) => {
1439
+ if (!r) return "Card";
1440
+ const t = r.toLowerCase();
1441
+ return t === "amex" ? "Amex" : t.charAt(0).toUpperCase() + t.slice(1);
1442
+ }, pt = ({
1443
+ method: r,
1444
+ trailing: t,
1445
+ onClick: s,
1446
+ cardLabelFormat: o = "branded",
1447
+ className: l
1448
+ }) => /* @__PURE__ */ a.jsxs(
1449
+ "div",
1450
+ {
1451
+ className: Z("flex items-center gap-3", s && "cursor-pointer", l),
1452
+ onClick: s,
1453
+ role: s ? "button" : void 0,
1454
+ tabIndex: s ? 0 : void 0,
1455
+ onKeyDown: s ? (c) => {
1456
+ (c.key === "Enter" || c.key === " ") && (c.preventDefault(), s());
1457
+ } : void 0,
1458
+ "data-testid": `payment-method-preview-${r.id}`,
1459
+ children: [
1460
+ /* @__PURE__ */ a.jsx(Ce, { brand: r.brand, width: 34, className: "flex-shrink-0" }),
1461
+ /* @__PURE__ */ a.jsx("span", { className: "flex-1 text-lg font-semibold text-grayWarm-950", children: o === "masked" ? `•••• ${r.last4}` : `${ft(r.brand)} ${r.last4}` }),
1462
+ t
1463
+ ]
1464
+ }
1465
+ ), yt = (r, t, s = /* @__PURE__ */ new Date()) => t < s.getFullYear() || t === s.getFullYear() && r < s.getMonth() + 1, xr = (r) => {
1466
+ if (!r) return "Card";
1467
+ const t = r.toLowerCase();
1468
+ return t === "amex" ? "Amex" : t.charAt(0).toUpperCase() + t.slice(1);
1469
+ }, vt = (r, t) => `${String(r).padStart(2, "0")}/${t}`, ht = ({
1470
+ method: r,
1471
+ selectable: t,
1472
+ selected: s,
1473
+ onSelect: o,
1474
+ onSetDefault: l,
1475
+ onRemove: c,
1476
+ disabled: f,
1477
+ showDefaultBadge: p,
1478
+ hideSetDefaultMenuItem: y,
1479
+ cardLabelFormat: W = "branded"
1480
+ }) => {
1481
+ const [N, b] = P(!1), D = B(null), M = yt(r.expMonth, r.expYear);
1482
+ L(() => {
1483
+ if (!N) return;
1484
+ const T = (se) => {
1485
+ var E;
1486
+ (E = D.current) != null && E.contains(se.target) || b(!1);
1487
+ };
1488
+ return document.addEventListener("mousedown", T), () => document.removeEventListener("mousedown", T);
1489
+ }, [N]);
1490
+ const X = () => {
1491
+ t && o && !f && o(r);
1492
+ };
1493
+ return /* @__PURE__ */ a.jsxs(
1494
+ "div",
1495
+ {
1496
+ className: Z(
1497
+ // items-start + per-element mt offsets so the radio, brand icon, and
1498
+ // label all read as one horizontal line, with the Exp text directly
1499
+ // below the label in the same column. Matches main's flights-ui +
1500
+ // accounts-ui row layout (both use items-start).
1501
+ "flex items-start gap-3 transition-colors",
1502
+ t ? "rounded-lg border px-3 py-3" : "py-4",
1503
+ t && !f && "cursor-pointer",
1504
+ t && (s ? "border-grayWarm-950 shadow-[0_0_0_1px_#1c1917]" : "border-grayWarm-200 hover:border-grayWarm-300")
1505
+ ),
1506
+ onClick: X,
1507
+ "data-testid": `payment-method-row-${r.id}`,
1508
+ children: [
1509
+ t ? /* @__PURE__ */ a.jsx(
1510
+ "input",
1511
+ {
1512
+ type: "radio",
1513
+ name: "movmo-payment-method",
1514
+ checked: s,
1515
+ onChange: () => o == null ? void 0 : o(r),
1516
+ onClick: (T) => T.stopPropagation(),
1517
+ "aria-label": `Select ${xr(r.brand)} ending ${r.last4}`,
1518
+ className: "mr-1 h-4 w-4 mt-2 cursor-pointer appearance-none rounded-full border-2 border-grayWarm-300 checked:border-[5px] checked:border-grayWarm-950 bg-white checked:bg-white focus:ring-0 focus:ring-offset-0",
1519
+ disabled: f
1520
+ }
1521
+ ) : null,
1522
+ /* @__PURE__ */ a.jsx(Ce, { brand: r.brand, className: "flex-shrink-0" }),
1523
+ /* @__PURE__ */ a.jsxs("div", { className: "min-w-0 flex-1", children: [
1524
+ /* @__PURE__ */ a.jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
1525
+ /* @__PURE__ */ a.jsx("span", { className: "text-lg font-semibold text-grayWarm-950", children: W === "masked" ? `•••• ${r.last4}` : `${xr(r.brand)} ${r.last4}` }),
1526
+ p && r.isDefault ? /* @__PURE__ */ a.jsx(
1527
+ "span",
919
1528
  {
920
- id: "movmo-card-exp-year",
921
- value: C,
922
- onChange: (d) => h(d.target.value),
923
- className: ne,
924
- disabled: U !== "ready" || Y,
925
- required: !0,
926
- children: [
927
- /* @__PURE__ */ m.jsx("option", { value: "", children: "YYYY" }),
928
- Yr.map((d) => /* @__PURE__ */ m.jsx("option", { value: d, children: d }, d))
929
- ]
1529
+ className: "inline-flex items-center rounded-full bg-success-50 px-2 py-0.5 text-xs font-semibold text-success-700",
1530
+ "data-testid": `badge-default-${r.id}`,
1531
+ children: "Default"
930
1532
  }
931
- )
932
- ] }),
933
- /* @__PURE__ */ m.jsxs("div", { children: [
934
- /* @__PURE__ */ m.jsx("span", { id: "movmo-card-cvv-label", className: V, children: "CVV" }),
935
- /* @__PURE__ */ m.jsx(
936
- "div",
1533
+ ) : null,
1534
+ M ? /* @__PURE__ */ a.jsx(
1535
+ "span",
937
1536
  {
938
- id: "movmo-card-cvv",
939
- "aria-labelledby": "movmo-card-cvv-label",
940
- className: Be,
941
- "data-testid": "movmo-card-cvv-mount"
1537
+ className: "inline-flex items-center rounded-full bg-error-50 px-2 py-0.5 text-xs font-semibold text-error-700",
1538
+ "data-testid": `badge-expired-${r.id}`,
1539
+ children: "Expired"
942
1540
  }
943
- )
1541
+ ) : null
1542
+ ] }),
1543
+ /* @__PURE__ */ a.jsxs("div", { className: Z("text-base", M ? "text-grayWarm-400" : "text-grayWarm-600"), children: [
1544
+ "Exp. ",
1545
+ vt(r.expMonth, r.expYear)
944
1546
  ] })
945
1547
  ] }),
946
- N ? /* @__PURE__ */ m.jsx(
947
- "p",
1548
+ /* @__PURE__ */ a.jsxs("div", { className: "relative flex-shrink-0", ref: D, children: [
1549
+ /* @__PURE__ */ a.jsx(
1550
+ "button",
1551
+ {
1552
+ type: "button",
1553
+ "aria-label": `Open actions for card ending ${r.last4}`,
1554
+ "aria-haspopup": "menu",
1555
+ "aria-expanded": N,
1556
+ className: "rounded-lg p-2 text-grayWarm-600 transition-colors hover:bg-grayWarm-100 disabled:cursor-not-allowed disabled:opacity-50",
1557
+ disabled: f,
1558
+ onClick: (T) => {
1559
+ T.stopPropagation(), b((se) => !se);
1560
+ },
1561
+ "data-testid": `menu-trigger-${r.id}`,
1562
+ children: /* @__PURE__ */ a.jsx(
1563
+ "svg",
1564
+ {
1565
+ viewBox: "0 0 24 24",
1566
+ width: "20",
1567
+ height: "20",
1568
+ fill: "currentColor",
1569
+ "aria-hidden": "true",
1570
+ children: /* @__PURE__ */ a.jsx("path", { d: "M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z" })
1571
+ }
1572
+ )
1573
+ }
1574
+ ),
1575
+ N ? /* @__PURE__ */ a.jsxs(
1576
+ "div",
1577
+ {
1578
+ role: "menu",
1579
+ className: Z(
1580
+ "absolute z-10 whitespace-nowrap rounded-lg border border-grayWarm-200 bg-white py-1 shadow-lg",
1581
+ // selectable mode (flights-ui): the row has a thick border that a
1582
+ // top-aligned dropdown would crash through. Float the menu ABOVE
1583
+ // the trigger button, horizontally centered, with a small tail
1584
+ // pointing back down at the dots. Matches main's flights-ui menu.
1585
+ // non-selectable mode (accounts-ui): no per-row border to
1586
+ // overlap; keep the menu below + right-aligned.
1587
+ t ? "bottom-full left-1/2 mb-2 -translate-x-1/2" : "right-0 top-full mt-1"
1588
+ ),
1589
+ onClick: (T) => T.stopPropagation(),
1590
+ "data-testid": `menu-${r.id}`,
1591
+ children: [
1592
+ t ? (
1593
+ // Tail: 8px square rotated 45° so its bottom-right corner
1594
+ // becomes a downward-pointing tip. Bottom + right borders of
1595
+ // the square form the menu's continuous border.
1596
+ /* @__PURE__ */ a.jsx(
1597
+ "span",
1598
+ {
1599
+ "aria-hidden": "true",
1600
+ className: "absolute -bottom-1.5 left-1/2 h-3 w-3 -translate-x-1/2 rotate-45 border-b border-r border-grayWarm-200 bg-white"
1601
+ }
1602
+ )
1603
+ ) : null,
1604
+ !r.isDefault && !y ? /* @__PURE__ */ a.jsx(
1605
+ "button",
1606
+ {
1607
+ type: "button",
1608
+ role: "menuitem",
1609
+ className: "block w-full px-4 py-1 text-left text-md font-semibold text-grayWarm-950 hover:text-grayWarm-700",
1610
+ onClick: () => {
1611
+ b(!1), l(r);
1612
+ },
1613
+ "data-testid": `menu-set-default-${r.id}`,
1614
+ children: "Set as default"
1615
+ }
1616
+ ) : null,
1617
+ /* @__PURE__ */ a.jsx(
1618
+ "button",
1619
+ {
1620
+ type: "button",
1621
+ role: "menuitem",
1622
+ className: "block w-full px-4 py-1 text-left text-md font-semibold text-error-700 hover:text-error-500",
1623
+ onClick: () => {
1624
+ b(!1), c(r);
1625
+ },
1626
+ "data-testid": `menu-remove-${r.id}`,
1627
+ children: "Delete"
1628
+ }
1629
+ )
1630
+ ]
1631
+ }
1632
+ ) : null
1633
+ ] })
1634
+ ]
1635
+ }
1636
+ );
1637
+ }, xt = (r) => `${De().iconCdnBaseUrl}/website/assets/icons/payments/${r}.svg`, er = ({ slug: r, alt: t }) => /* @__PURE__ */ a.jsx(
1638
+ "img",
1639
+ {
1640
+ src: xt(r),
1641
+ alt: t,
1642
+ height: 20,
1643
+ loading: "lazy",
1644
+ style: { height: 20, width: "auto" }
1645
+ }
1646
+ ), Be = ({
1647
+ type: r,
1648
+ label: t,
1649
+ iconNode: s
1650
+ }) => (
1651
+ // Alt payment types are visible + clickable but don't yet do anything —
1652
+ // the click is intentionally a no-op so the row looks identical to the
1653
+ // (future) functional state without faking selection.
1654
+ /* @__PURE__ */ a.jsxs(
1655
+ "label",
1656
+ {
1657
+ className: "flex cursor-pointer items-center gap-3 rounded-lg border border-grayWarm-200 px-4 py-3 transition-colors hover:border-grayWarm-300",
1658
+ "data-testid": `payment-type-${r}`,
1659
+ children: [
1660
+ /* @__PURE__ */ a.jsx(
1661
+ "input",
1662
+ {
1663
+ type: "radio",
1664
+ name: "movmo-payment-type",
1665
+ value: r,
1666
+ onChange: () => {
1667
+ },
1668
+ className: "h-4 w-4 cursor-pointer accent-grayWarm-900",
1669
+ "aria-label": t
1670
+ }
1671
+ ),
1672
+ /* @__PURE__ */ a.jsxs("span", { className: "flex flex-1 items-center gap-2 text-sm font-semibold text-grayWarm-900", children: [
1673
+ t,
1674
+ s
1675
+ ] })
1676
+ ]
1677
+ }
1678
+ )
1679
+ ), br = ({
1680
+ selected: r,
1681
+ onSelect: t,
1682
+ creditCardBody: s,
1683
+ className: o
1684
+ }) => {
1685
+ const l = r === "credit_card";
1686
+ return /* @__PURE__ */ a.jsxs("div", { className: Z("flex w-full flex-col gap-3", o), children: [
1687
+ /* @__PURE__ */ a.jsxs(
1688
+ "label",
1689
+ {
1690
+ className: Z(
1691
+ "flex cursor-pointer flex-col gap-3 rounded-lg border px-4 py-3 transition-colors",
1692
+ l ? "border-grayWarm-900 shadow-[0_0_0_1px_#1c1917]" : "border-grayWarm-200"
1693
+ ),
1694
+ "data-testid": "payment-type-credit_card",
1695
+ children: [
1696
+ /* @__PURE__ */ a.jsxs("div", { className: "flex items-center gap-3", children: [
1697
+ /* @__PURE__ */ a.jsx(
1698
+ "input",
1699
+ {
1700
+ type: "radio",
1701
+ name: "movmo-payment-type",
1702
+ value: "credit_card",
1703
+ checked: l,
1704
+ onChange: () => t("credit_card"),
1705
+ className: "h-4 w-4 cursor-pointer accent-grayWarm-900",
1706
+ "aria-label": "Credit card"
1707
+ }
1708
+ ),
1709
+ /* @__PURE__ */ a.jsx("span", { className: "flex-1 text-sm font-semibold text-grayWarm-900", children: "Credit card" }),
1710
+ /* @__PURE__ */ a.jsxs("div", { className: "flex items-center gap-1.5", children: [
1711
+ /* @__PURE__ */ a.jsx(Ce, { brand: "mastercard", width: 28 }),
1712
+ /* @__PURE__ */ a.jsx(Ce, { brand: "visa", width: 28 }),
1713
+ /* @__PURE__ */ a.jsx(Ce, { brand: "amex", width: 28 }),
1714
+ /* @__PURE__ */ a.jsx(Ce, { brand: "discover", width: 28 })
1715
+ ] })
1716
+ ] }),
1717
+ l ? /* @__PURE__ */ a.jsx("div", { "data-testid": "payment-type-credit_card-body", children: s }) : null
1718
+ ]
1719
+ }
1720
+ ),
1721
+ l ? /* @__PURE__ */ a.jsx(
1722
+ "p",
1723
+ {
1724
+ className: "mt-2 text-sm font-semibold text-grayWarm-900",
1725
+ "data-testid": "payment-type-other-options-header",
1726
+ children: "Other options"
1727
+ }
1728
+ ) : null,
1729
+ /* @__PURE__ */ a.jsx(
1730
+ Be,
1731
+ {
1732
+ type: "paypal",
1733
+ label: "PayPal",
1734
+ iconNode: /* @__PURE__ */ a.jsx(er, { slug: "paypal", alt: "PayPal" })
1735
+ }
1736
+ ),
1737
+ /* @__PURE__ */ a.jsx(
1738
+ Be,
1739
+ {
1740
+ type: "googlepay",
1741
+ label: "GooglePay",
1742
+ iconNode: /* @__PURE__ */ a.jsx(er, { slug: "google-pay", alt: "GooglePay" })
1743
+ }
1744
+ ),
1745
+ /* @__PURE__ */ a.jsx(
1746
+ Be,
1747
+ {
1748
+ type: "klarna",
1749
+ label: "Klarna",
1750
+ iconNode: /* @__PURE__ */ a.jsx(er, { slug: "klarna", alt: "Klarna" })
1751
+ }
1752
+ ),
1753
+ /* @__PURE__ */ a.jsx(
1754
+ Be,
1755
+ {
1756
+ type: "ach",
1757
+ label: "Bank account (ACH)",
1758
+ iconNode: /* @__PURE__ */ a.jsx("span", { className: "text-xs font-medium text-grayWarm-500", children: "Direct debit" })
1759
+ }
1760
+ )
1761
+ ] });
1762
+ }, gr = "movmo-add-payment-form", wr = (r) => {
1763
+ const t = r.filter((o) => o.isDefault), s = r.filter((o) => !o.isDefault);
1764
+ return [...t, ...s];
1765
+ }, jr = ({ withDefaultBadge: r = !1 }) => /* @__PURE__ */ a.jsxs(
1766
+ "div",
1767
+ {
1768
+ className: "flex items-start justify-between py-4",
1769
+ "data-testid": "payment-method-skeleton",
1770
+ children: [
1771
+ /* @__PURE__ */ a.jsxs("div", { className: "flex items-start gap-3", children: [
1772
+ /* @__PURE__ */ a.jsx("div", { className: "h-8 w-[46px] flex-shrink-0 animate-pulse rounded bg-grayWarm-200" }),
1773
+ /* @__PURE__ */ a.jsxs("div", { className: "space-y-2", children: [
1774
+ /* @__PURE__ */ a.jsxs("div", { className: "flex items-center gap-2", children: [
1775
+ /* @__PURE__ */ a.jsx("div", { className: "h-5 w-[120px] animate-pulse rounded bg-grayWarm-200" }),
1776
+ r ? /* @__PURE__ */ a.jsx("div", { className: "h-5 w-[56px] animate-pulse rounded-full bg-grayWarm-200" }) : null
1777
+ ] }),
1778
+ /* @__PURE__ */ a.jsx("div", { className: "h-4 w-[100px] animate-pulse rounded bg-grayWarm-200" })
1779
+ ] })
1780
+ ] }),
1781
+ /* @__PURE__ */ a.jsx("div", { className: "h-5 w-5 flex-shrink-0 animate-pulse rounded-full bg-grayWarm-200" })
1782
+ ]
1783
+ }
1784
+ ), bt = ({
1785
+ userId: r,
1786
+ defaultCardholderName: t,
1787
+ defaultCardholderFirstName: s,
1788
+ defaultCardholderLastName: o,
1789
+ selectedId: l,
1790
+ onSelect: c,
1791
+ onChange: f,
1792
+ paymentTypeSelector: p = !0,
1793
+ autoSaveFirstCard: y = !0,
1794
+ selectionSetsDefault: W = !1,
1795
+ showDefaultBadge: N = !0,
1796
+ collapsible: b = !1,
1797
+ cardLabelFormat: D = "branded",
1798
+ className: M
1799
+ }) => {
1800
+ const { items: X, status: T, error: se, refetch: E } = ut(r), { deletePaymentMethod: S, status: q } = ct(r), { setDefault: ue, status: re } = dt(r), [g, ne] = P([]), [ye, I] = P(null), [R, d] = P(!1), [C, w] = P(null), [$, J] = P(!1), [Y, Q] = P(!1), [z, _] = P(null), [F, fe] = P(!1), ve = B(!1), ge = H(() => {
1801
+ d(!1), w(null), _(null);
1802
+ }, []), we = t ?? ([s, o].filter(Boolean).join(" ") || void 0);
1803
+ L(() => {
1804
+ T === "ready" && ne(wr(X));
1805
+ }, [X, T]), L(() => {
1806
+ if (!c || ve.current || T !== "ready" || g.length === 0 || l) return;
1807
+ ve.current = !0;
1808
+ const u = g.find((ce) => ce.isDefault) ?? g[0];
1809
+ c(u);
1810
+ }, [c, T, g, l]);
1811
+ const me = H(
1812
+ (u) => {
1813
+ ne((ce) => {
1814
+ const te = typeof u == "function" ? u(ce) : u, K = wr(te);
1815
+ return f == null || f(K), K;
1816
+ });
1817
+ },
1818
+ [f]
1819
+ ), je = q === "pending" || re === "pending", he = H(
1820
+ async (u) => {
1821
+ const ce = g;
1822
+ I(null), me((te) => te.map((K) => ({ ...K, isDefault: K.id === u.id })));
1823
+ try {
1824
+ await ue(u.id), E();
1825
+ } catch (te) {
1826
+ ne(ce), f == null || f(ce);
1827
+ const K = te instanceof Error ? te.message : "Failed to set default payment method.";
1828
+ I(K);
1829
+ }
1830
+ },
1831
+ [g, me, ue, E, f]
1832
+ ), G = H(
1833
+ (u) => {
1834
+ c == null || c(u), W && (u.isDefault || he(u));
1835
+ },
1836
+ [c, W, he]
1837
+ ), oe = H(
1838
+ async (u) => {
1839
+ const ce = g;
1840
+ I(null);
1841
+ const te = g.filter((be) => be.id !== u.id);
1842
+ me(() => te);
1843
+ const K = u.id === l && c ? te.find((be) => be.isDefault) ?? te[0] ?? null : null;
1844
+ K && G(K);
1845
+ const Le = !!K && W && K !== null && !K.isDefault;
1846
+ try {
1847
+ await S(u.id), Le || E();
1848
+ } catch (be) {
1849
+ ne(ce), f == null || f(ce);
1850
+ const Ve = be instanceof Error ? be.message : "Failed to delete payment method.";
1851
+ I(Ve);
1852
+ }
1853
+ },
1854
+ [
1855
+ g,
1856
+ me,
1857
+ S,
1858
+ E,
1859
+ f,
1860
+ l,
1861
+ c,
1862
+ G,
1863
+ W
1864
+ ]
1865
+ ), ie = H(
1866
+ (u) => {
1867
+ w(null), d(!1), _(null), me((te) => [u, ...te.filter((K) => K.id !== u.id)]), G(u), !!c && W && !u.isDefault || E();
1868
+ },
1869
+ [me, E, G, c, W]
1870
+ ), xe = H((u) => {
1871
+ w(u);
1872
+ }, []), Ee = T === "ready" && g.length === 0, Ne = typeof c == "function", _e = !Ne && !b, le = g.length === 0, v = y && g.length === 0, O = H(
1873
+ (u) => /* @__PURE__ */ a.jsx(
1874
+ Rr,
1875
+ {
1876
+ userId: r,
1877
+ isDefault: le,
1878
+ defaultCardholderName: we,
1879
+ autoSave: !u && v,
1880
+ hideInternalSaveButton: u,
1881
+ formId: u ? gr : void 0,
1882
+ onCanSubmitChange: u ? J : void 0,
1883
+ onSavingChange: u ? Q : void 0,
1884
+ autoFocus: u ? "number" : void 0,
1885
+ onSuccess: ie,
1886
+ onError: xe
1887
+ }
1888
+ ),
1889
+ [r, le, we, v, ie, xe]
1890
+ ), V = Ue(() => O(!1), [O]), pe = Ue(() => O(!0), [O]), Ye = Ue(() => p ? /* @__PURE__ */ a.jsx(
1891
+ br,
1892
+ {
1893
+ selected: z,
1894
+ onSelect: (u) => _(u),
1895
+ creditCardBody: V
1896
+ }
1897
+ ) : V, [p, z, V]), ze = Ue(() => p ? /* @__PURE__ */ a.jsx(
1898
+ br,
1899
+ {
1900
+ selected: z,
1901
+ onSelect: (u) => _(u),
1902
+ creditCardBody: pe
1903
+ }
1904
+ ) : pe, [p, z, pe]);
1905
+ return /* @__PURE__ */ a.jsxs(
1906
+ "div",
1907
+ {
1908
+ className: Z("flex w-full flex-col gap-4", M),
1909
+ "data-testid": "payment-methods-manager",
1910
+ children: [
1911
+ T === "loading" && g.length === 0 ? (
1912
+ // Only show the skeleton on first load — during a silent refetch
1913
+ // (e.g. after set-default or delete optimistic mutations), the user
1914
+ // already sees the correct optimistic list and a skeleton flash
1915
+ // here would be jarring.
1916
+ /* @__PURE__ */ a.jsxs(
1917
+ "div",
1918
+ {
1919
+ className: Z(
1920
+ // Match the real-list shell so layout doesn't reflow when data
1921
+ // arrives. In selection mode the outer card is suppressed too.
1922
+ _e ? "flex flex-col divide-y divide-grayWarm-200 rounded-xl border border-grayWarm-200 px-4 md:px-6" : "flex flex-col gap-2"
1923
+ ),
1924
+ "data-testid": "payment-methods-loading",
1925
+ children: [
1926
+ /* @__PURE__ */ a.jsx(jr, { withDefaultBadge: !0 }),
1927
+ /* @__PURE__ */ a.jsx(jr, {})
1928
+ ]
1929
+ }
1930
+ )
1931
+ ) : null,
1932
+ T === "error" ? /* @__PURE__ */ a.jsxs(
1933
+ "div",
948
1934
  {
949
1935
  role: "alert",
950
- className: "rounded-md bg-error-50 px-3 py-2 text-sm text-error-700",
951
- "data-testid": "movmo-card-error",
952
- children: N
1936
+ "aria-live": "polite",
1937
+ className: "flex items-center justify-between gap-3 rounded-md bg-error-50 p-3 text-sm text-error-700",
1938
+ "data-testid": "payment-methods-list-error",
1939
+ children: [
1940
+ /* @__PURE__ */ a.jsx("span", { children: se ?? "Failed to load payment methods." }),
1941
+ /* @__PURE__ */ a.jsx(
1942
+ "button",
1943
+ {
1944
+ type: "button",
1945
+ onClick: E,
1946
+ className: "rounded-md border border-error-700 px-3 py-1 text-xs font-semibold text-error-700 hover:bg-error-50",
1947
+ children: "Retry"
1948
+ }
1949
+ )
1950
+ ]
953
1951
  }
954
1952
  ) : null,
955
- /* @__PURE__ */ m.jsx(
956
- "button",
1953
+ ye ? /* @__PURE__ */ a.jsx(
1954
+ "div",
957
1955
  {
958
- type: "submit",
959
- disabled: !X,
960
- className: ze(
961
- "inline-flex h-11 items-center justify-center rounded-md bg-brand-500 px-4 text-sm font-semibold text-white transition-colors hover:bg-brand-600",
962
- "disabled:cursor-not-allowed disabled:bg-grayWarm-300 disabled:text-grayWarm-500"
1956
+ role: "alert",
1957
+ "aria-live": "polite",
1958
+ className: "rounded-md bg-error-50 p-3 text-sm text-error-700",
1959
+ "data-testid": "payment-methods-mutation-error",
1960
+ children: ye
1961
+ }
1962
+ ) : null,
1963
+ b && g.length > 0 ? /* @__PURE__ */ a.jsx("div", { className: "border-t border-grayWarm-200 pt-4", children: /* @__PURE__ */ a.jsxs(
1964
+ "div",
1965
+ {
1966
+ className: "flex items-center justify-between",
1967
+ "data-testid": F ? "payment-methods-drawer-header" : "payment-methods-collapsed-preview",
1968
+ children: [
1969
+ F ? /* @__PURE__ */ a.jsx("h3", { className: "text-md font-semibold text-grayWarm-950", children: "Payment methods" }) : /* @__PURE__ */ a.jsx(
1970
+ pt,
1971
+ {
1972
+ method: g.find((u) => u.id === l) ?? g.find((u) => u.isDefault) ?? g[0],
1973
+ cardLabelFormat: D,
1974
+ className: "flex-1"
1975
+ }
1976
+ ),
1977
+ /* @__PURE__ */ a.jsx(
1978
+ "button",
1979
+ {
1980
+ type: "button",
1981
+ "aria-label": F ? "Collapse payment methods" : "Expand payment methods",
1982
+ "aria-expanded": F,
1983
+ className: "bg-grayWarm-100 p-2 rounded-lg hover:bg-grayWarm-200 transition-colors",
1984
+ onClick: () => fe((u) => !u),
1985
+ "data-testid": F ? "payment-methods-drawer-close" : "payment-methods-drawer-open",
1986
+ children: /* @__PURE__ */ a.jsx(
1987
+ "img",
1988
+ {
1989
+ src: `${De().iconCdnBaseUrl}/website/assets/icons/chevron-${F ? "up" : "down"}-double.svg`,
1990
+ alt: "",
1991
+ className: "w-5 h-5"
1992
+ }
1993
+ )
1994
+ }
1995
+ )
1996
+ ]
1997
+ }
1998
+ ) }) : null,
1999
+ g.length > 0 && (!b || F) ? /* @__PURE__ */ a.jsx(
2000
+ "div",
2001
+ {
2002
+ className: Z(
2003
+ "flex flex-col",
2004
+ // accounts-ui (non-selectable, non-collapsible): rounded outer card
2005
+ // with divide-y separators between rows.
2006
+ // flights-ui (selectable or collapsible): bare space-y-3 gap between
2007
+ // per-row bordered tiles; no outer card chrome.
2008
+ _e ? "rounded-xl border border-grayWarm-200 px-4 md:px-6 divide-y divide-grayWarm-200" : "space-y-3"
963
2009
  ),
964
- "data-testid": "movmo-card-save",
965
- children: Y ? "Saving…" : U === "loading" ? "Loading…" : "Save card"
2010
+ children: g.map((u) => /* @__PURE__ */ a.jsx(
2011
+ ht,
2012
+ {
2013
+ method: u,
2014
+ selectable: Ne,
2015
+ selected: Ne && u.id === l,
2016
+ onSelect: G,
2017
+ onSetDefault: he,
2018
+ onRemove: oe,
2019
+ disabled: je,
2020
+ showDefaultBadge: N,
2021
+ hideSetDefaultMenuItem: W,
2022
+ cardLabelFormat: D
2023
+ },
2024
+ u.id
2025
+ ))
2026
+ }
2027
+ ) : null,
2028
+ Ee ? (
2029
+ // Empty state: render the add-card body inline (per Figma 1536-21454).
2030
+ /* @__PURE__ */ a.jsx("div", { "data-testid": "payment-methods-empty", children: Ye })
2031
+ ) : g.length > 0 && (!b || F) ? (
2032
+ // Keep the Add button visible during silent refetches (status flips
2033
+ // back to 'loading' transiently after set-default / delete).
2034
+ // In collapsible mode only show the Add button when the drawer is open.
2035
+ /* @__PURE__ */ a.jsx(
2036
+ "button",
2037
+ {
2038
+ type: "button",
2039
+ onClick: () => {
2040
+ w(null), _(null), J(!1), d(!0);
2041
+ },
2042
+ onMouseEnter: () => {
2043
+ ar().catch(() => {
2044
+ });
2045
+ },
2046
+ onFocus: () => {
2047
+ ar().catch(() => {
2048
+ });
2049
+ },
2050
+ className: "self-start rounded-lg bg-brand-50 px-6 py-3 text-md font-semibold text-brand-600 transition-colors hover:bg-brand-100",
2051
+ "data-testid": "payment-methods-add-trigger",
2052
+ children: "Add payment method"
2053
+ }
2054
+ )
2055
+ ) : null,
2056
+ /* @__PURE__ */ a.jsxs(
2057
+ mt,
2058
+ {
2059
+ open: R,
2060
+ onClose: ge,
2061
+ formId: gr,
2062
+ saveDisabled: !$,
2063
+ isSaving: Y,
2064
+ children: [
2065
+ ze,
2066
+ C ? (
2067
+ // Single source of truth for save-time errors (API failures + hook
2068
+ // init failures forwarded from MovmoCardForm.onError). MovmoCardForm
2069
+ // intentionally does NOT render its own banner — two role="alert"
2070
+ // nodes on the same string is a WCAG 4.1.3 violation (announced
2071
+ // twice). aria-live="polite" so SR users hear new errors but the
2072
+ // announcement doesn't interrupt their current input.
2073
+ /* @__PURE__ */ a.jsx(
2074
+ "p",
2075
+ {
2076
+ role: "alert",
2077
+ "aria-live": "polite",
2078
+ className: "mt-3 rounded-md bg-error-50 px-3 py-2 text-sm text-error-700",
2079
+ "data-testid": "payment-methods-modal-error",
2080
+ children: C
2081
+ }
2082
+ )
2083
+ ) : null
2084
+ ]
966
2085
  }
967
2086
  )
968
2087
  ]
969
2088
  }
970
2089
  );
971
2090
  };
972
- Mr.displayName = "MovmoCardForm";
2091
+ bt.displayName = "PaymentMethodsManager";
973
2092
  export {
974
- Mr as MovmoCardForm,
975
- Ge as getPaymentsConfig,
976
- $r as setPaymentsConfig,
977
- Lr as useMovmoCardFields
2093
+ Rr as MovmoCardForm,
2094
+ pt as PaymentMethodPreview,
2095
+ bt as PaymentMethodsManager,
2096
+ De as getPaymentsConfig,
2097
+ wt as setPaymentsConfig,
2098
+ ct as useDeletePaymentMethod,
2099
+ st as useMovmoCardFields,
2100
+ dt as useSetDefaultPaymentMethod,
2101
+ ut as useUserPaymentMethods
978
2102
  };
979
2103
  //# sourceMappingURL=index.es.js.map