@moneydevkit/replit 0.7.0-beta.0 → 0.7.0-beta.10

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 CHANGED
@@ -34,26 +34,40 @@ Trigger a checkout from your client code (the checkout component pulls in its ow
34
34
  ```tsx
35
35
  // src/App.tsx
36
36
  import { useCheckout } from '@moneydevkit/replit'
37
+ import { useState } from 'react'
37
38
 
38
39
  export default function App() {
39
- const { navigate, isNavigating } = useCheckout()
40
+ const { createCheckout, isLoading } = useCheckout()
41
+ const [error, setError] = useState<string | null>(null)
42
+
43
+ const handlePurchase = async () => {
44
+ setError(null)
45
+
46
+ const result = await createCheckout({
47
+ type: 'AMOUNT', // or 'PRODUCTS' for product-based checkouts
48
+ title: 'Purchase title for the buyer',
49
+ description: 'Description of the purchase',
50
+ amount: 500,
51
+ currency: 'USD',
52
+ successUrl: '/checkout/success',
53
+ metadata: { name: 'John Doe' },
54
+ })
55
+
56
+ if (result.error) {
57
+ setError(result.error.message)
58
+ return
59
+ }
60
+
61
+ window.location.href = result.data.checkoutUrl
62
+ }
40
63
 
41
64
  return (
42
- <button
43
- onClick={() =>
44
- navigate({
45
- title: 'Purchase title for the buyer',
46
- description: 'Description of the purchase',
47
- amount: 500,
48
- currency: 'USD',
49
- successUrl: '/checkout/success',
50
- metadata: { name: 'John Doe' },
51
- })
52
- }
53
- disabled={isNavigating}
54
- >
55
- {isNavigating ? 'Creating checkout…' : 'Buy Now'}
56
- </button>
65
+ <div>
66
+ {error && <p style={{ color: 'red' }}>{error}</p>}
67
+ <button onClick={handlePurchase} disabled={isLoading}>
68
+ {isLoading ? 'Creating checkout…' : 'Buy Now'}
69
+ </button>
70
+ </div>
57
71
  )
58
72
  }
59
73
  ```
@@ -72,7 +86,8 @@ export default function CheckoutPage({ params }: { params: { id: string } }) {
72
86
  Collect and store customer information with each checkout. Pass `customer` to pre-fill data and `requireCustomerData` to prompt the user for specific fields:
73
87
 
74
88
  ```tsx
75
- navigate({
89
+ const result = await createCheckout({
90
+ type: 'AMOUNT',
76
91
  title: "Premium Plan",
77
92
  description: 'Monthly subscription',
78
93
  amount: 1000,
@@ -105,7 +120,8 @@ Customers are matched by `email` or `externalId`. When a match is found:
105
120
  When your user is already authenticated in your app, pass `externalId` to link checkouts to their account:
106
121
 
107
122
  ```tsx
108
- navigate({
123
+ const result = await createCheckout({
124
+ type: 'AMOUNT',
109
125
  title: "Premium Plan",
110
126
  description: 'Monthly subscription',
111
127
  amount: 1000,
@@ -126,7 +142,58 @@ When `externalId` is provided:
126
142
  - Only fields missing from the customer record are requested
127
143
  - This prevents authenticated users from being asked for data you already have
128
144
 
129
- Verify successful payments:
145
+ ## Product Checkouts
146
+ Sell products defined in your Money Dev Kit dashboard using `type: 'PRODUCTS'`:
147
+
148
+ ```tsx
149
+ import { useCheckout, useProducts } from '@moneydevkit/replit'
150
+
151
+ function ProductPage() {
152
+ const { createCheckout, isLoading } = useCheckout()
153
+ const { products } = useProducts()
154
+
155
+ const handleBuyProduct = async (productId: string) => {
156
+ const result = await createCheckout({
157
+ type: 'PRODUCTS',
158
+ product: productId,
159
+ successUrl: '/checkout/success',
160
+ })
161
+
162
+ if (result.error) return
163
+ window.location.href = result.data.checkoutUrl
164
+ }
165
+
166
+ return (
167
+ <div>
168
+ {products?.map(product => (
169
+ <button key={product.id} onClick={() => handleBuyProduct(product.id)}>
170
+ Buy {product.name} - ${(product.price?.priceAmount ?? 0) / 100}
171
+ </button>
172
+ ))}
173
+ </div>
174
+ )
175
+ }
176
+ ```
177
+
178
+ ### Checkout Types
179
+ - **`type: 'AMOUNT'`** - For donations, tips, or custom amounts. Requires `amount` field.
180
+ - **`type: 'PRODUCTS'`** - For selling products. Requires `product` field with a product ID. Amount is calculated from product price.
181
+
182
+ ### Pay What You Want (CUSTOM prices)
183
+ Products can have CUSTOM prices that let customers choose their own amount. When a checkout includes a product with a CUSTOM price, the checkout UI automatically shows an amount input field:
184
+
185
+ ```tsx
186
+ // Create a checkout for a product with CUSTOM pricing
187
+ const result = await createCheckout({
188
+ type: 'PRODUCTS',
189
+ product: customPriceProductId, // Product configured with CUSTOM price in dashboard
190
+ successUrl: '/checkout/success',
191
+ })
192
+ ```
193
+
194
+ The customer enters their desired amount during checkout. For USD, amounts are in dollars (converted to cents internally). For SAT, amounts are in satoshis.
195
+
196
+ ## Verify successful payments
130
197
  ```tsx
131
198
  import { useCheckoutSuccess } from '@moneydevkit/replit'
132
199
 
@@ -0,0 +1 @@
1
+ export { useProducts } from '@moneydevkit/core/client';
@@ -0,0 +1,3 @@
1
+ 'use client';
2
+ export { useProducts } from '@moneydevkit/core/client';
3
+ //# sourceMappingURL=useProducts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useProducts.js","sourceRoot":"","sources":["../../src/hooks/useProducts.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA"}
package/dist/index.d.ts CHANGED
@@ -2,3 +2,5 @@ export { Checkout } from './components/Checkout';
2
2
  export type { CheckoutProps } from './components/Checkout';
3
3
  export { useCheckout } from './hooks/useCheckout';
4
4
  export { useCheckoutSuccess } from './hooks/useCheckoutSuccess';
5
+ export { useProducts } from './hooks/useProducts';
6
+ export type { MdkError, Result } from '@moneydevkit/core/client';
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { Checkout } from './components/Checkout';
2
2
  export { useCheckout } from './hooks/useCheckout';
3
3
  export { useCheckoutSuccess } from './hooks/useCheckoutSuccess';
4
+ export { useProducts } from './hooks/useProducts';
4
5
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA"}
@@ -1,4 +1,7 @@
1
1
  import type { RequestHandler, Router } from 'express';
2
+ export { createCheckoutUrl } from '@moneydevkit/core/route';
3
+ export type { CreateCheckoutUrlOptions } from '@moneydevkit/core/route';
2
4
  export declare const mdkExpressHandler: RequestHandler;
5
+ export declare const mdkExpressGetHandler: RequestHandler;
3
6
  export declare function createMdkExpressRouter(): Router;
4
7
  export default createMdkExpressRouter;
@@ -1,5 +1,7 @@
1
1
  import express from 'express';
2
- import { createUnifiedHandler } from '@moneydevkit/core/route';
2
+ import { createUnifiedHandler, GET as getHandler } from '@moneydevkit/core/route';
3
+ // Re-export createCheckoutUrl for server-side URL generation
4
+ export { createCheckoutUrl } from '@moneydevkit/core/route';
3
5
  const unifiedHandler = createUnifiedHandler();
4
6
  function toFetchRequest(req) {
5
7
  const protocol = req.protocol || 'http';
@@ -46,9 +48,29 @@ export const mdkExpressHandler = async (req, res) => {
46
48
  res.status(500).send('Internal Server Error');
47
49
  }
48
50
  };
51
+ export const mdkExpressGetHandler = async (req, res) => {
52
+ try {
53
+ const request = toFetchRequest(req);
54
+ const response = await getHandler(request);
55
+ // Handle redirects specially for Express
56
+ if (response.status >= 300 && response.status < 400) {
57
+ const location = response.headers.get('location');
58
+ if (location) {
59
+ res.redirect(response.status, location);
60
+ return;
61
+ }
62
+ }
63
+ await sendFetchResponse(res, response);
64
+ }
65
+ catch (error) {
66
+ console.error('MDK Express GET handler error', error);
67
+ res.status(500).send('Internal Server Error');
68
+ }
69
+ };
49
70
  export function createMdkExpressRouter() {
50
71
  const router = express.Router();
51
72
  router.use(express.json());
73
+ router.get('/', mdkExpressGetHandler);
52
74
  router.post('/', mdkExpressHandler);
53
75
  return router;
54
76
  }
@@ -1 +1 @@
1
- {"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/server/express.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/server/express.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moneydevkit/replit",
3
- "version": "0.7.0-beta.0",
3
+ "version": "0.7.0-beta.10",
4
4
  "description": "Money Dev Kit checkout package for Replit (Vite + Express).",
5
5
  "repository": {
6
6
  "type": "git",
@@ -40,7 +40,7 @@
40
40
  "react-dom": "^18 || ^19"
41
41
  },
42
42
  "dependencies": {
43
- "@moneydevkit/core": "0.7.0-beta.0"
43
+ "@moneydevkit/core": "0.7.0-beta.10"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@types/express": "^4.17.21",