@moneydevkit/nextjs 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/README.md +78 -0
- package/dist/components/Checkout.d.ts +12 -0
- package/dist/components/Checkout.js +133 -0
- package/dist/components/Checkout.js.map +1 -0
- package/dist/components/checkout/ExpiredCheckout.d.ts +10 -0
- package/dist/components/checkout/ExpiredCheckout.js +25 -0
- package/dist/components/checkout/ExpiredCheckout.js.map +1 -0
- package/dist/components/checkout/PaymentReceivedCheckout.d.ts +6 -0
- package/dist/components/checkout/PaymentReceivedCheckout.js +31 -0
- package/dist/components/checkout/PaymentReceivedCheckout.js.map +1 -0
- package/dist/components/checkout/PendingPaymentCheckout.d.ts +9 -0
- package/dist/components/checkout/PendingPaymentCheckout.js +69 -0
- package/dist/components/checkout/PendingPaymentCheckout.js.map +1 -0
- package/dist/components/checkout/UnconfirmedCheckout.d.ts +9 -0
- package/dist/components/checkout/UnconfirmedCheckout.js +54 -0
- package/dist/components/checkout/UnconfirmedCheckout.js.map +1 -0
- package/dist/components/ui/button.d.ts +10 -0
- package/dist/components/ui/button.js +32 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/card.d.ts +9 -0
- package/dist/components/ui/card.js +25 -0
- package/dist/components/ui/card.js.map +1 -0
- package/dist/components/ui/collapsible.d.ts +5 -0
- package/dist/components/ui/collapsible.js +14 -0
- package/dist/components/ui/collapsible.js.map +1 -0
- package/dist/components/ui/dialog.d.ts +15 -0
- package/dist/components/ui/dialog.js +37 -0
- package/dist/components/ui/dialog.js.map +1 -0
- package/dist/components/ui/drawer.d.ts +13 -0
- package/dist/components/ui/drawer.js +36 -0
- package/dist/components/ui/drawer.js.map +1 -0
- package/dist/components/ui/form.d.ts +24 -0
- package/dist/components/ui/form.js +60 -0
- package/dist/components/ui/form.js.map +1 -0
- package/dist/components/ui/input.d.ts +3 -0
- package/dist/components/ui/input.js +7 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/label.d.ts +4 -0
- package/dist/components/ui/label.js +9 -0
- package/dist/components/ui/label.js.map +1 -0
- package/dist/components/ui/select.d.ts +15 -0
- package/dist/components/ui/select.js +39 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/textarea.d.ts +3 -0
- package/dist/components/ui/textarea.js +7 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/constants.d.ts +1 -0
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -0
- package/dist/hooks/useCheckout.d.ts +19 -0
- package/dist/hooks/useCheckout.js +42 -0
- package/dist/hooks/useCheckout.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/lib/utils.js +6 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/mdk-styles.css +2436 -0
- package/dist/next-plugin.d.ts +31 -0
- package/dist/next-plugin.js +107 -0
- package/dist/next-plugin.js.map +1 -0
- package/dist/providers.d.ts +7 -0
- package/dist/providers.js +17 -0
- package/dist/providers.js.map +1 -0
- package/dist/server/actions.d.ts +2507 -0
- package/dist/server/actions.js +71 -0
- package/dist/server/actions.js.map +1 -0
- package/dist/server/handlers/balance.d.ts +1 -0
- package/dist/server/handlers/balance.js +19 -0
- package/dist/server/handlers/balance.js.map +1 -0
- package/dist/server/handlers/pay_bolt_12.d.ts +1 -0
- package/dist/server/handlers/pay_bolt_12.js +19 -0
- package/dist/server/handlers/pay_bolt_12.js.map +1 -0
- package/dist/server/handlers/ping.d.ts +1 -0
- package/dist/server/handlers/ping.js +13 -0
- package/dist/server/handlers/ping.js.map +1 -0
- package/dist/server/handlers/webhooks.d.ts +1 -0
- package/dist/server/handlers/webhooks.js +44 -0
- package/dist/server/handlers/webhooks.js.map +1 -0
- package/dist/server/index.d.ts +2501 -0
- package/dist/server/index.js +15 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/lightning-logs.d.ts +5 -0
- package/dist/server/lightning-logs.js +170 -0
- package/dist/server/lightning-logs.js.map +1 -0
- package/dist/server/logging.d.ts +3 -0
- package/dist/server/logging.js +17 -0
- package/dist/server/logging.js.map +1 -0
- package/dist/server/mdk.d.ts +7 -0
- package/dist/server/mdk.js +81 -0
- package/dist/server/mdk.js.map +1 -0
- package/dist/server/money-dev-kit.d.ts +3374 -0
- package/dist/server/money-dev-kit.js +165 -0
- package/dist/server/money-dev-kit.js.map +1 -0
- package/dist/server/payment-state.d.ts +3 -0
- package/dist/server/payment-state.js +32 -0
- package/dist/server/payment-state.js.map +1 -0
- package/dist/server/route.d.ts +8 -0
- package/dist/server/route.js +98 -0
- package/dist/server/route.js.map +1 -0
- package/dist/server/runtime.d.ts +3 -0
- package/dist/server/runtime.js +4 -0
- package/dist/server/runtime.js.map +1 -0
- package/package.json +82 -0
package/README.md
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# mdk-checkout
|
|
2
|
+
|
|
3
|
+
Money Dev Kit checkout library for embedding Lightning-powered payments inside Next.js (App Router) apps.
|
|
4
|
+
|
|
5
|
+
## Setup
|
|
6
|
+
1. **Create a Money Dev Kit account** at [moneydevkit.com](https://moneydevkit.com) and grab your `api_key`, `webhook_key`, and mnemonic.
|
|
7
|
+
2. **Install the SDK** in your project:
|
|
8
|
+
```bash
|
|
9
|
+
npm install mdk-checkout
|
|
10
|
+
```
|
|
11
|
+
3. **Add required secrets** to `.env` (or similar):
|
|
12
|
+
```env
|
|
13
|
+
MDK_ACCESS_TOKEN=your_api_key_here
|
|
14
|
+
MDK_WEBHOOK_SECRET=your_webhook_key_here
|
|
15
|
+
MDK_MNEMONIC=your_mnemonic_here
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Quick Start (Next.js App Router)
|
|
19
|
+
### 1. Trigger a checkout from any client component
|
|
20
|
+
```jsx
|
|
21
|
+
// app/page.js
|
|
22
|
+
'use client'
|
|
23
|
+
|
|
24
|
+
import { useCheckout } from 'mdk-checkout'
|
|
25
|
+
|
|
26
|
+
export default function HomePage() {
|
|
27
|
+
const { navigate, isNavigating } = useCheckout()
|
|
28
|
+
|
|
29
|
+
const handlePurchase = () => {
|
|
30
|
+
navigate({
|
|
31
|
+
prompt: 'Describe the purchase shown to the buyer',
|
|
32
|
+
amount: 500, // 500 USD cents or Bitcoin sats
|
|
33
|
+
currency: 'USD', // or 'SAT'
|
|
34
|
+
metadata: {
|
|
35
|
+
type: 'my_type',
|
|
36
|
+
customField: 'internal reference for this checkout',
|
|
37
|
+
successUrl: '/checkout/success'
|
|
38
|
+
}
|
|
39
|
+
})
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
<button onClick={handlePurchase} disabled={isNavigating}>
|
|
44
|
+
{isNavigating ? 'Creating checkout…' : 'Buy Now'}
|
|
45
|
+
</button>
|
|
46
|
+
)
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### 2. Render the hosted checkout page
|
|
51
|
+
```jsx
|
|
52
|
+
// app/checkout/[id]/page.js
|
|
53
|
+
"use client";
|
|
54
|
+
import { Checkout } from "mdk-checkout";
|
|
55
|
+
import { use } from "react";
|
|
56
|
+
|
|
57
|
+
export default function CheckoutPage({ params }) {
|
|
58
|
+
const { id } = use(params);
|
|
59
|
+
|
|
60
|
+
return <Checkout id={id} />;
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 3. Expose the unified Money Dev Kit endpoint
|
|
65
|
+
```js
|
|
66
|
+
// app/api/mdk/route.js
|
|
67
|
+
export { POST } from 'mdk-checkout/server/route'
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 4. Configure Next.js
|
|
71
|
+
```js
|
|
72
|
+
// next.config.js / next.config.mjs
|
|
73
|
+
import withMdkCheckout from 'mdk-checkout/next-plugin'
|
|
74
|
+
|
|
75
|
+
export default withMdkCheckout({})
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
You now have a complete Lightning checkout loop: the button creates a session, the dynamic route renders it, and the webhook endpoint signals your Lightning node to claim paid invoices.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Checkout as CheckoutType } from '@moneydevkit/api-contract';
|
|
2
|
+
import '../mdk-styles.css';
|
|
3
|
+
import { type CreateCheckoutParams } from '../server/actions';
|
|
4
|
+
export interface CheckoutProps {
|
|
5
|
+
id?: string;
|
|
6
|
+
onSuccess?: (checkout: CheckoutType) => void;
|
|
7
|
+
title?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
createParams?: CreateCheckoutParams;
|
|
10
|
+
}
|
|
11
|
+
export declare function Checkout(props: CheckoutProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export default Checkout;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useQuery } from '@tanstack/react-query';
|
|
4
|
+
import { useEffect, useState } from 'react';
|
|
5
|
+
import '../mdk-styles.css';
|
|
6
|
+
import { MdkCheckoutProvider } from '../providers';
|
|
7
|
+
import { getCheckout, createCheckout } from '../server/actions';
|
|
8
|
+
import ExpiredCheckout from './checkout/ExpiredCheckout';
|
|
9
|
+
import PaymentReceivedCheckout from './checkout/PaymentReceivedCheckout';
|
|
10
|
+
import PendingPaymentCheckout from './checkout/PendingPaymentCheckout';
|
|
11
|
+
import UnconfirmedCheckout from './checkout/UnconfirmedCheckout';
|
|
12
|
+
const POLLING_STATUSES = new Set(['UNCONFIRMED', 'CONFIRMED', 'PENDING_PAYMENT']);
|
|
13
|
+
function CheckoutLayout({ title, description, children }) {
|
|
14
|
+
return (_jsxs("div", { className: "w-fit mx-auto", style: { width: '380px' }, children: [(title || description) && (_jsxs("div", { className: "text-center mb-6", children: [title && (_jsx("h2", { className: "text-2xl font-semibold text-white mb-2 font-sans tracking-tight", children: title })), description && (_jsx("p", { className: "text-gray-300", children: description }))] })), _jsx("div", { className: "bg-gray-800 rounded-2xl p-6 text-white font-sans", children: children }), _jsx("div", { className: "text-center mt-6", children: _jsxs("p", { className: "text-xs text-gray-500 font-sans", children: ["Powered by", ' ', _jsx("a", { href: "https://www.moneydevkit.com", target: "_blank", rel: "noopener noreferrer", className: "text-gray-400 hover:text-white transition-colors underline decoration-gray-600 hover:decoration-white", children: "moneydevkit" })] }) })] }));
|
|
15
|
+
}
|
|
16
|
+
function CheckoutInternal({ id, createParams, onSuccess, title, description }) {
|
|
17
|
+
// First, create checkout if needed (when createParams provided but no id)
|
|
18
|
+
const { data: createdCheckout, error: createError } = useQuery({
|
|
19
|
+
queryKey: ['mdk-create-checkout', createParams],
|
|
20
|
+
queryFn: () => createCheckout(createParams),
|
|
21
|
+
enabled: !id && !!createParams,
|
|
22
|
+
staleTime: Infinity, // Don't refetch creation
|
|
23
|
+
});
|
|
24
|
+
// Use the provided id or the id from the created checkout
|
|
25
|
+
const checkoutId = id || createdCheckout?.id;
|
|
26
|
+
const [isWindowVisible, setIsWindowVisible] = useState(() => {
|
|
27
|
+
if (typeof document === 'undefined') {
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
return document.visibilityState === 'visible';
|
|
31
|
+
});
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (typeof document === 'undefined' || typeof window === 'undefined') {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const handleVisibility = () => {
|
|
37
|
+
setIsWindowVisible(document.visibilityState === 'visible');
|
|
38
|
+
};
|
|
39
|
+
const handlePageHide = () => {
|
|
40
|
+
setIsWindowVisible(false);
|
|
41
|
+
};
|
|
42
|
+
document.addEventListener('visibilitychange', handleVisibility);
|
|
43
|
+
window.addEventListener('pagehide', handlePageHide);
|
|
44
|
+
return () => {
|
|
45
|
+
document.removeEventListener('visibilitychange', handleVisibility);
|
|
46
|
+
window.removeEventListener('pagehide', handlePageHide);
|
|
47
|
+
};
|
|
48
|
+
}, []);
|
|
49
|
+
// Fetch the checkout and keep polling until it reaches a terminal state.
|
|
50
|
+
const { data: checkout } = useQuery({
|
|
51
|
+
queryKey: ['mdk-checkout', checkoutId],
|
|
52
|
+
queryFn: () => getCheckout(checkoutId),
|
|
53
|
+
enabled: !!checkoutId,
|
|
54
|
+
refetchInterval: ({ state: { data } }) => {
|
|
55
|
+
if (!isWindowVisible) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
if (!data) {
|
|
59
|
+
return 1000;
|
|
60
|
+
}
|
|
61
|
+
const invoiceSettled = (data.invoice?.amountSatsReceived ?? 0) > 0;
|
|
62
|
+
if (!POLLING_STATUSES.has(data.status) || invoiceSettled) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
return 1000;
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
const paymentReceived = checkout?.status === 'PAYMENT_RECEIVED' ||
|
|
69
|
+
(checkout?.invoice?.amountSatsReceived ?? 0) > 0;
|
|
70
|
+
// Check for successUrl in checkout metadata
|
|
71
|
+
const successUrl = checkout?.userMetadata?.successUrl;
|
|
72
|
+
// Default onSuccess behavior: redirect to successUrl or /success
|
|
73
|
+
const handleSuccess = onSuccess || (() => {
|
|
74
|
+
window.location.href = successUrl || '/success';
|
|
75
|
+
});
|
|
76
|
+
// Handle creation errors
|
|
77
|
+
if (createError) {
|
|
78
|
+
return (_jsx("div", { className: "flex justify-center min-h-screen p-4 pt-8 bg-gradient-to-br from-slate-900 via-gray-900 to-slate-800", children: _jsx("div", { className: "w-full max-w-md", children: _jsx(CheckoutLayout, { title: "Error", description: "Failed to create checkout", children: _jsxs("div", { className: "text-center", children: [_jsx("div", { className: "text-red-400 mb-4", children: _jsx("svg", { className: "w-12 h-12 mx-auto mb-2", fill: "currentColor", viewBox: "0 0 20 20", children: _jsx("path", { fillRule: "evenodd", d: "M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7 4a1 1 0 11-2 0 1 1 0 012 0zm-1-9a1 1 0 00-1 1v4a1 1 0 102 0V6a1 1 0 00-1-1z", clipRule: "evenodd" }) }) }), _jsx("p", { className: "text-gray-300 mb-4", children: "Unable to create checkout session" }), _jsx("button", { onClick: () => window.history.back(), className: "bg-gray-700 hover:bg-gray-600 text-white px-4 py-2 rounded-md transition-colors", children: "Go Back" })] }) }) }) }));
|
|
79
|
+
}
|
|
80
|
+
if (!checkout) {
|
|
81
|
+
return (_jsx("div", { className: "flex items-center justify-center min-h-screen", children: _jsx("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-white" }) }));
|
|
82
|
+
}
|
|
83
|
+
const resolvedTitle = (() => {
|
|
84
|
+
if (title)
|
|
85
|
+
return title;
|
|
86
|
+
if (paymentReceived) {
|
|
87
|
+
return 'Payment Successful!';
|
|
88
|
+
}
|
|
89
|
+
switch (checkout.status) {
|
|
90
|
+
case 'UNCONFIRMED':
|
|
91
|
+
return 'Checkout';
|
|
92
|
+
case 'PENDING_PAYMENT':
|
|
93
|
+
return 'ImageMint';
|
|
94
|
+
case 'EXPIRED':
|
|
95
|
+
return 'Checkout Expired';
|
|
96
|
+
default:
|
|
97
|
+
return 'Checkout';
|
|
98
|
+
}
|
|
99
|
+
})();
|
|
100
|
+
const resolvedDescription = (() => {
|
|
101
|
+
if (description)
|
|
102
|
+
return description;
|
|
103
|
+
if (paymentReceived) {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
if (checkout.status === 'PENDING_PAYMENT') {
|
|
107
|
+
return checkout.userMetadata?.prompt ? `'${checkout.userMetadata.prompt}'` : undefined;
|
|
108
|
+
}
|
|
109
|
+
return undefined;
|
|
110
|
+
})();
|
|
111
|
+
return (_jsx("div", { className: "flex justify-center min-h-screen p-4 pt-8 bg-gradient-to-br from-slate-900 via-gray-900 to-slate-800", children: _jsx("div", { className: "w-full max-w-md", children: (() => {
|
|
112
|
+
if (paymentReceived) {
|
|
113
|
+
return (_jsx(CheckoutLayout, { title: resolvedTitle, description: resolvedDescription, children: _jsx(PaymentReceivedCheckout, { checkout: checkout, onSuccess: handleSuccess }) }));
|
|
114
|
+
}
|
|
115
|
+
switch (checkout.status) {
|
|
116
|
+
case 'UNCONFIRMED':
|
|
117
|
+
return (_jsx(CheckoutLayout, { title: resolvedTitle, description: resolvedDescription, children: _jsx(UnconfirmedCheckout, { checkout: checkout }) }));
|
|
118
|
+
case 'CONFIRMED':
|
|
119
|
+
return (_jsx(CheckoutLayout, { title: resolvedTitle, description: resolvedDescription, children: _jsxs("div", { className: "text-center", children: [_jsx("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-white mx-auto mb-4" }), _jsx("p", { className: "text-gray-300", children: "Generating invoice..." })] }) }));
|
|
120
|
+
case 'PENDING_PAYMENT':
|
|
121
|
+
return (_jsx(CheckoutLayout, { title: resolvedTitle, description: resolvedDescription, children: _jsx(PendingPaymentCheckout, { checkout: checkout }) }));
|
|
122
|
+
case 'EXPIRED':
|
|
123
|
+
return (_jsx(CheckoutLayout, { title: resolvedTitle, description: resolvedDescription, children: _jsx(ExpiredCheckout, { checkout: checkout }) }));
|
|
124
|
+
default:
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
})() }) }));
|
|
128
|
+
}
|
|
129
|
+
export function Checkout(props) {
|
|
130
|
+
return (_jsx(MdkCheckoutProvider, { children: _jsx(CheckoutInternal, { ...props }) }));
|
|
131
|
+
}
|
|
132
|
+
export default Checkout;
|
|
133
|
+
//# sourceMappingURL=Checkout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Checkout.js","sourceRoot":"","sources":["../../src/components/Checkout.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Checkout } from '@moneydevkit/api-contract';
|
|
2
|
+
type ExpiredCheckoutType = Extract<Checkout, {
|
|
3
|
+
status: 'EXPIRED';
|
|
4
|
+
}>;
|
|
5
|
+
export interface ExpiredCheckoutProps {
|
|
6
|
+
checkout: ExpiredCheckoutType;
|
|
7
|
+
onRestart?: () => void;
|
|
8
|
+
}
|
|
9
|
+
export default function ExpiredCheckout({ checkout, onRestart }: ExpiredCheckoutProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
export default function ExpiredCheckout({ checkout, onRestart }) {
|
|
4
|
+
const formatCurrency = (amount, currency) => {
|
|
5
|
+
return new Intl.NumberFormat('en-US', {
|
|
6
|
+
style: 'currency',
|
|
7
|
+
currency,
|
|
8
|
+
}).format(amount / 100);
|
|
9
|
+
};
|
|
10
|
+
const formatSats = (sats) => {
|
|
11
|
+
return new Intl.NumberFormat('en-US').format(sats);
|
|
12
|
+
};
|
|
13
|
+
const ClockIcon = () => (_jsxs("svg", { className: "w-12 h-12 text-red-500", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", strokeWidth: 2, children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("polyline", { points: "12,6 12,12 16,14" })] }));
|
|
14
|
+
const handleRestart = () => {
|
|
15
|
+
if (onRestart) {
|
|
16
|
+
onRestart();
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
window.location.reload();
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "text-center mb-6", children: [_jsx("div", { className: "bg-red-500/20 rounded-full w-20 h-20 flex items-center justify-center mx-auto mb-4", children: _jsx(ClockIcon, {}) }), _jsx("p", { className: "text-gray-300", children: "This checkout session has expired." })] }), _jsxs("div", { className: "bg-gray-700 rounded-lg p-4 mb-6", children: [_jsx("h3", { className: "text-sm text-center font-bold text-gray-300 mb-3", children: "Payment Details" }), _jsxs("div", { className: "space-y-2 text-sm", children: [_jsxs("div", { className: "flex justify-between", children: [_jsx("span", { className: "text-gray-400", children: "Amount Fiat:" }), _jsx("span", { className: "text-white font-medium", children: checkout.invoice?.fiatAmount && checkout.currency &&
|
|
23
|
+
formatCurrency(checkout.invoice.fiatAmount, checkout.currency) })] }), _jsxs("div", { className: "flex justify-between", children: [_jsx("span", { className: "text-gray-400", children: "Amount BTC:" }), _jsx("span", { className: "text-white font-medium", children: checkout.invoice?.amountSats && `${formatSats(checkout.invoice.amountSats)} sats` })] }), _jsxs("div", { className: "flex justify-between", children: [_jsx("span", { className: "text-gray-400", children: "Checkout ID:" }), _jsx("span", { className: "text-white font-medium", children: checkout.id })] })] })] }), _jsx("div", { className: "text-center mb-6", children: _jsx("p", { className: "text-gray-300", children: "Checkout sessions only last 15 minutes. Please restart the flow to proceed." }) }), _jsx("button", { onClick: handleRestart, className: "w-full bg-white hover:bg-gray-100 text-gray-900 font-medium py-3 px-4 rounded-lg transition-colors", children: "Restart" })] }));
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=ExpiredCheckout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExpiredCheckout.js","sourceRoot":"","sources":["../../../src/components/checkout/ExpiredCheckout.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AAWZ,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAwB;IACnF,MAAM,cAAc,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAE,EAAE;QAC1D,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;YACpC,KAAK,EAAE,UAAU;YACjB,QAAQ;SACT,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAA;IACzB,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE;QAClC,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACpD,CAAC,CAAA;IAED,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,CACtB,eAAK,SAAS,EAAC,wBAAwB,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,EAAC,WAAW,EAAE,CAAC,aAC1G,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,IAAI,GAAG,EACjC,mBAAU,MAAM,EAAC,kBAAkB,GAAG,IAClC,CACP,CAAA;IAED,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,EAAE,CAAA;QACb,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAA;QAC1B,CAAC;IACH,CAAC,CAAA;IAED,OAAO,CACL,8BACE,eAAK,SAAS,EAAC,kBAAkB,aAC/B,cAAK,SAAS,EAAC,oFAAoF,YACjG,KAAC,SAAS,KAAG,GACT,EAEN,YAAG,SAAS,EAAC,eAAe,mDAAuC,IAC/D,EAEN,eAAK,SAAS,EAAC,iCAAiC,aAC9C,aAAI,SAAS,EAAC,kDAAkD,gCAAqB,EAErF,eAAK,SAAS,EAAC,mBAAmB,aAChC,eAAK,SAAS,EAAC,sBAAsB,aACnC,eAAM,SAAS,EAAC,eAAe,6BAAoB,EACnD,eAAM,SAAS,EAAC,wBAAwB,YACrC,QAAQ,CAAC,OAAO,EAAE,UAAU,IAAI,QAAQ,CAAC,QAAQ;4CAChD,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAC3D,IACH,EAEN,eAAK,SAAS,EAAC,sBAAsB,aACnC,eAAM,SAAS,EAAC,eAAe,4BAAmB,EAClD,eAAM,SAAS,EAAC,wBAAwB,YACrC,QAAQ,CAAC,OAAO,EAAE,UAAU,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,GAC7E,IACH,EAEN,eAAK,SAAS,EAAC,sBAAsB,aACnC,eAAM,SAAS,EAAC,eAAe,6BAAoB,EACnD,eAAM,SAAS,EAAC,wBAAwB,YAAE,QAAQ,CAAC,EAAE,GAAQ,IACzD,IACF,IACF,EAEN,cAAK,SAAS,EAAC,kBAAkB,YAC/B,YAAG,SAAS,EAAC,eAAe,4FAAgF,GACxG,EAEN,iBACE,OAAO,EAAE,aAAa,EACtB,SAAS,EAAC,oGAAoG,wBAGvG,IACR,CACJ,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Checkout } from '@moneydevkit/api-contract';
|
|
2
|
+
export interface PaymentReceivedCheckoutProps {
|
|
3
|
+
checkout: Checkout;
|
|
4
|
+
onSuccess?: (checkout: Checkout) => void;
|
|
5
|
+
}
|
|
6
|
+
export default function PaymentReceivedCheckout({ checkout, onSuccess }: PaymentReceivedCheckoutProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
export default function PaymentReceivedCheckout({ checkout, onSuccess }) {
|
|
4
|
+
const formatCurrency = (amount, currency) => {
|
|
5
|
+
return new Intl.NumberFormat('en-US', {
|
|
6
|
+
style: 'currency',
|
|
7
|
+
currency,
|
|
8
|
+
}).format(amount / 100);
|
|
9
|
+
};
|
|
10
|
+
const formatSats = (sats) => {
|
|
11
|
+
return new Intl.NumberFormat('en-US', {
|
|
12
|
+
minimumFractionDigits: 0,
|
|
13
|
+
maximumFractionDigits: 3,
|
|
14
|
+
}).format(sats);
|
|
15
|
+
};
|
|
16
|
+
const handleContinue = () => {
|
|
17
|
+
if (onSuccess) {
|
|
18
|
+
onSuccess(checkout);
|
|
19
|
+
}
|
|
20
|
+
else if (checkout.successUrl) {
|
|
21
|
+
window.location.href = checkout.successUrl;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const CheckmarkIcon = () => (_jsx("svg", { className: "w-12 h-12 text-green-500", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }));
|
|
25
|
+
const satsReceived = checkout.invoice?.amountSatsReceived
|
|
26
|
+
? checkout.invoice.amountSatsReceived / 1000
|
|
27
|
+
: undefined;
|
|
28
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "text-center mb-6", children: [_jsx("div", { className: "bg-green-500/20 rounded-full w-20 h-20 flex items-center justify-center mx-auto mb-4", children: _jsx(CheckmarkIcon, {}) }), _jsx("p", { className: "text-gray-300", children: "Your payment has been received." })] }), _jsxs("div", { className: "bg-gray-700 rounded-lg p-4 mb-6", children: [_jsx("h3", { className: "text-sm text-center font-bold text-gray-300 mb-3", children: "Payment Details" }), _jsxs("div", { className: "space-y-2 text-sm", children: [_jsxs("div", { className: "flex justify-between", children: [_jsx("span", { className: "text-gray-400", children: "Amount Fiat:" }), _jsx("span", { className: "text-white font-medium", children: checkout.invoice?.fiatAmount && checkout.currency &&
|
|
29
|
+
formatCurrency(checkout.invoice.fiatAmount, checkout.currency) })] }), _jsxs("div", { className: "flex justify-between", children: [_jsx("span", { className: "text-gray-400", children: "Amount BTC:" }), _jsx("span", { className: "text-white font-medium", children: satsReceived !== undefined && `${formatSats(satsReceived)} sats` })] }), _jsxs("div", { className: "flex justify-between", children: [_jsx("span", { className: "text-gray-400", children: "Checkout ID:" }), _jsx("span", { className: "text-white font-medium", children: checkout.id })] })] })] }), _jsx("div", { className: "text-center text-xs text-gray-400 mt-6 mb-6", children: _jsx("p", { children: "Thank you for your business!" }) }), _jsx("div", { className: "text-center mb-4", children: _jsx("button", { onClick: handleContinue, className: "w-full bg-white hover:bg-gray-200 text-black font-medium py-3 px-4 rounded-lg transition-colors", children: "Continue" }) })] }));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=PaymentReceivedCheckout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PaymentReceivedCheckout.js","sourceRoot":"","sources":["../../../src/components/checkout/PaymentReceivedCheckout.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;AASZ,MAAM,CAAC,OAAO,UAAU,uBAAuB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAgC;IACnG,MAAM,cAAc,GAAG,CAAC,MAAc,EAAE,QAAgB,EAAE,EAAE;QAC1D,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;YACpC,KAAK,EAAE,UAAU;YACjB,QAAQ;SACT,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAA;IACzB,CAAC,CAAA;IAED,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE;QAClC,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;YACpC,qBAAqB,EAAE,CAAC;YACxB,qBAAqB,EAAE,CAAC;SACzB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACjB,CAAC,CAAA;IAED,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CAAC,QAAQ,CAAC,CAAA;QACrB,CAAC;aAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC/B,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAA;QAC5C,CAAC;IACH,CAAC,CAAA;IAED,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,CAC1B,cAAK,SAAS,EAAC,0BAA0B,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,YAC7F,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAC,gBAAgB,GAAG,GACpF,CACP,CAAA;IAED,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,EAAE,kBAAkB;QACvD,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,kBAAkB,GAAG,IAAI;QAC5C,CAAC,CAAC,SAAS,CAAA;IAEb,OAAO,CACL,8BACE,eAAK,SAAS,EAAC,kBAAkB,aAC/B,cAAK,SAAS,EAAC,sFAAsF,YACnG,KAAC,aAAa,KAAG,GACb,EACN,YAAG,SAAS,EAAC,eAAe,gDAAoC,IAC5D,EAEN,eAAK,SAAS,EAAC,iCAAiC,aAC9C,aAAI,SAAS,EAAC,kDAAkD,gCAAqB,EAErF,eAAK,SAAS,EAAC,mBAAmB,aAChC,eAAK,SAAS,EAAC,sBAAsB,aACnC,eAAM,SAAS,EAAC,eAAe,6BAAoB,EACnD,eAAM,SAAS,EAAC,wBAAwB,YACrC,QAAQ,CAAC,OAAO,EAAE,UAAU,IAAI,QAAQ,CAAC,QAAQ;4CAChD,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAC3D,IACH,EAEN,eAAK,SAAS,EAAC,sBAAsB,aACnC,eAAM,SAAS,EAAC,eAAe,4BAAmB,EAClD,eAAM,SAAS,EAAC,wBAAwB,YACrC,YAAY,KAAK,SAAS,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC,OAAO,GAC5D,IACH,EAEN,eAAK,SAAS,EAAC,sBAAsB,aACnC,eAAM,SAAS,EAAC,eAAe,6BAAoB,EACnD,eAAM,SAAS,EAAC,wBAAwB,YAAE,QAAQ,CAAC,EAAE,GAAQ,IACzD,IACF,IACF,EAEN,cAAK,SAAS,EAAC,6CAA6C,YAC1D,uDAAmC,GAC/B,EAEN,cAAK,SAAS,EAAC,kBAAkB,YAC/B,iBACE,OAAO,EAAE,cAAc,EACvB,SAAS,EAAC,iGAAiG,yBAGpG,GACL,IACL,CACJ,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Checkout } from '@moneydevkit/api-contract';
|
|
2
|
+
type PendingPaymentCheckoutType = Extract<Checkout, {
|
|
3
|
+
status: 'PENDING_PAYMENT';
|
|
4
|
+
}>;
|
|
5
|
+
export interface PendingPaymentCheckoutProps {
|
|
6
|
+
checkout: PendingPaymentCheckoutType;
|
|
7
|
+
}
|
|
8
|
+
export default function PendingPaymentCheckout({ checkout }: PendingPaymentCheckoutProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { ChevronDown } from 'lucide-react';
|
|
4
|
+
import { useEffect, useState } from 'react';
|
|
5
|
+
import { QRCodeSVG } from 'qrcode.react';
|
|
6
|
+
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from '../ui/collapsible';
|
|
7
|
+
import { payInvoice } from '../../server/actions';
|
|
8
|
+
export default function PendingPaymentCheckout({ checkout }) {
|
|
9
|
+
const [timeRemaining, setTimeRemaining] = useState('');
|
|
10
|
+
const [copySuccess, setCopySuccess] = useState(false);
|
|
11
|
+
const [detailsOpen, setDetailsOpen] = useState(false);
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
const updateTimer = () => {
|
|
14
|
+
if (!checkout.invoice?.expiresAt)
|
|
15
|
+
return;
|
|
16
|
+
const now = new Date().getTime();
|
|
17
|
+
const expiry = new Date(checkout.invoice.expiresAt).getTime();
|
|
18
|
+
const diff = expiry - now;
|
|
19
|
+
if (diff <= 0) {
|
|
20
|
+
setTimeRemaining('Expired');
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const minutes = Math.floor(diff / (1000 * 60));
|
|
24
|
+
const seconds = Math.floor((diff % (1000 * 60)) / 1000);
|
|
25
|
+
setTimeRemaining(`${minutes}:${seconds.toString().padStart(2, '0')}`);
|
|
26
|
+
};
|
|
27
|
+
updateTimer();
|
|
28
|
+
const interval = setInterval(updateTimer, 1000);
|
|
29
|
+
return () => clearInterval(interval);
|
|
30
|
+
}, [checkout.invoice?.expiresAt]);
|
|
31
|
+
const formatCurrency = (amount, currency) => {
|
|
32
|
+
return new Intl.NumberFormat('en-US', {
|
|
33
|
+
style: 'currency',
|
|
34
|
+
currency,
|
|
35
|
+
}).format(amount / 100);
|
|
36
|
+
};
|
|
37
|
+
const formatSats = (sats) => {
|
|
38
|
+
return new Intl.NumberFormat('en-US').format(sats);
|
|
39
|
+
};
|
|
40
|
+
const openInWallet = async () => {
|
|
41
|
+
if (checkout.invoice?.paymentHash && checkout.invoiceAmountSats) {
|
|
42
|
+
await payInvoice(checkout.invoice.paymentHash, checkout.invoiceAmountSats);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const copyToClipboard = async () => {
|
|
46
|
+
if (checkout.invoice?.invoice) {
|
|
47
|
+
try {
|
|
48
|
+
await navigator.clipboard.writeText(checkout.invoice.invoice);
|
|
49
|
+
setCopySuccess(true);
|
|
50
|
+
setTimeout(() => setCopySuccess(false), 2000);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
console.error('Failed to copy invoice:', error);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const truncateInvoice = (invoice, maxLength = 40) => {
|
|
58
|
+
if (invoice.length <= maxLength)
|
|
59
|
+
return invoice;
|
|
60
|
+
const start = Math.floor((maxLength - 3) / 2);
|
|
61
|
+
const end = Math.ceil((maxLength - 3) / 2);
|
|
62
|
+
return `${invoice.slice(0, start)}...${invoice.slice(-end)}`;
|
|
63
|
+
};
|
|
64
|
+
const CopyIcon = () => (_jsx("svg", { className: "w-4 h-4 text-gray-400 hover:text-white cursor-pointer transition-colors", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" }) }));
|
|
65
|
+
const CheckmarkIcon = () => (_jsx("svg", { className: "w-4 h-4 text-green-500 cursor-pointer transition-colors", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M5 13l4 4L19 7" }) }));
|
|
66
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "text-center mb-6 w-full", children: [_jsx("div", { className: "mb-4 w-full", children: _jsx("div", { className: "text-2xl font-semibold mb-2 font-sans tracking-tight", children: checkout.invoice?.amountSats && `${formatSats(checkout.invoice.amountSats)} sats` }) }), _jsx("div", { className: "w-full", children: _jsxs(Collapsible, { open: detailsOpen, onOpenChange: setDetailsOpen, children: [_jsxs(CollapsibleTrigger, { className: "flex items-center justify-center gap-2 text-gray-400 hover:text-white transition-colors text-sm w-full font-medium", children: ["View Details", _jsx(ChevronDown, { className: `w-4 h-4 transition-transform duration-300 ease-in-out ${detailsOpen ? 'rotate-180' : ''}` })] }), _jsx(CollapsibleContent, { className: "w-full overflow-hidden transition-all duration-300 ease-in-out data-[state=closed]:animate-[collapsible-up_300ms_ease-in-out] data-[state=open]:animate-[collapsible-down_300ms_ease-in-out]", children: _jsxs("div", { className: "mt-4 space-y-3 text-sm w-full", children: [_jsxs("div", { className: "flex justify-between w-full", children: [_jsx("span", { className: "text-gray-400", children: "Total Fiat" }), _jsx("span", { className: "text-white", children: checkout.invoice?.fiatAmount && checkout.currency &&
|
|
67
|
+
formatCurrency(checkout.invoice.fiatAmount, checkout.currency) })] }), _jsxs("div", { className: "flex justify-between w-full", children: [_jsx("span", { className: "text-gray-400", children: "Exchange Rate" }), _jsx("span", { className: "text-white", children: checkout.invoice?.btcPrice && `$${new Intl.NumberFormat('en-US').format(checkout.invoice.btcPrice)}` })] }), timeRemaining && (_jsxs("div", { className: "flex justify-between w-full", children: [_jsx("span", { className: "text-gray-400", children: "Expires in" }), _jsx("span", { className: "text-white", children: timeRemaining })] }))] }) })] }) })] }), _jsx("div", { className: "flex justify-center mb-4 w-full", children: _jsx("div", { className: "bg-white p-3 rounded-lg shadow cursor-pointer hover:shadow-lg transition-shadow", onClick: copyToClipboard, title: "Click to copy invoice", children: _jsx(QRCodeSVG, { value: checkout.invoice?.invoice ?? '', size: 320, bgColor: "#ffffff", fgColor: "#000000", level: "Q" }) }) }), checkout.invoice?.invoice && (_jsxs("div", { className: "flex items-center gap-2 mb-6 bg-gray-700 p-3 rounded-lg w-full", children: [_jsx("code", { className: "text-xs text-gray-300 font-mono flex-1 text-center min-w-0", children: truncateInvoice(checkout.invoice.invoice) }), _jsx("div", { onClick: copyToClipboard, title: "Copy invoice", className: "flex-shrink-0", children: copySuccess ? _jsx(CheckmarkIcon, {}) : _jsx(CopyIcon, {}) })] })), _jsx("div", { className: "w-full mb-6", children: _jsx("button", { onClick: openInWallet, className: "w-full bg-white hover:bg-gray-100 text-black font-medium py-3 px-4 rounded-lg transition-colors border border-gray-200", children: "Pay in Wallet" }) })] }));
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=PendingPaymentCheckout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PendingPaymentCheckout.js","sourceRoot":"","sources":["../../../src/components/checkout/PendingPaymentCheckout.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Checkout } from '@moneydevkit/api-contract';
|
|
2
|
+
type UnconfirmedCheckoutType = Extract<Checkout, {
|
|
3
|
+
status: 'UNCONFIRMED';
|
|
4
|
+
}>;
|
|
5
|
+
export interface UnconfirmedCheckoutProps {
|
|
6
|
+
checkout: UnconfirmedCheckoutType;
|
|
7
|
+
}
|
|
8
|
+
export default function UnconfirmedCheckout({ checkout }: UnconfirmedCheckoutProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { zodResolver } from '@hookform/resolvers/zod';
|
|
4
|
+
import { useMutation, useQueryClient } from '@tanstack/react-query';
|
|
5
|
+
import { useForm } from 'react-hook-form';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { confirmCheckout } from '../../server/actions';
|
|
8
|
+
import { Button } from '../ui/button';
|
|
9
|
+
import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '../ui/form';
|
|
10
|
+
import { Input } from '../ui/input';
|
|
11
|
+
const CustomerFormSchema = z.object({
|
|
12
|
+
customerEmail: z.string().email('Please enter a valid email address').optional(),
|
|
13
|
+
customerName: z.string().optional(),
|
|
14
|
+
});
|
|
15
|
+
export default function UnconfirmedCheckout({ checkout }) {
|
|
16
|
+
const queryClient = useQueryClient();
|
|
17
|
+
const needsEmail = checkout.requireCustomerFields?.customerEmail && !checkout.customerEmail;
|
|
18
|
+
const needsName = checkout.requireCustomerFields?.customerName && !checkout.customerName;
|
|
19
|
+
const form = useForm({
|
|
20
|
+
resolver: zodResolver(CustomerFormSchema),
|
|
21
|
+
defaultValues: {
|
|
22
|
+
customerEmail: checkout.customerEmail || '',
|
|
23
|
+
customerName: checkout.customerName || '',
|
|
24
|
+
},
|
|
25
|
+
});
|
|
26
|
+
const confirmMutation = useMutation({
|
|
27
|
+
mutationFn: async (data) => {
|
|
28
|
+
return await confirmCheckout({
|
|
29
|
+
checkoutId: checkout.id,
|
|
30
|
+
customerEmail: data.customerEmail || undefined,
|
|
31
|
+
customerName: data.customerName || undefined,
|
|
32
|
+
});
|
|
33
|
+
},
|
|
34
|
+
onSuccess: () => {
|
|
35
|
+
queryClient.invalidateQueries({ queryKey: ['mdk-checkout', checkout.id] });
|
|
36
|
+
},
|
|
37
|
+
onError: (error) => {
|
|
38
|
+
form.setError('root', {
|
|
39
|
+
message: error instanceof Error ? error.message : 'Something went wrong',
|
|
40
|
+
});
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
const onSubmit = (data) => {
|
|
44
|
+
confirmMutation.mutate(data);
|
|
45
|
+
};
|
|
46
|
+
const formatCurrency = (amount, currency) => {
|
|
47
|
+
return new Intl.NumberFormat('en-US', {
|
|
48
|
+
style: 'currency',
|
|
49
|
+
currency,
|
|
50
|
+
}).format(amount / 100);
|
|
51
|
+
};
|
|
52
|
+
return (_jsxs(_Fragment, { children: [_jsxs("div", { className: "text-center mb-6", children: [checkout.type === 'PRODUCTS' && checkout.products && (_jsx("div", { className: "space-y-2", children: checkout.products.map((product) => (_jsxs("div", { className: "text-left", children: [_jsx("h3", { className: "font-medium text-white", children: product.name }), product.description && _jsx("p", { className: "text-sm text-gray-400", children: product.description }), product.prices.map((price) => (_jsxs("div", { className: "text-sm text-gray-300", children: [price.amountType === 'FIXED' && price.priceAmount && (_jsx("span", { children: formatCurrency(price.priceAmount, checkout.currency) })), product.recurringInterval && (_jsxs("span", { className: "text-gray-400", children: ["/", product.recurringInterval.toLowerCase()] }))] }, price.id)))] }, product.id))) })), checkout.type === 'AMOUNT' && checkout.providedAmount && (_jsx("div", { className: "text-sm font-medium text-white" })), checkout.type === 'TOP_UP' && _jsx("div", { className: "text-lg text-white", children: "Account Top-up" })] }), _jsx(Form, { ...form, children: _jsxs("form", { onSubmit: form.handleSubmit(onSubmit), className: "space-y-4", children: [needsEmail && (_jsx(FormField, { control: form.control, name: "customerEmail", render: ({ field }) => (_jsxs(FormItem, { children: [_jsx(FormLabel, { className: "text-gray-300", children: "Email Address *" }), _jsx(FormControl, { children: _jsx(Input, { ...field, type: "email", placeholder: "Enter your email", className: "bg-gray-700 border-gray-600 focus:ring-purple-500 focus:border-purple-500 text-white placeholder-gray-400" }) }), _jsx(FormMessage, {})] })) })), needsName && (_jsx(FormField, { control: form.control, name: "customerName", render: ({ field }) => (_jsxs(FormItem, { children: [_jsx(FormLabel, { className: "text-gray-300", children: "Full Name *" }), _jsx(FormControl, { children: _jsx(Input, { ...field, type: "text", placeholder: "Enter your full name", className: "bg-gray-700 border-gray-600 focus:ring-purple-500 focus:border-purple-500 text-white placeholder-gray-400" }) }), _jsx(FormMessage, {})] })) })), form.formState.errors.root && (_jsxs("div", { className: "text-red-400 text-sm", children: ["Error: ", form.formState.errors.root.message] })), _jsx(Button, { type: "submit", disabled: form.formState.isSubmitting || confirmMutation.isPending, className: "w-full bg-white hover:bg-gray-100 text-black font-medium py-3 px-4 rounded-lg transition-colors border border-gray-200", children: form.formState.isSubmitting || confirmMutation.isPending ? (_jsxs("div", { className: "flex items-center justify-center", children: [_jsx("div", { className: "animate-spin rounded-full h-4 w-4 border-b-2 border-white mr-2" }), "Generating invoice..."] })) : ('Proceed to Payment') })] }) })] }));
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=UnconfirmedCheckout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UnconfirmedCheckout.js","sourceRoot":"","sources":["../../../src/components/checkout/UnconfirmedCheckout.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { type VariantProps } from "class-variance-authority";
|
|
3
|
+
declare const buttonVariants: (props?: ({
|
|
4
|
+
variant?: "link" | "default" | "destructive" | "outline" | "secondary" | "ghost" | null | undefined;
|
|
5
|
+
size?: "default" | "sm" | "lg" | "icon" | null | undefined;
|
|
6
|
+
} & import("class-variance-authority/types").ClassProp) | undefined) => string;
|
|
7
|
+
declare function Button({ className, variant, size, asChild, ...props }: React.ComponentProps<"button"> & VariantProps<typeof buttonVariants> & {
|
|
8
|
+
asChild?: boolean;
|
|
9
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export { Button, buttonVariants };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Slot } from "@radix-ui/react-slot";
|
|
3
|
+
import { cva } from "class-variance-authority";
|
|
4
|
+
import { cn } from "../../lib/utils";
|
|
5
|
+
const buttonVariants = cva("inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", {
|
|
6
|
+
variants: {
|
|
7
|
+
variant: {
|
|
8
|
+
default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
|
|
9
|
+
destructive: "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
|
|
10
|
+
outline: "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
|
|
11
|
+
secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
|
|
12
|
+
ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
|
|
13
|
+
link: "text-primary underline-offset-4 hover:underline",
|
|
14
|
+
},
|
|
15
|
+
size: {
|
|
16
|
+
default: "h-9 px-4 py-2 has-[>svg]:px-3",
|
|
17
|
+
sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
|
|
18
|
+
lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
|
|
19
|
+
icon: "size-9",
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
defaultVariants: {
|
|
23
|
+
variant: "default",
|
|
24
|
+
size: "default",
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
function Button({ className, variant, size, asChild = false, ...props }) {
|
|
28
|
+
const Comp = asChild ? Slot : "button";
|
|
29
|
+
return (_jsx(Comp, { "data-slot": "button", className: cn(buttonVariants({ variant, size, className })), ...props }));
|
|
30
|
+
}
|
|
31
|
+
export { Button, buttonVariants };
|
|
32
|
+
//# sourceMappingURL=button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.js","sourceRoot":"","sources":["../../../src/components/ui/button.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAC3C,OAAO,EAAE,GAAG,EAAqB,MAAM,0BAA0B,CAAA;AAEjE,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AAEpC,MAAM,cAAc,GAAG,GAAG,CACxB,6bAA6b,EAC7b;IACE,QAAQ,EAAE;QACR,OAAO,EAAE;YACP,OAAO,EACL,kEAAkE;YACpE,WAAW,EACT,6JAA6J;YAC/J,OAAO,EACL,uIAAuI;YACzI,SAAS,EACP,wEAAwE;YAC1E,KAAK,EACH,sEAAsE;YACxE,IAAI,EAAE,iDAAiD;SACxD;QACD,IAAI,EAAE;YACJ,OAAO,EAAE,+BAA+B;YACxC,EAAE,EAAE,+CAA+C;YACnD,EAAE,EAAE,sCAAsC;YAC1C,IAAI,EAAE,QAAQ;SACf;KACF;IACD,eAAe,EAAE;QACf,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,SAAS;KAChB;CACF,CACF,CAAA;AAED,SAAS,MAAM,CAAC,EACd,SAAS,EACT,OAAO,EACP,IAAI,EACJ,OAAO,GAAG,KAAK,EACf,GAAG,KAAK,EAIP;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAA;IAEtC,OAAO,CACL,KAAC,IAAI,iBACO,QAAQ,EAClB,SAAS,EAAE,EAAE,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,KACvD,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
declare function Card({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
declare function CardHeader({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
declare function CardTitle({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
declare function CardDescription({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
declare function CardAction({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
declare function CardContent({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
declare function CardFooter({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent, };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from "../../lib/utils";
|
|
3
|
+
function Card({ className, ...props }) {
|
|
4
|
+
return (_jsx("div", { "data-slot": "card", className: cn("bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm", className), ...props }));
|
|
5
|
+
}
|
|
6
|
+
function CardHeader({ className, ...props }) {
|
|
7
|
+
return (_jsx("div", { "data-slot": "card-header", className: cn("@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6", className), ...props }));
|
|
8
|
+
}
|
|
9
|
+
function CardTitle({ className, ...props }) {
|
|
10
|
+
return (_jsx("div", { "data-slot": "card-title", className: cn("leading-none font-semibold", className), ...props }));
|
|
11
|
+
}
|
|
12
|
+
function CardDescription({ className, ...props }) {
|
|
13
|
+
return (_jsx("div", { "data-slot": "card-description", className: cn("text-muted-foreground text-sm", className), ...props }));
|
|
14
|
+
}
|
|
15
|
+
function CardAction({ className, ...props }) {
|
|
16
|
+
return (_jsx("div", { "data-slot": "card-action", className: cn("col-start-2 row-span-2 row-start-1 self-start justify-self-end", className), ...props }));
|
|
17
|
+
}
|
|
18
|
+
function CardContent({ className, ...props }) {
|
|
19
|
+
return (_jsx("div", { "data-slot": "card-content", className: cn("px-6", className), ...props }));
|
|
20
|
+
}
|
|
21
|
+
function CardFooter({ className, ...props }) {
|
|
22
|
+
return (_jsx("div", { "data-slot": "card-footer", className: cn("flex items-center px-6 [.border-t]:pt-6", className), ...props }));
|
|
23
|
+
}
|
|
24
|
+
export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent, };
|
|
25
|
+
//# sourceMappingURL=card.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card.js","sourceRoot":"","sources":["../../../src/components/ui/card.tsx"],"names":[],"mappings":";AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,iBAAiB,CAAA;AAEpC,SAAS,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA+B;IAChE,OAAO,CACL,2BACY,MAAM,EAChB,SAAS,EAAE,EAAE,CACX,mFAAmF,EACnF,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA+B;IACtE,OAAO,CACL,2BACY,aAAa,EACvB,SAAS,EAAE,EAAE,CACX,4JAA4J,EAC5J,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,SAAS,SAAS,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA+B;IACrE,OAAO,CACL,2BACY,YAAY,EACtB,SAAS,EAAE,EAAE,CAAC,4BAA4B,EAAE,SAAS,CAAC,KAClD,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,SAAS,eAAe,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA+B;IAC3E,OAAO,CACL,2BACY,kBAAkB,EAC5B,SAAS,EAAE,EAAE,CAAC,+BAA+B,EAAE,SAAS,CAAC,KACrD,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA+B;IACtE,OAAO,CACL,2BACY,aAAa,EACvB,SAAS,EAAE,EAAE,CACX,gEAAgE,EAChE,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA+B;IACvE,OAAO,CACL,2BACY,cAAc,EACxB,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,KAC5B,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAA+B;IACtE,OAAO,CACL,2BACY,aAAa,EACvB,SAAS,EAAE,EAAE,CAAC,yCAAyC,EAAE,SAAS,CAAC,KAC/D,KAAK,GACT,CACH,CAAA;AACH,CAAC;AAED,OAAO,EACL,IAAI,EACJ,UAAU,EACV,UAAU,EACV,SAAS,EACT,UAAU,EACV,eAAe,EACf,WAAW,GACZ,CAAA"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import * as CollapsiblePrimitive from "@radix-ui/react-collapsible";
|
|
2
|
+
declare function Collapsible({ ...props }: React.ComponentProps<typeof CollapsiblePrimitive.Root>): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
declare function CollapsibleTrigger({ ...props }: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleTrigger>): import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
declare function CollapsibleContent({ ...props }: React.ComponentProps<typeof CollapsiblePrimitive.CollapsibleContent>): import("react/jsx-runtime").JSX.Element;
|
|
5
|
+
export { Collapsible, CollapsibleTrigger, CollapsibleContent };
|