@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/README.md +66 -12
- package/dist/index.cjs.js +10 -10
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.d.ts +255 -4
- package/dist/index.es.js +1719 -595
- package/dist/index.es.js.map +1 -1
- package/dist/style.css +1 -1
- package/package.json +1 -1
package/dist/index.es.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
var
|
|
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
|
|
13
|
-
function
|
|
14
|
-
if (
|
|
15
|
-
|
|
16
|
-
var
|
|
17
|
-
function
|
|
18
|
-
var
|
|
19
|
-
|
|
20
|
-
for (
|
|
21
|
-
if (
|
|
22
|
-
return { $$typeof:
|
|
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
|
|
24
|
+
return $e.Fragment = s, $e.jsx = f, $e.jsxs = f, $e;
|
|
25
25
|
}
|
|
26
|
-
var
|
|
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
|
|
37
|
-
function
|
|
38
|
-
return
|
|
39
|
-
var
|
|
40
|
-
function
|
|
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
|
|
44
|
-
return typeof
|
|
43
|
+
var n = X && e[X] || e[T];
|
|
44
|
+
return typeof n == "function" ? n : null;
|
|
45
45
|
}
|
|
46
|
-
var
|
|
47
|
-
function
|
|
46
|
+
var E = r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
|
|
47
|
+
function S(e) {
|
|
48
48
|
{
|
|
49
|
-
for (var
|
|
50
|
-
|
|
51
|
-
|
|
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
|
|
54
|
+
function q(e, n, i) {
|
|
55
55
|
{
|
|
56
|
-
var
|
|
57
|
-
|
|
58
|
-
var
|
|
59
|
-
return String(
|
|
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
|
-
|
|
61
|
+
k.unshift("Warning: " + n), Function.prototype.apply.call(console[e], console, k);
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
|
-
var
|
|
65
|
-
|
|
66
|
-
function
|
|
67
|
-
return !!(typeof e == "string" || typeof e == "function" || e ===
|
|
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 ===
|
|
71
|
+
e.$$typeof === I || e.getModuleId !== void 0));
|
|
72
72
|
}
|
|
73
|
-
function
|
|
74
|
-
var
|
|
75
|
-
if (
|
|
76
|
-
return
|
|
77
|
-
var
|
|
78
|
-
return
|
|
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
|
|
80
|
+
function C(e) {
|
|
81
81
|
return e.displayName || "Context";
|
|
82
82
|
}
|
|
83
|
-
function
|
|
83
|
+
function w(e) {
|
|
84
84
|
if (e == null)
|
|
85
85
|
return null;
|
|
86
|
-
if (typeof e.tag == "number" &&
|
|
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
|
|
91
|
+
case o:
|
|
92
92
|
return "Fragment";
|
|
93
|
-
case
|
|
93
|
+
case s:
|
|
94
94
|
return "Portal";
|
|
95
|
-
case
|
|
95
|
+
case c:
|
|
96
96
|
return "Profiler";
|
|
97
|
-
case
|
|
97
|
+
case l:
|
|
98
98
|
return "StrictMode";
|
|
99
|
-
case
|
|
99
|
+
case W:
|
|
100
100
|
return "Suspense";
|
|
101
|
-
case
|
|
101
|
+
case N:
|
|
102
102
|
return "SuspenseList";
|
|
103
103
|
}
|
|
104
104
|
if (typeof e == "object")
|
|
105
105
|
switch (e.$$typeof) {
|
|
106
|
-
case
|
|
107
|
-
var
|
|
108
|
-
return
|
|
109
|
-
case
|
|
110
|
-
var
|
|
111
|
-
return
|
|
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
|
-
|
|
116
|
-
|
|
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
|
|
118
|
+
var j = e, k = j._payload, x = j._init;
|
|
119
119
|
try {
|
|
120
|
-
return
|
|
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
|
|
129
|
-
function
|
|
128
|
+
var $ = Object.assign, J = 0, Y, Q, z, _, F, fe, ve;
|
|
129
|
+
function ge() {
|
|
130
130
|
}
|
|
131
|
-
|
|
132
|
-
function
|
|
131
|
+
ge.__reactDisabledLog = !0;
|
|
132
|
+
function we() {
|
|
133
133
|
{
|
|
134
|
-
if (
|
|
135
|
-
|
|
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:
|
|
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
|
-
|
|
152
|
+
J++;
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
|
-
function
|
|
155
|
+
function me() {
|
|
156
156
|
{
|
|
157
|
-
if (
|
|
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:
|
|
165
|
-
value:
|
|
164
|
+
log: $({}, e, {
|
|
165
|
+
value: Y
|
|
166
166
|
}),
|
|
167
|
-
info:
|
|
168
|
-
value:
|
|
167
|
+
info: $({}, e, {
|
|
168
|
+
value: Q
|
|
169
169
|
}),
|
|
170
|
-
warn:
|
|
171
|
-
value:
|
|
170
|
+
warn: $({}, e, {
|
|
171
|
+
value: z
|
|
172
172
|
}),
|
|
173
|
-
error:
|
|
174
|
-
value:
|
|
173
|
+
error: $({}, e, {
|
|
174
|
+
value: _
|
|
175
175
|
}),
|
|
176
|
-
group:
|
|
177
|
-
value:
|
|
176
|
+
group: $({}, e, {
|
|
177
|
+
value: F
|
|
178
178
|
}),
|
|
179
|
-
groupCollapsed:
|
|
180
|
-
value:
|
|
179
|
+
groupCollapsed: $({}, e, {
|
|
180
|
+
value: fe
|
|
181
181
|
}),
|
|
182
|
-
groupEnd:
|
|
183
|
-
value:
|
|
182
|
+
groupEnd: $({}, e, {
|
|
183
|
+
value: ve
|
|
184
184
|
})
|
|
185
185
|
});
|
|
186
186
|
}
|
|
187
|
-
|
|
187
|
+
J < 0 && S("disabledDepth fell below zero. This is a bug in React. Please file an issue.");
|
|
188
188
|
}
|
|
189
189
|
}
|
|
190
|
-
var
|
|
191
|
-
function
|
|
190
|
+
var je = E.ReactCurrentDispatcher, he;
|
|
191
|
+
function G(e, n, i) {
|
|
192
192
|
{
|
|
193
|
-
if (
|
|
193
|
+
if (he === void 0)
|
|
194
194
|
try {
|
|
195
195
|
throw Error();
|
|
196
|
-
} catch (
|
|
197
|
-
var
|
|
198
|
-
|
|
196
|
+
} catch (j) {
|
|
197
|
+
var m = j.stack.trim().match(/\n( *(at )?)/);
|
|
198
|
+
he = m && m[1] || "";
|
|
199
199
|
}
|
|
200
200
|
return `
|
|
201
|
-
` +
|
|
201
|
+
` + he + e;
|
|
202
202
|
}
|
|
203
203
|
}
|
|
204
|
-
var
|
|
204
|
+
var oe = !1, ie;
|
|
205
205
|
{
|
|
206
|
-
var
|
|
207
|
-
|
|
206
|
+
var xe = typeof WeakMap == "function" ? WeakMap : Map;
|
|
207
|
+
ie = new xe();
|
|
208
208
|
}
|
|
209
|
-
function
|
|
210
|
-
if (!e ||
|
|
209
|
+
function Ee(e, n) {
|
|
210
|
+
if (!e || oe)
|
|
211
211
|
return "";
|
|
212
212
|
{
|
|
213
|
-
var
|
|
214
|
-
if (
|
|
215
|
-
return
|
|
213
|
+
var i = ie.get(e);
|
|
214
|
+
if (i !== void 0)
|
|
215
|
+
return i;
|
|
216
216
|
}
|
|
217
|
-
var
|
|
218
|
-
|
|
219
|
-
var
|
|
217
|
+
var m;
|
|
218
|
+
oe = !0;
|
|
219
|
+
var j = Error.prepareStackTrace;
|
|
220
220
|
Error.prepareStackTrace = void 0;
|
|
221
|
-
var
|
|
222
|
-
|
|
221
|
+
var k;
|
|
222
|
+
k = je.current, je.current = null, we();
|
|
223
223
|
try {
|
|
224
|
-
if (
|
|
225
|
-
var
|
|
224
|
+
if (n) {
|
|
225
|
+
var x = function() {
|
|
226
226
|
throw Error();
|
|
227
227
|
};
|
|
228
|
-
if (Object.defineProperty(
|
|
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(
|
|
235
|
-
} catch (
|
|
236
|
-
|
|
234
|
+
Reflect.construct(x, []);
|
|
235
|
+
} catch (ae) {
|
|
236
|
+
m = ae;
|
|
237
237
|
}
|
|
238
|
-
Reflect.construct(e, [],
|
|
238
|
+
Reflect.construct(e, [], x);
|
|
239
239
|
} else {
|
|
240
240
|
try {
|
|
241
|
-
|
|
242
|
-
} catch (
|
|
243
|
-
|
|
241
|
+
x.call();
|
|
242
|
+
} catch (ae) {
|
|
243
|
+
m = ae;
|
|
244
244
|
}
|
|
245
|
-
e.call(
|
|
245
|
+
e.call(x.prototype);
|
|
246
246
|
}
|
|
247
247
|
} else {
|
|
248
248
|
try {
|
|
249
249
|
throw Error();
|
|
250
|
-
} catch (
|
|
251
|
-
|
|
250
|
+
} catch (ae) {
|
|
251
|
+
m = ae;
|
|
252
252
|
}
|
|
253
253
|
e();
|
|
254
254
|
}
|
|
255
|
-
} catch (
|
|
256
|
-
if (
|
|
257
|
-
for (var
|
|
258
|
-
`),
|
|
259
|
-
`),
|
|
260
|
-
|
|
261
|
-
for (;
|
|
262
|
-
if (
|
|
263
|
-
if (
|
|
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 (
|
|
266
|
-
var
|
|
267
|
-
` +
|
|
268
|
-
return e.displayName &&
|
|
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 (
|
|
270
|
+
while (A >= 1 && U >= 0);
|
|
271
271
|
break;
|
|
272
272
|
}
|
|
273
273
|
}
|
|
274
274
|
} finally {
|
|
275
|
-
|
|
275
|
+
oe = !1, je.current = k, me(), Error.prepareStackTrace = j;
|
|
276
276
|
}
|
|
277
|
-
var
|
|
278
|
-
return typeof e == "function" &&
|
|
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
|
|
281
|
-
return
|
|
280
|
+
function Ne(e, n, i) {
|
|
281
|
+
return Ee(e, !1);
|
|
282
282
|
}
|
|
283
|
-
function
|
|
284
|
-
var
|
|
285
|
-
return !!(
|
|
283
|
+
function _e(e) {
|
|
284
|
+
var n = e.prototype;
|
|
285
|
+
return !!(n && n.isReactComponent);
|
|
286
286
|
}
|
|
287
|
-
function
|
|
287
|
+
function le(e, n, i) {
|
|
288
288
|
if (e == null)
|
|
289
289
|
return "";
|
|
290
290
|
if (typeof e == "function")
|
|
291
|
-
return
|
|
291
|
+
return Ee(e, _e(e));
|
|
292
292
|
if (typeof e == "string")
|
|
293
|
-
return
|
|
293
|
+
return G(e);
|
|
294
294
|
switch (e) {
|
|
295
|
-
case
|
|
296
|
-
return
|
|
297
|
-
case
|
|
298
|
-
return
|
|
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
|
|
303
|
+
return Ne(e.render);
|
|
304
|
+
case b:
|
|
305
|
+
return le(e.type, n, i);
|
|
306
306
|
case D: {
|
|
307
|
-
var
|
|
307
|
+
var m = e, j = m._payload, k = m._init;
|
|
308
308
|
try {
|
|
309
|
-
return
|
|
309
|
+
return le(k(j), n, i);
|
|
310
310
|
} catch {
|
|
311
311
|
}
|
|
312
312
|
}
|
|
313
313
|
}
|
|
314
314
|
return "";
|
|
315
315
|
}
|
|
316
|
-
var
|
|
317
|
-
function
|
|
316
|
+
var v = Object.prototype.hasOwnProperty, O = {}, V = E.ReactDebugCurrentFrame;
|
|
317
|
+
function pe(e) {
|
|
318
318
|
if (e) {
|
|
319
|
-
var
|
|
320
|
-
|
|
319
|
+
var n = e._owner, i = le(e.type, e._source, n ? n.type : null);
|
|
320
|
+
V.setExtraStackFrame(i);
|
|
321
321
|
} else
|
|
322
|
-
|
|
322
|
+
V.setExtraStackFrame(null);
|
|
323
323
|
}
|
|
324
|
-
function
|
|
324
|
+
function Ye(e, n, i, m, j) {
|
|
325
325
|
{
|
|
326
|
-
var
|
|
327
|
-
for (var
|
|
328
|
-
if (
|
|
329
|
-
var
|
|
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[
|
|
332
|
-
var
|
|
333
|
-
throw
|
|
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
|
-
|
|
336
|
-
} catch (
|
|
337
|
-
|
|
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
|
-
|
|
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
|
|
344
|
-
function
|
|
345
|
-
return
|
|
343
|
+
var ze = Array.isArray;
|
|
344
|
+
function u(e) {
|
|
345
|
+
return ze(e);
|
|
346
346
|
}
|
|
347
|
-
function
|
|
347
|
+
function ce(e) {
|
|
348
348
|
{
|
|
349
|
-
var
|
|
350
|
-
return
|
|
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
|
|
353
|
+
function te(e) {
|
|
354
354
|
try {
|
|
355
|
-
return
|
|
355
|
+
return K(e), !1;
|
|
356
356
|
} catch {
|
|
357
357
|
return !0;
|
|
358
358
|
}
|
|
359
359
|
}
|
|
360
|
-
function
|
|
360
|
+
function K(e) {
|
|
361
361
|
return "" + e;
|
|
362
362
|
}
|
|
363
|
-
function
|
|
364
|
-
if (
|
|
365
|
-
return
|
|
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
|
|
367
|
+
var be = E.ReactCurrentOwner, Ve = {
|
|
368
368
|
key: !0,
|
|
369
369
|
ref: !0,
|
|
370
370
|
__self: !0,
|
|
371
371
|
__source: !0
|
|
372
|
-
},
|
|
373
|
-
function
|
|
374
|
-
if (
|
|
375
|
-
var
|
|
376
|
-
if (
|
|
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
|
|
382
|
-
if (
|
|
383
|
-
var
|
|
384
|
-
if (
|
|
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
|
|
390
|
-
typeof e.ref == "string" &&
|
|
389
|
+
function Pr(e, n) {
|
|
390
|
+
typeof e.ref == "string" && be.current;
|
|
391
391
|
}
|
|
392
|
-
function
|
|
392
|
+
function Tr(e, n) {
|
|
393
393
|
{
|
|
394
|
-
var
|
|
395
|
-
|
|
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
|
-
|
|
398
|
-
get:
|
|
397
|
+
i.isReactWarning = !0, Object.defineProperty(e, "key", {
|
|
398
|
+
get: i,
|
|
399
399
|
configurable: !0
|
|
400
400
|
});
|
|
401
401
|
}
|
|
402
402
|
}
|
|
403
|
-
function
|
|
403
|
+
function Sr(e, n) {
|
|
404
404
|
{
|
|
405
|
-
var
|
|
406
|
-
|
|
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
|
-
|
|
409
|
-
get:
|
|
408
|
+
i.isReactWarning = !0, Object.defineProperty(e, "ref", {
|
|
409
|
+
get: i,
|
|
410
410
|
configurable: !0
|
|
411
411
|
});
|
|
412
412
|
}
|
|
413
413
|
}
|
|
414
|
-
var
|
|
415
|
-
var
|
|
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:
|
|
417
|
+
$$typeof: t,
|
|
418
418
|
// Built-in properties that belong on the element
|
|
419
419
|
type: e,
|
|
420
|
-
key:
|
|
421
|
-
ref:
|
|
422
|
-
props:
|
|
420
|
+
key: n,
|
|
421
|
+
ref: i,
|
|
422
|
+
props: x,
|
|
423
423
|
// Record the component responsible for creating this element.
|
|
424
|
-
_owner:
|
|
424
|
+
_owner: k
|
|
425
425
|
};
|
|
426
|
-
return
|
|
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(
|
|
431
|
+
}), Object.defineProperty(h, "_self", {
|
|
432
432
|
configurable: !1,
|
|
433
433
|
enumerable: !1,
|
|
434
434
|
writable: !1,
|
|
435
|
-
value:
|
|
436
|
-
}), Object.defineProperty(
|
|
435
|
+
value: m
|
|
436
|
+
}), Object.defineProperty(h, "_source", {
|
|
437
437
|
configurable: !1,
|
|
438
438
|
enumerable: !1,
|
|
439
439
|
writable: !1,
|
|
440
|
-
value:
|
|
441
|
-
}), Object.freeze && (Object.freeze(
|
|
440
|
+
value: j
|
|
441
|
+
}), Object.freeze && (Object.freeze(h.props), Object.freeze(h)), h;
|
|
442
442
|
};
|
|
443
|
-
function
|
|
443
|
+
function Or(e, n, i, m, j) {
|
|
444
444
|
{
|
|
445
|
-
var
|
|
446
|
-
|
|
447
|
-
for (
|
|
448
|
-
|
|
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
|
|
451
|
-
for (
|
|
452
|
-
|
|
450
|
+
var A = e.defaultProps;
|
|
451
|
+
for (k in A)
|
|
452
|
+
x[k] === void 0 && (x[k] = A[k]);
|
|
453
453
|
}
|
|
454
|
-
if (
|
|
455
|
-
var
|
|
456
|
-
|
|
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
|
|
458
|
+
return Fr(e, h, ee, j, m, be.current, x);
|
|
459
459
|
}
|
|
460
460
|
}
|
|
461
|
-
var
|
|
462
|
-
function
|
|
461
|
+
var Ke = E.ReactCurrentOwner, or = E.ReactDebugCurrentFrame;
|
|
462
|
+
function ke(e) {
|
|
463
463
|
if (e) {
|
|
464
|
-
var
|
|
465
|
-
|
|
464
|
+
var n = e._owner, i = le(e.type, e._source, n ? n.type : null);
|
|
465
|
+
or.setExtraStackFrame(i);
|
|
466
466
|
} else
|
|
467
|
-
|
|
467
|
+
or.setExtraStackFrame(null);
|
|
468
468
|
}
|
|
469
|
-
var
|
|
470
|
-
|
|
471
|
-
function
|
|
472
|
-
return typeof e == "object" && e !== null && e.$$typeof ===
|
|
469
|
+
var qe;
|
|
470
|
+
qe = !1;
|
|
471
|
+
function Ge(e) {
|
|
472
|
+
return typeof e == "object" && e !== null && e.$$typeof === t;
|
|
473
473
|
}
|
|
474
|
-
function
|
|
474
|
+
function ir() {
|
|
475
475
|
{
|
|
476
|
-
if (
|
|
477
|
-
var e =
|
|
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
|
|
486
|
+
function Wr(e) {
|
|
487
487
|
return "";
|
|
488
488
|
}
|
|
489
|
-
var
|
|
490
|
-
function
|
|
489
|
+
var lr = {};
|
|
490
|
+
function Dr(e) {
|
|
491
491
|
{
|
|
492
|
-
var
|
|
493
|
-
if (!
|
|
494
|
-
var
|
|
495
|
-
|
|
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 <` +
|
|
497
|
+
Check the top-level render call using <` + i + ">.");
|
|
498
498
|
}
|
|
499
|
-
return
|
|
499
|
+
return n;
|
|
500
500
|
}
|
|
501
501
|
}
|
|
502
|
-
function
|
|
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
|
|
508
|
-
if (
|
|
507
|
+
var i = Dr(n);
|
|
508
|
+
if (lr[i])
|
|
509
509
|
return;
|
|
510
|
-
|
|
511
|
-
var
|
|
512
|
-
e && e._owner && e._owner !==
|
|
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
|
|
515
|
+
function dr(e, n) {
|
|
516
516
|
{
|
|
517
517
|
if (typeof e != "object")
|
|
518
518
|
return;
|
|
519
|
-
if (
|
|
520
|
-
for (var
|
|
521
|
-
var
|
|
522
|
-
|
|
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 (
|
|
524
|
+
else if (Ge(e))
|
|
525
525
|
e._store && (e._store.validated = !0);
|
|
526
526
|
else if (e) {
|
|
527
|
-
var
|
|
528
|
-
if (typeof
|
|
529
|
-
for (var
|
|
530
|
-
|
|
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
|
|
534
|
+
function $r(e) {
|
|
535
535
|
{
|
|
536
|
-
var
|
|
537
|
-
if (
|
|
536
|
+
var n = e.type;
|
|
537
|
+
if (n == null || typeof n == "string")
|
|
538
538
|
return;
|
|
539
|
-
var
|
|
540
|
-
if (typeof
|
|
541
|
-
|
|
542
|
-
else if (typeof
|
|
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
|
-
|
|
545
|
-
|
|
544
|
+
n.$$typeof === b))
|
|
545
|
+
i = n.propTypes;
|
|
546
546
|
else
|
|
547
547
|
return;
|
|
548
|
-
if (
|
|
549
|
-
var
|
|
550
|
-
|
|
551
|
-
} else if (
|
|
552
|
-
|
|
553
|
-
var
|
|
554
|
-
|
|
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
|
|
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
|
|
559
|
+
function Ar(e) {
|
|
560
560
|
{
|
|
561
|
-
for (var
|
|
562
|
-
var
|
|
563
|
-
if (
|
|
564
|
-
|
|
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 && (
|
|
568
|
+
e.ref !== null && (ke(e), S("Invalid attribute `ref` supplied to `React.Fragment`."), ke(null));
|
|
569
569
|
}
|
|
570
570
|
}
|
|
571
|
-
var
|
|
572
|
-
function
|
|
571
|
+
var ur = {};
|
|
572
|
+
function mr(e, n, i, m, j, k) {
|
|
573
573
|
{
|
|
574
|
-
var
|
|
575
|
-
if (!
|
|
576
|
-
var
|
|
577
|
-
(e === void 0 || typeof e == "object" && e !== null && Object.keys(e).length === 0) && (
|
|
578
|
-
var
|
|
579
|
-
|
|
580
|
-
var
|
|
581
|
-
e === null ?
|
|
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
|
|
584
|
-
if (
|
|
585
|
-
return
|
|
586
|
-
if (
|
|
587
|
-
var
|
|
588
|
-
if (
|
|
589
|
-
if (
|
|
590
|
-
if (de
|
|
591
|
-
for (var
|
|
592
|
-
|
|
593
|
-
Object.freeze && Object.freeze(
|
|
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
|
-
|
|
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
|
-
|
|
597
|
+
dr(de, e);
|
|
598
598
|
}
|
|
599
|
-
if (
|
|
600
|
-
var
|
|
601
|
-
return
|
|
602
|
-
}),
|
|
603
|
-
if (!
|
|
604
|
-
var
|
|
605
|
-
|
|
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} />`,
|
|
610
|
+
<%s key={someKey} {...props} />`, Je, Re, Br, Re), ur[Re + Je] = !0;
|
|
611
611
|
}
|
|
612
612
|
}
|
|
613
|
-
return e ===
|
|
613
|
+
return e === o ? Ar(U) : $r(U), U;
|
|
614
614
|
}
|
|
615
615
|
}
|
|
616
|
-
function
|
|
617
|
-
return
|
|
616
|
+
function Mr(e, n, i) {
|
|
617
|
+
return mr(e, n, i, !0);
|
|
618
618
|
}
|
|
619
|
-
function
|
|
620
|
-
return
|
|
619
|
+
function Ir(e, n, i) {
|
|
620
|
+
return mr(e, n, i, !1);
|
|
621
621
|
}
|
|
622
|
-
var
|
|
623
|
-
|
|
624
|
-
}()),
|
|
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" ?
|
|
627
|
-
var
|
|
628
|
-
function
|
|
629
|
-
var
|
|
630
|
-
if (typeof
|
|
631
|
-
else if (typeof
|
|
632
|
-
var
|
|
633
|
-
for (
|
|
634
|
-
} else for (
|
|
635
|
-
return
|
|
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
|
|
638
|
-
for (var
|
|
639
|
-
return
|
|
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
|
|
642
|
-
let
|
|
643
|
-
const
|
|
644
|
-
|
|
645
|
-
},
|
|
646
|
-
var
|
|
647
|
-
const
|
|
648
|
-
return (
|
|
649
|
-
},
|
|
650
|
-
baseUrl:
|
|
651
|
-
spreedlyScriptUrl:
|
|
652
|
-
|
|
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
|
-
},
|
|
656
|
-
const { baseUrl:
|
|
657
|
-
if (!
|
|
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 `${
|
|
662
|
-
},
|
|
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
|
|
678
|
+
return (await r.json()).message || t;
|
|
665
679
|
} catch {
|
|
666
|
-
return
|
|
680
|
+
return t;
|
|
667
681
|
}
|
|
668
|
-
}
|
|
669
|
-
|
|
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:
|
|
736
|
+
headers: Se,
|
|
672
737
|
credentials: "include"
|
|
673
738
|
});
|
|
674
|
-
if (!
|
|
675
|
-
throw new Error(await
|
|
676
|
-
return await
|
|
677
|
-
},
|
|
678
|
-
const
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
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
|
|
697
|
-
const
|
|
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 (
|
|
703
|
-
return
|
|
704
|
-
const { spreedlyScriptUrl:
|
|
705
|
-
return
|
|
706
|
-
const
|
|
707
|
-
`script[src="${
|
|
708
|
-
),
|
|
709
|
-
window.Spreedly ?
|
|
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 (
|
|
810
|
+
if (o) {
|
|
712
811
|
if (window.Spreedly) {
|
|
713
|
-
|
|
812
|
+
l();
|
|
714
813
|
return;
|
|
715
814
|
}
|
|
716
|
-
|
|
815
|
+
o.addEventListener("load", l, { once: !0 }), o.addEventListener(
|
|
717
816
|
"error",
|
|
718
817
|
() => {
|
|
719
|
-
|
|
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
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
}, document.head.appendChild(
|
|
729
|
-
}).catch((
|
|
730
|
-
throw
|
|
731
|
-
}),
|
|
732
|
-
},
|
|
733
|
-
first_name:
|
|
734
|
-
last_name:
|
|
735
|
-
month:
|
|
736
|
-
year:
|
|
737
|
-
...
|
|
738
|
-
...
|
|
739
|
-
}),
|
|
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:
|
|
742
|
-
cvvEl:
|
|
743
|
-
onCardTokenized:
|
|
744
|
-
onFieldErrors:
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
}, [
|
|
751
|
-
|
|
752
|
-
|
|
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 [
|
|
755
|
-
|
|
756
|
-
|
|
861
|
+
const [R, d] = await Promise.all([
|
|
862
|
+
ar(),
|
|
863
|
+
rt()
|
|
757
864
|
]);
|
|
758
|
-
if (
|
|
759
|
-
|
|
760
|
-
C
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
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 (
|
|
780
|
-
if (
|
|
781
|
-
const
|
|
782
|
-
|
|
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
|
|
786
|
-
|
|
944
|
+
var R, d;
|
|
945
|
+
I = !0;
|
|
787
946
|
try {
|
|
788
|
-
(
|
|
947
|
+
(d = (R = E.current) == null ? void 0 : R.removeHandlers) == null || d.call(R);
|
|
789
948
|
} catch {
|
|
790
949
|
}
|
|
791
|
-
|
|
950
|
+
E.current = null;
|
|
792
951
|
};
|
|
793
|
-
}, [
|
|
794
|
-
const
|
|
795
|
-
var
|
|
796
|
-
(
|
|
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:
|
|
799
|
-
},
|
|
800
|
-
const
|
|
801
|
-
return
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
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 [
|
|
812
|
-
async (
|
|
813
|
-
|
|
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
|
|
816
|
-
|
|
817
|
-
} catch (
|
|
818
|
-
const
|
|
819
|
-
|
|
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
|
-
[
|
|
823
|
-
),
|
|
824
|
-
(
|
|
825
|
-
const
|
|
826
|
-
|
|
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
|
-
[
|
|
829
|
-
),
|
|
1020
|
+
[s]
|
|
1021
|
+
), R = Ue(
|
|
830
1022
|
() => ({
|
|
831
|
-
onCardTokenized:
|
|
832
|
-
onFieldErrors:
|
|
1023
|
+
onCardTokenized: ye,
|
|
1024
|
+
onFieldErrors: I
|
|
833
1025
|
}),
|
|
834
|
-
[
|
|
835
|
-
), {
|
|
836
|
-
d
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
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
|
-
|
|
847
|
-
|
|
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__ */
|
|
851
|
-
/* @__PURE__ */
|
|
852
|
-
|
|
853
|
-
|
|
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-
|
|
1125
|
+
id: "movmo-card-expiry",
|
|
857
1126
|
type: "text",
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
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__ */
|
|
868
|
-
/* @__PURE__ */
|
|
869
|
-
/* @__PURE__ */
|
|
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-
|
|
1192
|
+
id: "movmo-card-zip",
|
|
1193
|
+
ref: me,
|
|
873
1194
|
type: "text",
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
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__ */
|
|
885
|
-
/* @__PURE__ */
|
|
886
|
-
/* @__PURE__ */
|
|
887
|
-
"
|
|
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-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
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__ */
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
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
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
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
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
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
|
-
|
|
921
|
-
|
|
922
|
-
|
|
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
|
-
|
|
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
|
-
|
|
939
|
-
"
|
|
940
|
-
|
|
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
|
-
|
|
947
|
-
|
|
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
|
-
|
|
951
|
-
|
|
952
|
-
|
|
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__ */
|
|
956
|
-
"
|
|
1953
|
+
ye ? /* @__PURE__ */ a.jsx(
|
|
1954
|
+
"div",
|
|
957
1955
|
{
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
className:
|
|
961
|
-
|
|
962
|
-
|
|
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
|
-
|
|
965
|
-
|
|
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
|
-
|
|
2091
|
+
bt.displayName = "PaymentMethodsManager";
|
|
973
2092
|
export {
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
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
|