@usethrottle/payment-methods 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs ADDED
@@ -0,0 +1,511 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __esm = (fn, res) => function __init() {
9
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
10
+ };
11
+ var __export = (target, all) => {
12
+ for (var name in all)
13
+ __defProp(target, name, { get: all[name], enumerable: true });
14
+ };
15
+ var __copyProps = (to, from, except, desc) => {
16
+ if (from && typeof from === "object" || typeof from === "function") {
17
+ for (let key of __getOwnPropNames(from))
18
+ if (!__hasOwnProp.call(to, key) && key !== except)
19
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
20
+ }
21
+ return to;
22
+ };
23
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
24
+ // If the importer is in node compatibility mode or this is not an ESM
25
+ // file that has been converted to a CommonJS file using a Babel-
26
+ // compatible transform (i.e. "__esModule" has not been set), then set
27
+ // "default" to the CommonJS "module.exports" for node compatibility.
28
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
29
+ mod
30
+ ));
31
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
32
+
33
+ // src/Gr4vyAddCard.tsx
34
+ var Gr4vyAddCard_exports = {};
35
+ __export(Gr4vyAddCard_exports, {
36
+ Gr4vyAddCard: () => Gr4vyAddCard,
37
+ default: () => Gr4vyAddCard_default
38
+ });
39
+ function Gr4vyAddCard({ payload, theme, onAdded, onCancel, onError }) {
40
+ const embedRef = (0, import_react2.useRef)(null);
41
+ const colors = theme ? {
42
+ ...theme.colorPrimary !== void 0 ? { primary: theme.colorPrimary } : {},
43
+ ...theme.colorText !== void 0 ? { text: theme.colorText } : {},
44
+ ...theme.colorBorder !== void 0 ? { inputBorder: theme.colorBorder } : {}
45
+ } : {};
46
+ const gr4vyTheme = Object.keys(colors).length ? { colors } : void 0;
47
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [
48
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
49
+ import_embed_react.default,
50
+ {
51
+ ref: embedRef,
52
+ gr4vyId: payload.gr4vyId,
53
+ environment: payload.environment,
54
+ token: payload.embedToken,
55
+ amount: payload.amount,
56
+ currency: payload.currency,
57
+ merchantAccountId: payload.merchantAccountId,
58
+ intent: "capture",
59
+ paymentSource: "recurring",
60
+ store: true,
61
+ display: "addOnly",
62
+ ...gr4vyTheme !== void 0 ? { theme: gr4vyTheme } : {},
63
+ onComplete: (txn) => {
64
+ onAdded(txn.paymentMethod?.id);
65
+ },
66
+ onEvent: (eventName, data) => {
67
+ if (eventName === "transactionFailed") {
68
+ onError(data);
69
+ }
70
+ }
71
+ }
72
+ ),
73
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
74
+ "button",
75
+ {
76
+ type: "button",
77
+ onClick: () => {
78
+ embedRef.current?.submit();
79
+ },
80
+ style: {
81
+ marginTop: "12px",
82
+ padding: "8px 16px",
83
+ backgroundColor: theme?.colorPrimary ?? "#1D56E8",
84
+ color: "#fff",
85
+ border: "none",
86
+ borderRadius: "8px",
87
+ fontSize: "14px",
88
+ fontWeight: 600,
89
+ cursor: "pointer",
90
+ width: "100%"
91
+ },
92
+ children: "Save card"
93
+ }
94
+ ),
95
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
96
+ "button",
97
+ {
98
+ type: "button",
99
+ onClick: onCancel,
100
+ style: {
101
+ marginTop: "8px",
102
+ padding: "8px 16px",
103
+ backgroundColor: "transparent",
104
+ color: theme?.colorText ?? "#111827",
105
+ border: `1px solid ${theme?.colorBorder ?? "#E5E7EB"}`,
106
+ borderRadius: "8px",
107
+ fontSize: "14px",
108
+ cursor: "pointer",
109
+ width: "100%"
110
+ },
111
+ children: "Cancel"
112
+ }
113
+ )
114
+ ] });
115
+ }
116
+ var import_react2, import_embed_react, import_jsx_runtime, Gr4vyAddCard_default;
117
+ var init_Gr4vyAddCard = __esm({
118
+ "src/Gr4vyAddCard.tsx"() {
119
+ "use strict";
120
+ import_react2 = require("react");
121
+ import_embed_react = __toESM(require("@gr4vy/embed-react"), 1);
122
+ import_jsx_runtime = require("react/jsx-runtime");
123
+ Gr4vyAddCard_default = Gr4vyAddCard;
124
+ }
125
+ });
126
+
127
+ // src/index.tsx
128
+ var index_exports = {};
129
+ __export(index_exports, {
130
+ DEFAULT_BASE_URL: () => DEFAULT_BASE_URL,
131
+ PaymentMethods: () => PaymentMethods,
132
+ ThrottleError: () => import_errors2.ThrottleError,
133
+ ThrottlePaymentMethodsError: () => ThrottlePaymentMethodsError,
134
+ createPaymentMethods: () => createPaymentMethods,
135
+ isThrottleError: () => import_errors2.isThrottleError,
136
+ usePaymentMethods: () => usePaymentMethods
137
+ });
138
+ module.exports = __toCommonJS(index_exports);
139
+
140
+ // src/errors.ts
141
+ var import_errors = require("@usethrottle/errors");
142
+ var import_errors2 = require("@usethrottle/errors");
143
+ var ThrottlePaymentMethodsError = class extends import_errors.ThrottleError {
144
+ constructor(args) {
145
+ super(args);
146
+ this.name = "ThrottlePaymentMethodsError";
147
+ }
148
+ };
149
+
150
+ // src/types.ts
151
+ var DEFAULT_BASE_URL = "https://api.usethrottle.dev";
152
+
153
+ // src/request.ts
154
+ async function request(input) {
155
+ const res = await fetch(`${input.baseUrl}${input.path}`, {
156
+ method: input.method,
157
+ headers: {
158
+ ...input.body !== void 0 ? { "Content-Type": "application/json" } : {},
159
+ ...input.headers ?? {}
160
+ },
161
+ ...input.body !== void 0 ? { body: JSON.stringify(input.body) } : {}
162
+ });
163
+ const text = await res.text();
164
+ let parsed = {};
165
+ try {
166
+ parsed = text ? JSON.parse(text) : {};
167
+ } catch {
168
+ }
169
+ if (!res.ok) {
170
+ const e = parsed?.error ?? {};
171
+ throw new ThrottlePaymentMethodsError({
172
+ code: e.code ?? "request_failed",
173
+ message: e.message ?? `Request failed with ${res.status}`,
174
+ statusCode: res.status,
175
+ details: e.details
176
+ });
177
+ }
178
+ return parsed;
179
+ }
180
+
181
+ // src/client.ts
182
+ function createPaymentMethods(opts) {
183
+ const baseUrl = opts.baseUrl ?? DEFAULT_BASE_URL;
184
+ const headers = { "X-Throttle-PM-Token": opts.clientToken };
185
+ return {
186
+ async list() {
187
+ const parsed = await request({ method: "GET", path: "/api/v1/me/payment-methods", baseUrl, headers });
188
+ return parsed.data;
189
+ },
190
+ async setDefault(id) {
191
+ const parsed = await request({
192
+ method: "PATCH",
193
+ path: `/api/v1/me/payment-methods/${encodeURIComponent(id)}`,
194
+ baseUrl,
195
+ headers,
196
+ body: { isDefault: true }
197
+ });
198
+ return parsed.data;
199
+ },
200
+ async remove(id) {
201
+ const parsed = await request({
202
+ method: "DELETE",
203
+ path: `/api/v1/me/payment-methods/${encodeURIComponent(id)}`,
204
+ baseUrl,
205
+ headers
206
+ });
207
+ return parsed.data;
208
+ },
209
+ async startAddCard() {
210
+ const parsed = await request({
211
+ method: "POST",
212
+ path: "/api/v1/me/payment-methods/embed-token",
213
+ baseUrl,
214
+ headers
215
+ });
216
+ return parsed.data;
217
+ }
218
+ };
219
+ }
220
+
221
+ // src/usePaymentMethods.ts
222
+ var import_react = require("react");
223
+ function toPaymentMethodsError(err) {
224
+ if (err instanceof ThrottlePaymentMethodsError) return err;
225
+ const message = err instanceof Error ? err.message : String(err);
226
+ return new ThrottlePaymentMethodsError({ code: "unknown_error", message, statusCode: 0 });
227
+ }
228
+ function usePaymentMethods(opts) {
229
+ const { clientToken, baseUrl } = opts;
230
+ const client = (0, import_react.useMemo)(
231
+ () => createPaymentMethods({ clientToken, baseUrl }),
232
+ // eslint-disable-next-line react-hooks/exhaustive-deps
233
+ [clientToken, baseUrl]
234
+ );
235
+ const [cards, setCards] = (0, import_react.useState)([]);
236
+ const [isLoading, setIsLoading] = (0, import_react.useState)(true);
237
+ const [error, setError] = (0, import_react.useState)(null);
238
+ const genRef = (0, import_react.useRef)(0);
239
+ const refetch = (0, import_react.useMemo)(
240
+ () => async () => {
241
+ const myGen = genRef.current;
242
+ try {
243
+ const data = await client.list();
244
+ if (genRef.current !== myGen) return;
245
+ setCards(data);
246
+ setError(null);
247
+ } catch (err) {
248
+ if (genRef.current !== myGen) return;
249
+ setError(toPaymentMethodsError(err));
250
+ }
251
+ },
252
+ [client]
253
+ );
254
+ (0, import_react.useEffect)(() => {
255
+ const myGen = ++genRef.current;
256
+ (async () => {
257
+ setIsLoading(true);
258
+ try {
259
+ const data = await client.list();
260
+ if (genRef.current !== myGen) return;
261
+ setCards(data);
262
+ setError(null);
263
+ } catch (err) {
264
+ if (genRef.current !== myGen) return;
265
+ setError(toPaymentMethodsError(err));
266
+ } finally {
267
+ if (genRef.current === myGen) {
268
+ setIsLoading(false);
269
+ }
270
+ }
271
+ })();
272
+ }, [client]);
273
+ const setDefault = async (id) => {
274
+ try {
275
+ await client.setDefault(id);
276
+ await refetch();
277
+ } catch (err) {
278
+ const pmErr = toPaymentMethodsError(err);
279
+ setError(pmErr);
280
+ throw pmErr;
281
+ }
282
+ };
283
+ const remove = async (id) => {
284
+ try {
285
+ await client.remove(id);
286
+ await refetch();
287
+ } catch (err) {
288
+ const pmErr = toPaymentMethodsError(err);
289
+ setError(pmErr);
290
+ throw pmErr;
291
+ }
292
+ };
293
+ const addCard = async () => {
294
+ return client.startAddCard();
295
+ };
296
+ return { cards, isLoading, error, setDefault, remove, addCard, refetch };
297
+ }
298
+
299
+ // src/PaymentMethods.tsx
300
+ var import_react3 = __toESM(require("react"), 1);
301
+ var import_jsx_runtime2 = require("react/jsx-runtime");
302
+ var LazyGr4vyAddCard = import_react3.default.lazy(
303
+ () => Promise.resolve().then(() => (init_Gr4vyAddCard(), Gr4vyAddCard_exports)).then((m) => ({ default: m.Gr4vyAddCard }))
304
+ );
305
+ function formatCard(card) {
306
+ const brand = card.cardBrand ? card.cardBrand.toUpperCase() : "Card";
307
+ const last4 = card.cardLastFour ? `\u2022\u2022\u2022\u2022 ${card.cardLastFour}` : "\u2022\u2022\u2022\u2022";
308
+ const brandPart = `${brand} ${last4}`;
309
+ if (card.cardExpMonth != null && card.cardExpYear != null) {
310
+ const mm = String(card.cardExpMonth).padStart(2, "0");
311
+ const yy = String(card.cardExpYear).slice(-2);
312
+ return `${brandPart} \xB7 ${mm}/${yy}`;
313
+ }
314
+ return brandPart;
315
+ }
316
+ function PaymentMethods({ clientToken, baseUrl, theme, onChange }) {
317
+ const { cards, isLoading, error, setDefault, remove, addCard, refetch } = usePaymentMethods({
318
+ clientToken,
319
+ baseUrl
320
+ });
321
+ const [busyId, setBusyId] = (0, import_react3.useState)(null);
322
+ const [addCardPayload, setAddCardPayload] = (0, import_react3.useState)(null);
323
+ const [externalError, setExternalError] = (0, import_react3.useState)(null);
324
+ const onChangeRef = (0, import_react3.useRef)(onChange);
325
+ (0, import_react3.useEffect)(() => {
326
+ onChangeRef.current = onChange;
327
+ });
328
+ (0, import_react3.useEffect)(() => {
329
+ if (!isLoading) onChangeRef.current?.(cards);
330
+ }, [cards, isLoading]);
331
+ const primary = theme?.colorPrimary ?? "#1D56E8";
332
+ const colorText = theme?.colorText ?? "#111827";
333
+ const colorBorder = theme?.colorBorder ?? "#E5E7EB";
334
+ const borderRadius = theme?.borderRadius ?? "8px";
335
+ const handleSetDefault = async (id) => {
336
+ setBusyId(id);
337
+ try {
338
+ await setDefault(id);
339
+ } catch {
340
+ } finally {
341
+ setBusyId(null);
342
+ }
343
+ };
344
+ const handleRemove = async (id) => {
345
+ setBusyId(id);
346
+ try {
347
+ await remove(id);
348
+ } catch {
349
+ } finally {
350
+ setBusyId(null);
351
+ }
352
+ };
353
+ const handleAddCard = async () => {
354
+ try {
355
+ const payload = await addCard();
356
+ setExternalError(null);
357
+ setAddCardPayload(payload);
358
+ } catch (err) {
359
+ const message = err instanceof Error ? err.message : String(err);
360
+ setExternalError(new Error(message));
361
+ }
362
+ };
363
+ if (isLoading) {
364
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { role: "status", "aria-label": "Loading payment methods", style: { color: colorText }, children: "Loading\u2026" });
365
+ }
366
+ const displayError = externalError ?? error;
367
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { style: { color: colorText, fontFamily: "inherit" }, children: [
368
+ displayError && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
369
+ "div",
370
+ {
371
+ role: "alert",
372
+ style: {
373
+ color: "#DC2626",
374
+ marginBottom: "12px",
375
+ padding: "8px 12px",
376
+ border: `1px solid #FCA5A5`,
377
+ borderRadius,
378
+ fontSize: "14px"
379
+ },
380
+ children: displayError.message
381
+ }
382
+ ),
383
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("ul", { style: { listStyle: "none", margin: 0, padding: 0 }, children: cards.map((card) => {
384
+ const isBusy = busyId === card.id;
385
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
386
+ "li",
387
+ {
388
+ style: {
389
+ display: "flex",
390
+ alignItems: "center",
391
+ gap: "12px",
392
+ padding: "12px",
393
+ border: `1px solid ${colorBorder}`,
394
+ borderRadius,
395
+ marginBottom: "8px"
396
+ },
397
+ children: [
398
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { style: { flex: 1, fontSize: "14px" }, children: formatCard(card) }),
399
+ card.isDefault ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
400
+ "span",
401
+ {
402
+ style: {
403
+ backgroundColor: primary,
404
+ color: "#fff",
405
+ fontSize: "12px",
406
+ fontWeight: 600,
407
+ padding: "2px 8px",
408
+ borderRadius: "999px"
409
+ },
410
+ children: "Default"
411
+ }
412
+ ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(import_jsx_runtime2.Fragment, { children: [
413
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
414
+ "button",
415
+ {
416
+ type: "button",
417
+ disabled: isBusy,
418
+ onClick: () => handleSetDefault(card.id),
419
+ style: {
420
+ fontSize: "13px",
421
+ padding: "4px 10px",
422
+ border: `1px solid ${colorBorder}`,
423
+ borderRadius,
424
+ background: "transparent",
425
+ cursor: isBusy ? "not-allowed" : "pointer",
426
+ opacity: isBusy ? 0.5 : 1
427
+ },
428
+ children: "Make default"
429
+ }
430
+ ),
431
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
432
+ "button",
433
+ {
434
+ type: "button",
435
+ disabled: isBusy,
436
+ onClick: () => handleRemove(card.id),
437
+ style: {
438
+ fontSize: "13px",
439
+ padding: "4px 10px",
440
+ border: `1px solid #FCA5A5`,
441
+ borderRadius,
442
+ background: "transparent",
443
+ color: "#DC2626",
444
+ cursor: isBusy ? "not-allowed" : "pointer",
445
+ opacity: isBusy ? 0.5 : 1
446
+ },
447
+ children: "Remove"
448
+ }
449
+ )
450
+ ] })
451
+ ]
452
+ },
453
+ card.id
454
+ );
455
+ }) }),
456
+ addCardPayload ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
457
+ import_react3.Suspense,
458
+ {
459
+ fallback: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", { role: "status", style: { color: colorText, marginTop: "12px" }, children: "Loading\u2026" }),
460
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
461
+ LazyGr4vyAddCard,
462
+ {
463
+ payload: addCardPayload,
464
+ theme,
465
+ onAdded: async (paymentMethodId) => {
466
+ void paymentMethodId;
467
+ await refetch();
468
+ setExternalError(null);
469
+ setAddCardPayload(null);
470
+ },
471
+ onCancel: () => setAddCardPayload(null),
472
+ onError: (err) => {
473
+ const message = err instanceof Error ? err.message : String(err);
474
+ setExternalError(new Error(message));
475
+ setAddCardPayload(null);
476
+ }
477
+ }
478
+ )
479
+ }
480
+ ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
481
+ "button",
482
+ {
483
+ type: "button",
484
+ onClick: handleAddCard,
485
+ style: {
486
+ marginTop: "12px",
487
+ padding: "8px 16px",
488
+ backgroundColor: primary,
489
+ color: "#fff",
490
+ border: "none",
491
+ borderRadius,
492
+ fontSize: "14px",
493
+ fontWeight: 600,
494
+ cursor: "pointer"
495
+ },
496
+ children: "+ Add card"
497
+ }
498
+ )
499
+ ] });
500
+ }
501
+ // Annotate the CommonJS export names for ESM import in node:
502
+ 0 && (module.exports = {
503
+ DEFAULT_BASE_URL,
504
+ PaymentMethods,
505
+ ThrottleError,
506
+ ThrottlePaymentMethodsError,
507
+ createPaymentMethods,
508
+ isThrottleError,
509
+ usePaymentMethods
510
+ });
511
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Gr4vyAddCard.tsx","../src/index.tsx","../src/errors.ts","../src/types.ts","../src/request.ts","../src/client.ts","../src/usePaymentMethods.ts","../src/PaymentMethods.tsx"],"sourcesContent":["/**\n * Gr4vyAddCard — lazy-loaded vault-only embed wrapper.\n *\n * THIS FILE MUST ONLY BE LOADED VIA React.lazy(() => import('./Gr4vyAddCard'))\n * from PaymentMethods.tsx. Never import it at the module top-level of any file\n * that is part of the server bundle — @gr4vy/embed-react touches `window` at\n * module evaluation time and will throw `ReferenceError: window is not defined`\n * in SSR contexts.\n */\nimport React, { useRef } from 'react';\nimport Gr4vyEmbed, { type EmbedInstance } from '@gr4vy/embed-react';\nimport type { EmbedPayload, PaymentMethodsTheme } from './types';\n\ninterface Gr4vyTransaction {\n id: string;\n status: string;\n paymentMethod?: { id?: string };\n}\n\nexport interface Gr4vyAddCardProps {\n payload: EmbedPayload;\n theme?: PaymentMethodsTheme;\n onAdded: (paymentMethodId?: string) => void;\n onCancel: () => void;\n onError: (err: unknown) => void;\n}\n\nexport function Gr4vyAddCard({ payload, theme, onAdded, onCancel, onError }: Gr4vyAddCardProps) {\n const embedRef = useRef<EmbedInstance>(null);\n\n const colors = theme\n ? {\n ...(theme.colorPrimary !== undefined ? { primary: theme.colorPrimary } : {}),\n ...(theme.colorText !== undefined ? { text: theme.colorText } : {}),\n ...(theme.colorBorder !== undefined ? { inputBorder: theme.colorBorder } : {}),\n }\n : {};\n const gr4vyTheme = Object.keys(colors).length ? { colors } : undefined;\n\n return (\n <div>\n <Gr4vyEmbed\n ref={embedRef}\n gr4vyId={payload.gr4vyId}\n environment={payload.environment}\n token={payload.embedToken}\n amount={payload.amount}\n currency={payload.currency}\n merchantAccountId={payload.merchantAccountId}\n intent=\"capture\"\n paymentSource=\"recurring\"\n store={true}\n display=\"addOnly\"\n {...(gr4vyTheme !== undefined ? { theme: gr4vyTheme } : {})}\n onComplete={(txn: Gr4vyTransaction) => {\n onAdded(txn.paymentMethod?.id);\n }}\n onEvent={(eventName: string, data: unknown) => {\n if (eventName === 'transactionFailed') {\n onError(data);\n }\n }}\n />\n\n <button\n type=\"button\"\n onClick={() => {\n embedRef.current?.submit();\n }}\n style={{\n marginTop: '12px',\n padding: '8px 16px',\n backgroundColor: theme?.colorPrimary ?? '#1D56E8',\n color: '#fff',\n border: 'none',\n borderRadius: '8px',\n fontSize: '14px',\n fontWeight: 600,\n cursor: 'pointer',\n width: '100%',\n }}\n >\n Save card\n </button>\n\n <button\n type=\"button\"\n onClick={onCancel}\n style={{\n marginTop: '8px',\n padding: '8px 16px',\n backgroundColor: 'transparent',\n color: theme?.colorText ?? '#111827',\n border: `1px solid ${theme?.colorBorder ?? '#E5E7EB'}`,\n borderRadius: '8px',\n fontSize: '14px',\n cursor: 'pointer',\n width: '100%',\n }}\n >\n Cancel\n </button>\n </div>\n );\n}\n\nexport default Gr4vyAddCard;\n","export { ThrottlePaymentMethodsError, ThrottleError, isThrottleError } from './errors';\nexport type { SavedCard, EmbedPayload, MintedClientToken, PaymentMethodsTheme } from './types';\nexport { DEFAULT_BASE_URL } from './types';\nexport { createPaymentMethods } from './client';\nexport type { PaymentMethodsClient } from './client';\nexport { usePaymentMethods } from './usePaymentMethods';\nexport type { UsePaymentMethodsOpts, UsePaymentMethodsResult } from './usePaymentMethods';\nexport { PaymentMethods } from './PaymentMethods';\nexport type { PaymentMethodsProps } from './PaymentMethods';\n","import { ThrottleError } from '@usethrottle/errors';\n\nexport class ThrottlePaymentMethodsError extends ThrottleError {\n constructor(args: { code: string; message: string; statusCode: number; details?: unknown }) {\n super(args);\n this.name = 'ThrottlePaymentMethodsError';\n }\n}\n\nexport { ThrottleError, isThrottleError } from '@usethrottle/errors';\n","export interface SavedCard {\n id: string;\n methodType: string;\n cardBrand: string | null;\n cardLastFour: string | null;\n cardExpMonth: number | null;\n cardExpYear: number | null;\n isDefault: boolean;\n}\n\nexport interface EmbedPayload {\n embedToken: string;\n checkoutSessionId: string;\n amount: number;\n currency: string;\n gr4vyId: string;\n merchantAccountId?: string;\n environment: 'sandbox' | 'production';\n hostedUrl?: string;\n embedUrl?: string;\n}\n\nexport interface MintedClientToken {\n token: string;\n expiresAt: string;\n}\n\nexport interface PaymentMethodsTheme {\n colorPrimary?: string;\n colorText?: string;\n colorBorder?: string;\n borderRadius?: string;\n}\n\nexport const DEFAULT_BASE_URL = 'https://api.usethrottle.dev';\n","import { ThrottlePaymentMethodsError } from './errors';\n\nexport async function request(input: {\n method: string;\n path: string;\n baseUrl: string;\n headers?: Record<string, string>;\n body?: unknown;\n}): Promise<any> {\n const res = await fetch(`${input.baseUrl}${input.path}`, {\n method: input.method,\n headers: {\n ...(input.body !== undefined ? { 'Content-Type': 'application/json' } : {}),\n ...(input.headers ?? {}),\n },\n ...(input.body !== undefined ? { body: JSON.stringify(input.body) } : {}),\n });\n const text = await res.text();\n let parsed: any = {};\n try {\n parsed = text ? JSON.parse(text) : {};\n } catch {\n // Non-JSON body (e.g. an HTML 502/503 gateway page). Leave parsed as {} so\n // the non-2xx branch below still throws a typed ThrottlePaymentMethodsError\n // (code 'request_failed') rather than leaking a raw SyntaxError.\n }\n if (!res.ok) {\n const e = parsed?.error ?? {};\n throw new ThrottlePaymentMethodsError({\n code: e.code ?? 'request_failed',\n message: e.message ?? `Request failed with ${res.status}`,\n statusCode: res.status,\n details: e.details,\n });\n }\n return parsed;\n}\n","import { request } from './request';\nimport { DEFAULT_BASE_URL } from './types';\nimport type { SavedCard, EmbedPayload } from './types';\n\nexport interface PaymentMethodsClient {\n list(): Promise<SavedCard[]>;\n setDefault(id: string): Promise<SavedCard>;\n remove(id: string): Promise<{ id: string }>;\n startAddCard(): Promise<EmbedPayload>;\n}\n\nexport function createPaymentMethods(opts: {\n clientToken: string;\n baseUrl?: string;\n}): PaymentMethodsClient {\n const baseUrl = opts.baseUrl ?? DEFAULT_BASE_URL;\n const headers = { 'X-Throttle-PM-Token': opts.clientToken };\n\n return {\n async list() {\n const parsed = await request({ method: 'GET', path: '/api/v1/me/payment-methods', baseUrl, headers });\n return parsed.data as SavedCard[];\n },\n\n async setDefault(id: string) {\n const parsed = await request({\n method: 'PATCH',\n path: `/api/v1/me/payment-methods/${encodeURIComponent(id)}`,\n baseUrl,\n headers,\n body: { isDefault: true },\n });\n return parsed.data as SavedCard;\n },\n\n async remove(id: string) {\n const parsed = await request({\n method: 'DELETE',\n path: `/api/v1/me/payment-methods/${encodeURIComponent(id)}`,\n baseUrl,\n headers,\n });\n return parsed.data as { id: string };\n },\n\n async startAddCard() {\n const parsed = await request({\n method: 'POST',\n path: '/api/v1/me/payment-methods/embed-token',\n baseUrl,\n headers,\n });\n return parsed.data as EmbedPayload;\n },\n };\n}\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { createPaymentMethods } from './client';\nimport { ThrottlePaymentMethodsError } from './errors';\nimport type { EmbedPayload, SavedCard } from './types';\n\nexport interface UsePaymentMethodsOpts {\n clientToken: string;\n baseUrl?: string;\n}\n\nexport interface UsePaymentMethodsResult {\n cards: SavedCard[];\n isLoading: boolean;\n error: ThrottlePaymentMethodsError | null;\n setDefault(id: string): Promise<void>;\n remove(id: string): Promise<void>;\n addCard(): Promise<EmbedPayload>;\n refetch(): Promise<void>;\n}\n\nfunction toPaymentMethodsError(err: unknown): ThrottlePaymentMethodsError {\n if (err instanceof ThrottlePaymentMethodsError) return err;\n const message = err instanceof Error ? err.message : String(err);\n return new ThrottlePaymentMethodsError({ code: 'unknown_error', message, statusCode: 0 });\n}\n\nexport function usePaymentMethods(opts: UsePaymentMethodsOpts): UsePaymentMethodsResult {\n const { clientToken, baseUrl } = opts;\n\n const client = useMemo(\n () => createPaymentMethods({ clientToken, baseUrl }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [clientToken, baseUrl],\n );\n\n const [cards, setCards] = useState<SavedCard[]>([]);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<ThrottlePaymentMethodsError | null>(null);\n const genRef = useRef(0);\n\n const refetch = useMemo(\n () => async () => {\n const myGen = genRef.current;\n try {\n const data = await client.list();\n if (genRef.current !== myGen) return;\n setCards(data);\n setError(null);\n } catch (err) {\n if (genRef.current !== myGen) return;\n setError(toPaymentMethodsError(err));\n }\n },\n [client],\n );\n\n useEffect(() => {\n const myGen = ++genRef.current;\n\n (async () => {\n setIsLoading(true);\n try {\n const data = await client.list();\n if (genRef.current !== myGen) return;\n setCards(data);\n setError(null);\n } catch (err) {\n if (genRef.current !== myGen) return;\n setError(toPaymentMethodsError(err));\n } finally {\n if (genRef.current === myGen) {\n setIsLoading(false);\n }\n }\n })();\n }, [client]);\n\n const setDefault = async (id: string): Promise<void> => {\n try {\n await client.setDefault(id);\n await refetch();\n } catch (err) {\n const pmErr = toPaymentMethodsError(err);\n setError(pmErr);\n throw pmErr;\n }\n };\n\n const remove = async (id: string): Promise<void> => {\n try {\n await client.remove(id);\n await refetch();\n } catch (err) {\n const pmErr = toPaymentMethodsError(err);\n setError(pmErr);\n throw pmErr;\n }\n };\n\n const addCard = async (): Promise<EmbedPayload> => {\n return client.startAddCard();\n };\n\n return { cards, isLoading, error, setDefault, remove, addCard, refetch };\n}\n","import React, { Suspense, useEffect, useRef, useState } from 'react';\nimport { usePaymentMethods } from './usePaymentMethods';\nimport type { EmbedPayload, SavedCard, PaymentMethodsTheme } from './types';\n\n// Lazy import — keeps @gr4vy/embed-react out of the eager bundle (SSR-safe).\n// Do NOT hoist this to a top-level import; React.lazy is the only safe path.\nconst LazyGr4vyAddCard = React.lazy(() =>\n import('./Gr4vyAddCard').then((m) => ({ default: m.Gr4vyAddCard })),\n);\n\nexport interface PaymentMethodsProps {\n clientToken: string;\n baseUrl?: string;\n theme?: PaymentMethodsTheme;\n onChange?: (cards: SavedCard[]) => void;\n}\n\nfunction formatCard(card: SavedCard): string {\n const brand = card.cardBrand ? card.cardBrand.toUpperCase() : 'Card';\n const last4 = card.cardLastFour ? `•••• ${card.cardLastFour}` : '••••';\n const brandPart = `${brand} ${last4}`;\n\n if (card.cardExpMonth != null && card.cardExpYear != null) {\n const mm = String(card.cardExpMonth).padStart(2, '0');\n const yy = String(card.cardExpYear).slice(-2);\n return `${brandPart} · ${mm}/${yy}`;\n }\n return brandPart;\n}\n\nexport function PaymentMethods({ clientToken, baseUrl, theme, onChange }: PaymentMethodsProps) {\n const { cards, isLoading, error, setDefault, remove, addCard, refetch } = usePaymentMethods({\n clientToken,\n baseUrl,\n });\n\n const [busyId, setBusyId] = useState<string | null>(null);\n const [addCardPayload, setAddCardPayload] = useState<EmbedPayload | null>(null);\n const [externalError, setExternalError] = useState<Error | null>(null);\n\n const onChangeRef = useRef(onChange);\n useEffect(() => { onChangeRef.current = onChange; });\n useEffect(() => { if (!isLoading) onChangeRef.current?.(cards); }, [cards, isLoading]);\n\n const primary = theme?.colorPrimary ?? '#1D56E8';\n const colorText = theme?.colorText ?? '#111827';\n const colorBorder = theme?.colorBorder ?? '#E5E7EB';\n const borderRadius = theme?.borderRadius ?? '8px';\n\n const handleSetDefault = async (id: string) => {\n setBusyId(id);\n try {\n await setDefault(id);\n } catch {\n // error is already set in the hook\n } finally {\n setBusyId(null);\n }\n };\n\n const handleRemove = async (id: string) => {\n setBusyId(id);\n try {\n await remove(id);\n } catch {\n // error is already set in the hook\n } finally {\n setBusyId(null);\n }\n };\n\n const handleAddCard = async () => {\n try {\n const payload = await addCard();\n setExternalError(null);\n setAddCardPayload(payload);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n setExternalError(new Error(message));\n }\n };\n\n if (isLoading) {\n return (\n <div role=\"status\" aria-label=\"Loading payment methods\" style={{ color: colorText }}>\n Loading…\n </div>\n );\n }\n\n const displayError = externalError ?? error;\n\n return (\n <div style={{ color: colorText, fontFamily: 'inherit' }}>\n {displayError && (\n <div\n role=\"alert\"\n style={{\n color: '#DC2626',\n marginBottom: '12px',\n padding: '8px 12px',\n border: `1px solid #FCA5A5`,\n borderRadius,\n fontSize: '14px',\n }}\n >\n {displayError.message}\n </div>\n )}\n\n <ul style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n {cards.map((card) => {\n const isBusy = busyId === card.id;\n return (\n <li\n key={card.id}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: '12px',\n padding: '12px',\n border: `1px solid ${colorBorder}`,\n borderRadius,\n marginBottom: '8px',\n }}\n >\n <span style={{ flex: 1, fontSize: '14px' }}>{formatCard(card)}</span>\n\n {card.isDefault ? (\n <span\n style={{\n backgroundColor: primary,\n color: '#fff',\n fontSize: '12px',\n fontWeight: 600,\n padding: '2px 8px',\n borderRadius: '999px',\n }}\n >\n Default\n </span>\n ) : (\n <>\n <button\n type=\"button\"\n disabled={isBusy}\n onClick={() => handleSetDefault(card.id)}\n style={{\n fontSize: '13px',\n padding: '4px 10px',\n border: `1px solid ${colorBorder}`,\n borderRadius,\n background: 'transparent',\n cursor: isBusy ? 'not-allowed' : 'pointer',\n opacity: isBusy ? 0.5 : 1,\n }}\n >\n Make default\n </button>\n <button\n type=\"button\"\n disabled={isBusy}\n onClick={() => handleRemove(card.id)}\n style={{\n fontSize: '13px',\n padding: '4px 10px',\n border: `1px solid #FCA5A5`,\n borderRadius,\n background: 'transparent',\n color: '#DC2626',\n cursor: isBusy ? 'not-allowed' : 'pointer',\n opacity: isBusy ? 0.5 : 1,\n }}\n >\n Remove\n </button>\n </>\n )}\n </li>\n );\n })}\n </ul>\n\n {addCardPayload ? (\n <Suspense\n fallback={\n <div role=\"status\" style={{ color: colorText, marginTop: '12px' }}>\n Loading…\n </div>\n }\n >\n <LazyGr4vyAddCard\n payload={addCardPayload}\n theme={theme}\n onAdded={async (paymentMethodId) => {\n void paymentMethodId;\n await refetch();\n setExternalError(null);\n setAddCardPayload(null);\n }}\n onCancel={() => setAddCardPayload(null)}\n onError={(err) => {\n const message = err instanceof Error ? (err as Error).message : String(err);\n setExternalError(new Error(message));\n setAddCardPayload(null);\n }}\n />\n </Suspense>\n ) : (\n <button\n type=\"button\"\n onClick={handleAddCard}\n style={{\n marginTop: '12px',\n padding: '8px 16px',\n backgroundColor: primary,\n color: '#fff',\n border: 'none',\n borderRadius,\n fontSize: '14px',\n fontWeight: 600,\n cursor: 'pointer',\n }}\n >\n + Add card\n </button>\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["Gr4vyEmbed","import_react","import_errors","import_react","import_jsx_runtime","React"]}
@@ -0,0 +1,52 @@
1
+ import { ThrottleError } from '@usethrottle/errors';
2
+ export { ThrottleError, isThrottleError } from '@usethrottle/errors';
3
+ import { S as SavedCard, E as EmbedPayload, P as PaymentMethodsTheme } from './types-Bleeq_oI.cjs';
4
+ export { D as DEFAULT_BASE_URL, M as MintedClientToken } from './types-Bleeq_oI.cjs';
5
+ import * as react_jsx_runtime from 'react/jsx-runtime';
6
+
7
+ declare class ThrottlePaymentMethodsError extends ThrottleError {
8
+ constructor(args: {
9
+ code: string;
10
+ message: string;
11
+ statusCode: number;
12
+ details?: unknown;
13
+ });
14
+ }
15
+
16
+ interface PaymentMethodsClient {
17
+ list(): Promise<SavedCard[]>;
18
+ setDefault(id: string): Promise<SavedCard>;
19
+ remove(id: string): Promise<{
20
+ id: string;
21
+ }>;
22
+ startAddCard(): Promise<EmbedPayload>;
23
+ }
24
+ declare function createPaymentMethods(opts: {
25
+ clientToken: string;
26
+ baseUrl?: string;
27
+ }): PaymentMethodsClient;
28
+
29
+ interface UsePaymentMethodsOpts {
30
+ clientToken: string;
31
+ baseUrl?: string;
32
+ }
33
+ interface UsePaymentMethodsResult {
34
+ cards: SavedCard[];
35
+ isLoading: boolean;
36
+ error: ThrottlePaymentMethodsError | null;
37
+ setDefault(id: string): Promise<void>;
38
+ remove(id: string): Promise<void>;
39
+ addCard(): Promise<EmbedPayload>;
40
+ refetch(): Promise<void>;
41
+ }
42
+ declare function usePaymentMethods(opts: UsePaymentMethodsOpts): UsePaymentMethodsResult;
43
+
44
+ interface PaymentMethodsProps {
45
+ clientToken: string;
46
+ baseUrl?: string;
47
+ theme?: PaymentMethodsTheme;
48
+ onChange?: (cards: SavedCard[]) => void;
49
+ }
50
+ declare function PaymentMethods({ clientToken, baseUrl, theme, onChange }: PaymentMethodsProps): react_jsx_runtime.JSX.Element;
51
+
52
+ export { EmbedPayload, PaymentMethods, type PaymentMethodsClient, type PaymentMethodsProps, PaymentMethodsTheme, SavedCard, ThrottlePaymentMethodsError, type UsePaymentMethodsOpts, type UsePaymentMethodsResult, createPaymentMethods, usePaymentMethods };
@@ -0,0 +1,52 @@
1
+ import { ThrottleError } from '@usethrottle/errors';
2
+ export { ThrottleError, isThrottleError } from '@usethrottle/errors';
3
+ import { S as SavedCard, E as EmbedPayload, P as PaymentMethodsTheme } from './types-Bleeq_oI.js';
4
+ export { D as DEFAULT_BASE_URL, M as MintedClientToken } from './types-Bleeq_oI.js';
5
+ import * as react_jsx_runtime from 'react/jsx-runtime';
6
+
7
+ declare class ThrottlePaymentMethodsError extends ThrottleError {
8
+ constructor(args: {
9
+ code: string;
10
+ message: string;
11
+ statusCode: number;
12
+ details?: unknown;
13
+ });
14
+ }
15
+
16
+ interface PaymentMethodsClient {
17
+ list(): Promise<SavedCard[]>;
18
+ setDefault(id: string): Promise<SavedCard>;
19
+ remove(id: string): Promise<{
20
+ id: string;
21
+ }>;
22
+ startAddCard(): Promise<EmbedPayload>;
23
+ }
24
+ declare function createPaymentMethods(opts: {
25
+ clientToken: string;
26
+ baseUrl?: string;
27
+ }): PaymentMethodsClient;
28
+
29
+ interface UsePaymentMethodsOpts {
30
+ clientToken: string;
31
+ baseUrl?: string;
32
+ }
33
+ interface UsePaymentMethodsResult {
34
+ cards: SavedCard[];
35
+ isLoading: boolean;
36
+ error: ThrottlePaymentMethodsError | null;
37
+ setDefault(id: string): Promise<void>;
38
+ remove(id: string): Promise<void>;
39
+ addCard(): Promise<EmbedPayload>;
40
+ refetch(): Promise<void>;
41
+ }
42
+ declare function usePaymentMethods(opts: UsePaymentMethodsOpts): UsePaymentMethodsResult;
43
+
44
+ interface PaymentMethodsProps {
45
+ clientToken: string;
46
+ baseUrl?: string;
47
+ theme?: PaymentMethodsTheme;
48
+ onChange?: (cards: SavedCard[]) => void;
49
+ }
50
+ declare function PaymentMethods({ clientToken, baseUrl, theme, onChange }: PaymentMethodsProps): react_jsx_runtime.JSX.Element;
51
+
52
+ export { EmbedPayload, PaymentMethods, type PaymentMethodsClient, type PaymentMethodsProps, PaymentMethodsTheme, SavedCard, ThrottlePaymentMethodsError, type UsePaymentMethodsOpts, type UsePaymentMethodsResult, createPaymentMethods, usePaymentMethods };