torque-checkout 3.1.1 → 3.2.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/CHANGELOG.md +17 -0
- package/README.md +37 -5
- package/dist/index.d.ts +22 -0
- package/dist/index.esm.js +49 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -1
- package/dist/nextjs.d.ts +7 -2
- package/dist/nextjs.esm.js +26 -15
- package/dist/nextjs.esm.js.map +1 -1
- package/dist/nextjs.js +26 -14
- package/dist/nextjs.js.map +1 -1
- package/dist/react.d.ts +3 -1
- package/dist/react.esm.js +24 -0
- package/dist/react.esm.js.map +1 -1
- package/dist/react.js +24 -0
- package/dist/react.js.map +1 -1
- package/package.json +1 -1
package/dist/react.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* React Hooks for Torque Checkout
|
|
3
3
|
* Client-side React hooks for seamless Next.js integration
|
|
4
4
|
*/
|
|
5
|
-
import { type TorqueConfig, type CartData, type CartItem, type CustomerData, type CartOptions, type OrderStatus, type CartValidation, type TorqueCheckoutError } from './index';
|
|
5
|
+
import { type TorqueConfig, type CartData, type CartItem, type CustomerData, type CartOptions, type CheckoutSession, type OrderStatus, type CartValidation, type TorqueCheckoutError } from './index';
|
|
6
6
|
export interface UseTorqueCheckoutOptions {
|
|
7
7
|
config?: TorqueConfig;
|
|
8
8
|
autoRedirect?: boolean;
|
|
@@ -11,6 +11,8 @@ export interface UseTorqueCheckoutOptions {
|
|
|
11
11
|
}
|
|
12
12
|
export interface UseTorqueCheckoutReturn {
|
|
13
13
|
generateCheckout: (cart: CartData) => Promise<string | null>;
|
|
14
|
+
/** Full session (URL + cartSummary + expiresAt) — use for merchant return URL & analytics. */
|
|
15
|
+
requestCheckoutSession: (cart: CartData) => Promise<CheckoutSession | null>;
|
|
14
16
|
generateProductCheckout: (productId: string, quantity?: number, customer?: CustomerData, options?: CartOptions) => Promise<string | null>;
|
|
15
17
|
generateSubscriptionCheckout: (productId: string, paymentPlanId: string, customer?: CustomerData, options?: CartOptions) => Promise<string | null>;
|
|
16
18
|
validateCart: (cart: CartData) => Promise<CartValidation>;
|
package/dist/react.esm.js
CHANGED
|
@@ -75,6 +75,29 @@ function useTorqueCheckout(options = {}) {
|
|
|
75
75
|
return handleError(err);
|
|
76
76
|
}
|
|
77
77
|
}, [torque, handleError, handleSuccess]);
|
|
78
|
+
const requestCheckoutSession = useCallback(async (cart) => {
|
|
79
|
+
if (!torque) {
|
|
80
|
+
const err = new Error('TorqueCheckout not initialized');
|
|
81
|
+
return handleError(err);
|
|
82
|
+
}
|
|
83
|
+
setIsLoading(true);
|
|
84
|
+
setError(null);
|
|
85
|
+
try {
|
|
86
|
+
const session = await torque.requestCheckoutSession(cart);
|
|
87
|
+
setIsLoading(false);
|
|
88
|
+
setCheckoutUrl(session.checkoutUrl);
|
|
89
|
+
setError(null);
|
|
90
|
+
options.onSuccess?.(session.checkoutUrl);
|
|
91
|
+
if (options.autoRedirect) {
|
|
92
|
+
window.location.href = session.checkoutUrl;
|
|
93
|
+
}
|
|
94
|
+
return session;
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
setIsLoading(false);
|
|
98
|
+
return handleError(err);
|
|
99
|
+
}
|
|
100
|
+
}, [torque, handleError, options]);
|
|
78
101
|
const generateProductCheckout = useCallback(async (productId, quantity = 1, customer, options) => {
|
|
79
102
|
if (!torque) {
|
|
80
103
|
const err = new Error('TorqueCheckout not initialized');
|
|
@@ -157,6 +180,7 @@ function useTorqueCheckout(options = {}) {
|
|
|
157
180
|
}, [torque, handleError]);
|
|
158
181
|
return {
|
|
159
182
|
generateCheckout,
|
|
183
|
+
requestCheckoutSession,
|
|
160
184
|
generateProductCheckout,
|
|
161
185
|
generateSubscriptionCheckout,
|
|
162
186
|
validateCart,
|
package/dist/react.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.esm.js","sources":["../src/react.tsx"],"sourcesContent":["/**\n * React Hooks for Torque Checkout\n * Client-side React hooks for seamless Next.js integration\n */\n\n'use client'\n\nimport { useState, useCallback, useMemo } from 'react'\nimport {\n TorqueCheckout,\n createTorqueCheckout,\n createTorqueCheckoutFromEnv,\n type TorqueConfig,\n type CartData,\n type CartItem,\n type CustomerData,\n type CartOptions,\n type CheckoutResponse,\n type OrderStatus,\n type CartValidation,\n type Subscription,\n type CreateSubscriptionData,\n type TorqueCheckoutError\n} from './index'\n\n// ============================================================================\n// Hook: useTorqueCheckout\n// ============================================================================\n\nexport interface UseTorqueCheckoutOptions {\n config?: TorqueConfig\n autoRedirect?: boolean\n onSuccess?: (checkoutUrl: string) => void\n onError?: (error: TorqueCheckoutError) => void\n}\n\nexport interface UseTorqueCheckoutReturn {\n generateCheckout: (cart: CartData) => Promise<string | null>\n generateProductCheckout: (productId: string, quantity?: number, customer?: CustomerData, options?: CartOptions) => Promise<string | null>\n generateSubscriptionCheckout: (productId: string, paymentPlanId: string, customer?: CustomerData, options?: CartOptions) => Promise<string | null>\n validateCart: (cart: CartData) => Promise<CartValidation>\n getOrderStatus: (orderId: string) => Promise<OrderStatus | null>\n isLoading: boolean\n error: TorqueCheckoutError | null\n checkoutUrl: string | null\n}\n\n/**\n * React hook for Torque Checkout\n * \n * @example\n * ```tsx\n * const { generateCheckout, isLoading } = useTorqueCheckout({\n * config: {\n * businessId: 'your_business_id',\n * apiKey: 'your_api_key'\n * }\n * })\n * \n * const handleCheckout = async () => {\n * const url = await generateCheckout({\n * items: [{ productId: 'prod_123', quantity: 1 }],\n * customer: { email: 'customer@example.com' }\n * })\n * }\n * ```\n */\nexport function useTorqueCheckout(options: UseTorqueCheckoutOptions = {}): UseTorqueCheckoutReturn {\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<TorqueCheckoutError | null>(null)\n const [checkoutUrl, setCheckoutUrl] = useState<string | null>(null)\n\n const torque = useMemo(() => {\n if (options.config) {\n return createTorqueCheckout(options.config)\n }\n try {\n return createTorqueCheckoutFromEnv()\n } catch (err) {\n console.warn('Failed to create TorqueCheckout from env vars:', err)\n return null\n }\n }, [options.config])\n\n const handleError = useCallback((err: unknown) => {\n const error = err instanceof Error && 'code' in err \n ? err as TorqueCheckoutError \n : new Error(err instanceof Error ? err.message : 'Unknown error') as TorqueCheckoutError\n \n setError(error)\n options.onError?.(error)\n return null\n }, [options])\n\n const handleSuccess = useCallback((url: string) => {\n setCheckoutUrl(url)\n setError(null)\n options.onSuccess?.(url)\n \n if (options.autoRedirect) {\n window.location.href = url\n }\n \n return url\n }, [options])\n\n const generateCheckout = useCallback(async (cart: CartData): Promise<string | null> => {\n if (!torque) {\n const err = new Error('TorqueCheckout not initialized. Provide config or set TORQUE_BUSINESS_ID and TORQUE_API_KEY environment variables.') as TorqueCheckoutError\n return handleError(err)\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const url = await torque.generateCartCheckoutUrl(cart)\n setIsLoading(false)\n return handleSuccess(url)\n } catch (err) {\n setIsLoading(false)\n return handleError(err)\n }\n }, [torque, handleError, handleSuccess])\n\n const generateProductCheckout = useCallback(async (\n productId: string,\n quantity: number = 1,\n customer?: CustomerData,\n options?: CartOptions\n ): Promise<string | null> => {\n if (!torque) {\n const err = new Error('TorqueCheckout not initialized') as TorqueCheckoutError\n return handleError(err)\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const url = await torque.generateProductCheckoutUrl(productId, quantity, customer, options)\n setIsLoading(false)\n return handleSuccess(url)\n } catch (err) {\n setIsLoading(false)\n return handleError(err)\n }\n }, [torque, handleError, handleSuccess])\n\n const generateSubscriptionCheckout = useCallback(async (\n productId: string,\n paymentPlanId: string,\n customer?: CustomerData,\n options?: CartOptions\n ): Promise<string | null> => {\n if (!torque) {\n const err = new Error('TorqueCheckout not initialized') as TorqueCheckoutError\n return handleError(err)\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const url = await torque.generateSubscriptionCheckoutUrl(productId, paymentPlanId, customer, options)\n setIsLoading(false)\n return handleSuccess(url)\n } catch (err) {\n setIsLoading(false)\n return handleError(err)\n }\n }, [torque, handleError, handleSuccess])\n\n const validateCart = useCallback(async (cart: CartData): Promise<CartValidation> => {\n if (!torque) {\n return {\n valid: false,\n errors: ['TorqueCheckout not initialized'],\n warnings: [],\n estimatedTotal: 0\n }\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const validation = await torque.validateCart(cart)\n setIsLoading(false)\n return validation\n } catch (err) {\n setIsLoading(false)\n const error = err instanceof Error && 'code' in err \n ? err as TorqueCheckoutError \n : new Error(err instanceof Error ? err.message : 'Validation failed') as TorqueCheckoutError\n setError(error)\n return {\n valid: false,\n errors: [error.message],\n warnings: [],\n estimatedTotal: 0\n }\n }\n }, [torque])\n\n const getOrderStatus = useCallback(async (orderId: string): Promise<OrderStatus | null> => {\n if (!torque) {\n return handleError(new Error('TorqueCheckout not initialized') as TorqueCheckoutError)\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const status = await torque.getOrderStatus(orderId)\n setIsLoading(false)\n return status\n } catch (err) {\n setIsLoading(false)\n return handleError(err)\n }\n }, [torque, handleError])\n\n return {\n generateCheckout,\n generateProductCheckout,\n generateSubscriptionCheckout,\n validateCart,\n getOrderStatus,\n isLoading,\n error,\n checkoutUrl\n }\n}\n\n// ============================================================================\n// Hook: useCart\n// ============================================================================\n\nexport interface UseCartReturn {\n items: CartItem[]\n addItem: (item: CartItem) => void\n removeItem: (productId: string, variant?: string) => void\n updateQuantity: (productId: string, quantity: number, variant?: string) => void\n clearCart: () => void\n getTotal: () => number\n getItemCount: () => number\n}\n\n/**\n * React hook for managing shopping cart state\n * \n * @example\n * ```tsx\n * const { items, addItem, removeItem, getTotal } = useCart()\n * \n * <button onClick={() => addItem({ productId: 'prod_123', quantity: 1 })}>\n * Add to Cart\n * </button>\n * ```\n */\nexport function useCart(): UseCartReturn {\n const [items, setItems] = useState<CartItem[]>([])\n\n const addItem = useCallback((item: CartItem) => {\n setItems(prev => {\n const existingIndex = prev.findIndex(\n i => i.productId === item.productId && i.variant === item.variant\n )\n \n if (existingIndex >= 0) {\n const updated = [...prev]\n updated[existingIndex] = {\n ...updated[existingIndex],\n quantity: updated[existingIndex].quantity + item.quantity\n }\n return updated\n }\n \n return [...prev, item]\n })\n }, [])\n\n const removeItem = useCallback((productId: string, variant?: string) => {\n setItems(prev => prev.filter(\n item => !(item.productId === productId && item.variant === variant)\n ))\n }, [])\n\n const updateQuantity = useCallback((productId: string, quantity: number, variant?: string) => {\n if (quantity <= 0) {\n removeItem(productId, variant)\n return\n }\n\n setItems(prev => prev.map(item => \n item.productId === productId && item.variant === variant\n ? { ...item, quantity }\n : item\n ))\n }, [removeItem])\n\n const clearCart = useCallback(() => {\n setItems([])\n }, [])\n\n const getTotal = useCallback(() => {\n // Note: Prices come from Torque product database, not from cart items\n // This function returns 0 as prices are only available after checkout URL generation\n // Use the cartSummary from generateCartCheckoutUrl response for accurate totals\n console.warn('getTotal() returns 0 because prices come from Torque product database. Use cartSummary from checkout URL generation for accurate totals.')\n return 0\n }, [items])\n\n const getItemCount = useCallback(() => {\n return items.reduce((count, item) => count + item.quantity, 0)\n }, [items])\n\n return {\n items,\n addItem,\n removeItem,\n updateQuantity,\n clearCart,\n getTotal,\n getItemCount\n }\n}\n\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react.esm.js","sources":["../src/react.tsx"],"sourcesContent":["/**\n * React Hooks for Torque Checkout\n * Client-side React hooks for seamless Next.js integration\n */\n\n'use client'\n\nimport { useState, useCallback, useMemo } from 'react'\nimport {\n TorqueCheckout,\n createTorqueCheckout,\n createTorqueCheckoutFromEnv,\n type TorqueConfig,\n type CartData,\n type CartItem,\n type CustomerData,\n type CartOptions,\n type CheckoutSession,\n type OrderStatus,\n type CartValidation,\n type Subscription,\n type CreateSubscriptionData,\n type TorqueCheckoutError\n} from './index'\n\n// ============================================================================\n// Hook: useTorqueCheckout\n// ============================================================================\n\nexport interface UseTorqueCheckoutOptions {\n config?: TorqueConfig\n autoRedirect?: boolean\n onSuccess?: (checkoutUrl: string) => void\n onError?: (error: TorqueCheckoutError) => void\n}\n\nexport interface UseTorqueCheckoutReturn {\n generateCheckout: (cart: CartData) => Promise<string | null>\n /** Full session (URL + cartSummary + expiresAt) — use for merchant return URL & analytics. */\n requestCheckoutSession: (cart: CartData) => Promise<CheckoutSession | null>\n generateProductCheckout: (productId: string, quantity?: number, customer?: CustomerData, options?: CartOptions) => Promise<string | null>\n generateSubscriptionCheckout: (productId: string, paymentPlanId: string, customer?: CustomerData, options?: CartOptions) => Promise<string | null>\n validateCart: (cart: CartData) => Promise<CartValidation>\n getOrderStatus: (orderId: string) => Promise<OrderStatus | null>\n isLoading: boolean\n error: TorqueCheckoutError | null\n checkoutUrl: string | null\n}\n\n/**\n * React hook for Torque Checkout\n * \n * @example\n * ```tsx\n * const { generateCheckout, isLoading } = useTorqueCheckout({\n * config: {\n * businessId: 'your_business_id',\n * apiKey: 'your_api_key'\n * }\n * })\n * \n * const handleCheckout = async () => {\n * const url = await generateCheckout({\n * items: [{ productId: 'prod_123', quantity: 1 }],\n * customer: { email: 'customer@example.com' }\n * })\n * }\n * ```\n */\nexport function useTorqueCheckout(options: UseTorqueCheckoutOptions = {}): UseTorqueCheckoutReturn {\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<TorqueCheckoutError | null>(null)\n const [checkoutUrl, setCheckoutUrl] = useState<string | null>(null)\n\n const torque = useMemo(() => {\n if (options.config) {\n return createTorqueCheckout(options.config)\n }\n try {\n return createTorqueCheckoutFromEnv()\n } catch (err) {\n console.warn('Failed to create TorqueCheckout from env vars:', err)\n return null\n }\n }, [options.config])\n\n const handleError = useCallback((err: unknown) => {\n const error = err instanceof Error && 'code' in err \n ? err as TorqueCheckoutError \n : new Error(err instanceof Error ? err.message : 'Unknown error') as TorqueCheckoutError\n \n setError(error)\n options.onError?.(error)\n return null\n }, [options])\n\n const handleSuccess = useCallback((url: string) => {\n setCheckoutUrl(url)\n setError(null)\n options.onSuccess?.(url)\n \n if (options.autoRedirect) {\n window.location.href = url\n }\n \n return url\n }, [options])\n\n const generateCheckout = useCallback(async (cart: CartData): Promise<string | null> => {\n if (!torque) {\n const err = new Error('TorqueCheckout not initialized. Provide config or set TORQUE_BUSINESS_ID and TORQUE_API_KEY environment variables.') as TorqueCheckoutError\n return handleError(err)\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const url = await torque.generateCartCheckoutUrl(cart)\n setIsLoading(false)\n return handleSuccess(url)\n } catch (err) {\n setIsLoading(false)\n return handleError(err)\n }\n }, [torque, handleError, handleSuccess])\n\n const requestCheckoutSession = useCallback(async (cart: CartData): Promise<CheckoutSession | null> => {\n if (!torque) {\n const err = new Error('TorqueCheckout not initialized') as TorqueCheckoutError\n return handleError(err)\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const session = await torque.requestCheckoutSession(cart)\n setIsLoading(false)\n setCheckoutUrl(session.checkoutUrl)\n setError(null)\n options.onSuccess?.(session.checkoutUrl)\n if (options.autoRedirect) {\n window.location.href = session.checkoutUrl\n }\n return session\n } catch (err) {\n setIsLoading(false)\n return handleError(err)\n }\n }, [torque, handleError, options])\n\n const generateProductCheckout = useCallback(async (\n productId: string,\n quantity: number = 1,\n customer?: CustomerData,\n options?: CartOptions\n ): Promise<string | null> => {\n if (!torque) {\n const err = new Error('TorqueCheckout not initialized') as TorqueCheckoutError\n return handleError(err)\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const url = await torque.generateProductCheckoutUrl(productId, quantity, customer, options)\n setIsLoading(false)\n return handleSuccess(url)\n } catch (err) {\n setIsLoading(false)\n return handleError(err)\n }\n }, [torque, handleError, handleSuccess])\n\n const generateSubscriptionCheckout = useCallback(async (\n productId: string,\n paymentPlanId: string,\n customer?: CustomerData,\n options?: CartOptions\n ): Promise<string | null> => {\n if (!torque) {\n const err = new Error('TorqueCheckout not initialized') as TorqueCheckoutError\n return handleError(err)\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const url = await torque.generateSubscriptionCheckoutUrl(productId, paymentPlanId, customer, options)\n setIsLoading(false)\n return handleSuccess(url)\n } catch (err) {\n setIsLoading(false)\n return handleError(err)\n }\n }, [torque, handleError, handleSuccess])\n\n const validateCart = useCallback(async (cart: CartData): Promise<CartValidation> => {\n if (!torque) {\n return {\n valid: false,\n errors: ['TorqueCheckout not initialized'],\n warnings: [],\n estimatedTotal: 0\n }\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const validation = await torque.validateCart(cart)\n setIsLoading(false)\n return validation\n } catch (err) {\n setIsLoading(false)\n const error = err instanceof Error && 'code' in err \n ? err as TorqueCheckoutError \n : new Error(err instanceof Error ? err.message : 'Validation failed') as TorqueCheckoutError\n setError(error)\n return {\n valid: false,\n errors: [error.message],\n warnings: [],\n estimatedTotal: 0\n }\n }\n }, [torque])\n\n const getOrderStatus = useCallback(async (orderId: string): Promise<OrderStatus | null> => {\n if (!torque) {\n return handleError(new Error('TorqueCheckout not initialized') as TorqueCheckoutError)\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const status = await torque.getOrderStatus(orderId)\n setIsLoading(false)\n return status\n } catch (err) {\n setIsLoading(false)\n return handleError(err)\n }\n }, [torque, handleError])\n\n return {\n generateCheckout,\n requestCheckoutSession,\n generateProductCheckout,\n generateSubscriptionCheckout,\n validateCart,\n getOrderStatus,\n isLoading,\n error,\n checkoutUrl\n }\n}\n\n// ============================================================================\n// Hook: useCart\n// ============================================================================\n\nexport interface UseCartReturn {\n items: CartItem[]\n addItem: (item: CartItem) => void\n removeItem: (productId: string, variant?: string) => void\n updateQuantity: (productId: string, quantity: number, variant?: string) => void\n clearCart: () => void\n getTotal: () => number\n getItemCount: () => number\n}\n\n/**\n * React hook for managing shopping cart state\n * \n * @example\n * ```tsx\n * const { items, addItem, removeItem, getTotal } = useCart()\n * \n * <button onClick={() => addItem({ productId: 'prod_123', quantity: 1 })}>\n * Add to Cart\n * </button>\n * ```\n */\nexport function useCart(): UseCartReturn {\n const [items, setItems] = useState<CartItem[]>([])\n\n const addItem = useCallback((item: CartItem) => {\n setItems(prev => {\n const existingIndex = prev.findIndex(\n i => i.productId === item.productId && i.variant === item.variant\n )\n \n if (existingIndex >= 0) {\n const updated = [...prev]\n updated[existingIndex] = {\n ...updated[existingIndex],\n quantity: updated[existingIndex].quantity + item.quantity\n }\n return updated\n }\n \n return [...prev, item]\n })\n }, [])\n\n const removeItem = useCallback((productId: string, variant?: string) => {\n setItems(prev => prev.filter(\n item => !(item.productId === productId && item.variant === variant)\n ))\n }, [])\n\n const updateQuantity = useCallback((productId: string, quantity: number, variant?: string) => {\n if (quantity <= 0) {\n removeItem(productId, variant)\n return\n }\n\n setItems(prev => prev.map(item => \n item.productId === productId && item.variant === variant\n ? { ...item, quantity }\n : item\n ))\n }, [removeItem])\n\n const clearCart = useCallback(() => {\n setItems([])\n }, [])\n\n const getTotal = useCallback(() => {\n // Note: Prices come from Torque product database, not from cart items\n // This function returns 0 as prices are only available after checkout URL generation\n // Use the cartSummary from generateCartCheckoutUrl response for accurate totals\n console.warn('getTotal() returns 0 because prices come from Torque product database. Use cartSummary from checkout URL generation for accurate totals.')\n return 0\n }, [items])\n\n const getItemCount = useCallback(() => {\n return items.reduce((count, item) => count + item.quantity, 0)\n }, [items])\n\n return {\n items,\n addItem,\n removeItem,\n updateQuantity,\n clearCart,\n getTotal,\n getItemCount\n }\n}\n\n"],"names":[],"mappings":"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"}
|
package/dist/react.js
CHANGED
|
@@ -77,6 +77,29 @@ function useTorqueCheckout(options = {}) {
|
|
|
77
77
|
return handleError(err);
|
|
78
78
|
}
|
|
79
79
|
}, [torque, handleError, handleSuccess]);
|
|
80
|
+
const requestCheckoutSession = react.useCallback(async (cart) => {
|
|
81
|
+
if (!torque) {
|
|
82
|
+
const err = new Error('TorqueCheckout not initialized');
|
|
83
|
+
return handleError(err);
|
|
84
|
+
}
|
|
85
|
+
setIsLoading(true);
|
|
86
|
+
setError(null);
|
|
87
|
+
try {
|
|
88
|
+
const session = await torque.requestCheckoutSession(cart);
|
|
89
|
+
setIsLoading(false);
|
|
90
|
+
setCheckoutUrl(session.checkoutUrl);
|
|
91
|
+
setError(null);
|
|
92
|
+
options.onSuccess?.(session.checkoutUrl);
|
|
93
|
+
if (options.autoRedirect) {
|
|
94
|
+
window.location.href = session.checkoutUrl;
|
|
95
|
+
}
|
|
96
|
+
return session;
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
setIsLoading(false);
|
|
100
|
+
return handleError(err);
|
|
101
|
+
}
|
|
102
|
+
}, [torque, handleError, options]);
|
|
80
103
|
const generateProductCheckout = react.useCallback(async (productId, quantity = 1, customer, options) => {
|
|
81
104
|
if (!torque) {
|
|
82
105
|
const err = new Error('TorqueCheckout not initialized');
|
|
@@ -159,6 +182,7 @@ function useTorqueCheckout(options = {}) {
|
|
|
159
182
|
}, [torque, handleError]);
|
|
160
183
|
return {
|
|
161
184
|
generateCheckout,
|
|
185
|
+
requestCheckoutSession,
|
|
162
186
|
generateProductCheckout,
|
|
163
187
|
generateSubscriptionCheckout,
|
|
164
188
|
validateCart,
|
package/dist/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react.js","sources":["../src/react.tsx"],"sourcesContent":["/**\n * React Hooks for Torque Checkout\n * Client-side React hooks for seamless Next.js integration\n */\n\n'use client'\n\nimport { useState, useCallback, useMemo } from 'react'\nimport {\n TorqueCheckout,\n createTorqueCheckout,\n createTorqueCheckoutFromEnv,\n type TorqueConfig,\n type CartData,\n type CartItem,\n type CustomerData,\n type CartOptions,\n type CheckoutResponse,\n type OrderStatus,\n type CartValidation,\n type Subscription,\n type CreateSubscriptionData,\n type TorqueCheckoutError\n} from './index'\n\n// ============================================================================\n// Hook: useTorqueCheckout\n// ============================================================================\n\nexport interface UseTorqueCheckoutOptions {\n config?: TorqueConfig\n autoRedirect?: boolean\n onSuccess?: (checkoutUrl: string) => void\n onError?: (error: TorqueCheckoutError) => void\n}\n\nexport interface UseTorqueCheckoutReturn {\n generateCheckout: (cart: CartData) => Promise<string | null>\n generateProductCheckout: (productId: string, quantity?: number, customer?: CustomerData, options?: CartOptions) => Promise<string | null>\n generateSubscriptionCheckout: (productId: string, paymentPlanId: string, customer?: CustomerData, options?: CartOptions) => Promise<string | null>\n validateCart: (cart: CartData) => Promise<CartValidation>\n getOrderStatus: (orderId: string) => Promise<OrderStatus | null>\n isLoading: boolean\n error: TorqueCheckoutError | null\n checkoutUrl: string | null\n}\n\n/**\n * React hook for Torque Checkout\n * \n * @example\n * ```tsx\n * const { generateCheckout, isLoading } = useTorqueCheckout({\n * config: {\n * businessId: 'your_business_id',\n * apiKey: 'your_api_key'\n * }\n * })\n * \n * const handleCheckout = async () => {\n * const url = await generateCheckout({\n * items: [{ productId: 'prod_123', quantity: 1 }],\n * customer: { email: 'customer@example.com' }\n * })\n * }\n * ```\n */\nexport function useTorqueCheckout(options: UseTorqueCheckoutOptions = {}): UseTorqueCheckoutReturn {\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<TorqueCheckoutError | null>(null)\n const [checkoutUrl, setCheckoutUrl] = useState<string | null>(null)\n\n const torque = useMemo(() => {\n if (options.config) {\n return createTorqueCheckout(options.config)\n }\n try {\n return createTorqueCheckoutFromEnv()\n } catch (err) {\n console.warn('Failed to create TorqueCheckout from env vars:', err)\n return null\n }\n }, [options.config])\n\n const handleError = useCallback((err: unknown) => {\n const error = err instanceof Error && 'code' in err \n ? err as TorqueCheckoutError \n : new Error(err instanceof Error ? err.message : 'Unknown error') as TorqueCheckoutError\n \n setError(error)\n options.onError?.(error)\n return null\n }, [options])\n\n const handleSuccess = useCallback((url: string) => {\n setCheckoutUrl(url)\n setError(null)\n options.onSuccess?.(url)\n \n if (options.autoRedirect) {\n window.location.href = url\n }\n \n return url\n }, [options])\n\n const generateCheckout = useCallback(async (cart: CartData): Promise<string | null> => {\n if (!torque) {\n const err = new Error('TorqueCheckout not initialized. Provide config or set TORQUE_BUSINESS_ID and TORQUE_API_KEY environment variables.') as TorqueCheckoutError\n return handleError(err)\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const url = await torque.generateCartCheckoutUrl(cart)\n setIsLoading(false)\n return handleSuccess(url)\n } catch (err) {\n setIsLoading(false)\n return handleError(err)\n }\n }, [torque, handleError, handleSuccess])\n\n const generateProductCheckout = useCallback(async (\n productId: string,\n quantity: number = 1,\n customer?: CustomerData,\n options?: CartOptions\n ): Promise<string | null> => {\n if (!torque) {\n const err = new Error('TorqueCheckout not initialized') as TorqueCheckoutError\n return handleError(err)\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const url = await torque.generateProductCheckoutUrl(productId, quantity, customer, options)\n setIsLoading(false)\n return handleSuccess(url)\n } catch (err) {\n setIsLoading(false)\n return handleError(err)\n }\n }, [torque, handleError, handleSuccess])\n\n const generateSubscriptionCheckout = useCallback(async (\n productId: string,\n paymentPlanId: string,\n customer?: CustomerData,\n options?: CartOptions\n ): Promise<string | null> => {\n if (!torque) {\n const err = new Error('TorqueCheckout not initialized') as TorqueCheckoutError\n return handleError(err)\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const url = await torque.generateSubscriptionCheckoutUrl(productId, paymentPlanId, customer, options)\n setIsLoading(false)\n return handleSuccess(url)\n } catch (err) {\n setIsLoading(false)\n return handleError(err)\n }\n }, [torque, handleError, handleSuccess])\n\n const validateCart = useCallback(async (cart: CartData): Promise<CartValidation> => {\n if (!torque) {\n return {\n valid: false,\n errors: ['TorqueCheckout not initialized'],\n warnings: [],\n estimatedTotal: 0\n }\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const validation = await torque.validateCart(cart)\n setIsLoading(false)\n return validation\n } catch (err) {\n setIsLoading(false)\n const error = err instanceof Error && 'code' in err \n ? err as TorqueCheckoutError \n : new Error(err instanceof Error ? err.message : 'Validation failed') as TorqueCheckoutError\n setError(error)\n return {\n valid: false,\n errors: [error.message],\n warnings: [],\n estimatedTotal: 0\n }\n }\n }, [torque])\n\n const getOrderStatus = useCallback(async (orderId: string): Promise<OrderStatus | null> => {\n if (!torque) {\n return handleError(new Error('TorqueCheckout not initialized') as TorqueCheckoutError)\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const status = await torque.getOrderStatus(orderId)\n setIsLoading(false)\n return status\n } catch (err) {\n setIsLoading(false)\n return handleError(err)\n }\n }, [torque, handleError])\n\n return {\n generateCheckout,\n generateProductCheckout,\n generateSubscriptionCheckout,\n validateCart,\n getOrderStatus,\n isLoading,\n error,\n checkoutUrl\n }\n}\n\n// ============================================================================\n// Hook: useCart\n// ============================================================================\n\nexport interface UseCartReturn {\n items: CartItem[]\n addItem: (item: CartItem) => void\n removeItem: (productId: string, variant?: string) => void\n updateQuantity: (productId: string, quantity: number, variant?: string) => void\n clearCart: () => void\n getTotal: () => number\n getItemCount: () => number\n}\n\n/**\n * React hook for managing shopping cart state\n * \n * @example\n * ```tsx\n * const { items, addItem, removeItem, getTotal } = useCart()\n * \n * <button onClick={() => addItem({ productId: 'prod_123', quantity: 1 })}>\n * Add to Cart\n * </button>\n * ```\n */\nexport function useCart(): UseCartReturn {\n const [items, setItems] = useState<CartItem[]>([])\n\n const addItem = useCallback((item: CartItem) => {\n setItems(prev => {\n const existingIndex = prev.findIndex(\n i => i.productId === item.productId && i.variant === item.variant\n )\n \n if (existingIndex >= 0) {\n const updated = [...prev]\n updated[existingIndex] = {\n ...updated[existingIndex],\n quantity: updated[existingIndex].quantity + item.quantity\n }\n return updated\n }\n \n return [...prev, item]\n })\n }, [])\n\n const removeItem = useCallback((productId: string, variant?: string) => {\n setItems(prev => prev.filter(\n item => !(item.productId === productId && item.variant === variant)\n ))\n }, [])\n\n const updateQuantity = useCallback((productId: string, quantity: number, variant?: string) => {\n if (quantity <= 0) {\n removeItem(productId, variant)\n return\n }\n\n setItems(prev => prev.map(item => \n item.productId === productId && item.variant === variant\n ? { ...item, quantity }\n : item\n ))\n }, [removeItem])\n\n const clearCart = useCallback(() => {\n setItems([])\n }, [])\n\n const getTotal = useCallback(() => {\n // Note: Prices come from Torque product database, not from cart items\n // This function returns 0 as prices are only available after checkout URL generation\n // Use the cartSummary from generateCartCheckoutUrl response for accurate totals\n console.warn('getTotal() returns 0 because prices come from Torque product database. Use cartSummary from checkout URL generation for accurate totals.')\n return 0\n }, [items])\n\n const getItemCount = useCallback(() => {\n return items.reduce((count, item) => count + item.quantity, 0)\n }, [items])\n\n return {\n items,\n addItem,\n removeItem,\n updateQuantity,\n clearCart,\n getTotal,\n getItemCount\n }\n}\n\n"],"names":["useState","useMemo","createTorqueCheckout","createTorqueCheckoutFromEnv","useCallback"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"react.js","sources":["../src/react.tsx"],"sourcesContent":["/**\n * React Hooks for Torque Checkout\n * Client-side React hooks for seamless Next.js integration\n */\n\n'use client'\n\nimport { useState, useCallback, useMemo } from 'react'\nimport {\n TorqueCheckout,\n createTorqueCheckout,\n createTorqueCheckoutFromEnv,\n type TorqueConfig,\n type CartData,\n type CartItem,\n type CustomerData,\n type CartOptions,\n type CheckoutSession,\n type OrderStatus,\n type CartValidation,\n type Subscription,\n type CreateSubscriptionData,\n type TorqueCheckoutError\n} from './index'\n\n// ============================================================================\n// Hook: useTorqueCheckout\n// ============================================================================\n\nexport interface UseTorqueCheckoutOptions {\n config?: TorqueConfig\n autoRedirect?: boolean\n onSuccess?: (checkoutUrl: string) => void\n onError?: (error: TorqueCheckoutError) => void\n}\n\nexport interface UseTorqueCheckoutReturn {\n generateCheckout: (cart: CartData) => Promise<string | null>\n /** Full session (URL + cartSummary + expiresAt) — use for merchant return URL & analytics. */\n requestCheckoutSession: (cart: CartData) => Promise<CheckoutSession | null>\n generateProductCheckout: (productId: string, quantity?: number, customer?: CustomerData, options?: CartOptions) => Promise<string | null>\n generateSubscriptionCheckout: (productId: string, paymentPlanId: string, customer?: CustomerData, options?: CartOptions) => Promise<string | null>\n validateCart: (cart: CartData) => Promise<CartValidation>\n getOrderStatus: (orderId: string) => Promise<OrderStatus | null>\n isLoading: boolean\n error: TorqueCheckoutError | null\n checkoutUrl: string | null\n}\n\n/**\n * React hook for Torque Checkout\n * \n * @example\n * ```tsx\n * const { generateCheckout, isLoading } = useTorqueCheckout({\n * config: {\n * businessId: 'your_business_id',\n * apiKey: 'your_api_key'\n * }\n * })\n * \n * const handleCheckout = async () => {\n * const url = await generateCheckout({\n * items: [{ productId: 'prod_123', quantity: 1 }],\n * customer: { email: 'customer@example.com' }\n * })\n * }\n * ```\n */\nexport function useTorqueCheckout(options: UseTorqueCheckoutOptions = {}): UseTorqueCheckoutReturn {\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<TorqueCheckoutError | null>(null)\n const [checkoutUrl, setCheckoutUrl] = useState<string | null>(null)\n\n const torque = useMemo(() => {\n if (options.config) {\n return createTorqueCheckout(options.config)\n }\n try {\n return createTorqueCheckoutFromEnv()\n } catch (err) {\n console.warn('Failed to create TorqueCheckout from env vars:', err)\n return null\n }\n }, [options.config])\n\n const handleError = useCallback((err: unknown) => {\n const error = err instanceof Error && 'code' in err \n ? err as TorqueCheckoutError \n : new Error(err instanceof Error ? err.message : 'Unknown error') as TorqueCheckoutError\n \n setError(error)\n options.onError?.(error)\n return null\n }, [options])\n\n const handleSuccess = useCallback((url: string) => {\n setCheckoutUrl(url)\n setError(null)\n options.onSuccess?.(url)\n \n if (options.autoRedirect) {\n window.location.href = url\n }\n \n return url\n }, [options])\n\n const generateCheckout = useCallback(async (cart: CartData): Promise<string | null> => {\n if (!torque) {\n const err = new Error('TorqueCheckout not initialized. Provide config or set TORQUE_BUSINESS_ID and TORQUE_API_KEY environment variables.') as TorqueCheckoutError\n return handleError(err)\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const url = await torque.generateCartCheckoutUrl(cart)\n setIsLoading(false)\n return handleSuccess(url)\n } catch (err) {\n setIsLoading(false)\n return handleError(err)\n }\n }, [torque, handleError, handleSuccess])\n\n const requestCheckoutSession = useCallback(async (cart: CartData): Promise<CheckoutSession | null> => {\n if (!torque) {\n const err = new Error('TorqueCheckout not initialized') as TorqueCheckoutError\n return handleError(err)\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const session = await torque.requestCheckoutSession(cart)\n setIsLoading(false)\n setCheckoutUrl(session.checkoutUrl)\n setError(null)\n options.onSuccess?.(session.checkoutUrl)\n if (options.autoRedirect) {\n window.location.href = session.checkoutUrl\n }\n return session\n } catch (err) {\n setIsLoading(false)\n return handleError(err)\n }\n }, [torque, handleError, options])\n\n const generateProductCheckout = useCallback(async (\n productId: string,\n quantity: number = 1,\n customer?: CustomerData,\n options?: CartOptions\n ): Promise<string | null> => {\n if (!torque) {\n const err = new Error('TorqueCheckout not initialized') as TorqueCheckoutError\n return handleError(err)\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const url = await torque.generateProductCheckoutUrl(productId, quantity, customer, options)\n setIsLoading(false)\n return handleSuccess(url)\n } catch (err) {\n setIsLoading(false)\n return handleError(err)\n }\n }, [torque, handleError, handleSuccess])\n\n const generateSubscriptionCheckout = useCallback(async (\n productId: string,\n paymentPlanId: string,\n customer?: CustomerData,\n options?: CartOptions\n ): Promise<string | null> => {\n if (!torque) {\n const err = new Error('TorqueCheckout not initialized') as TorqueCheckoutError\n return handleError(err)\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const url = await torque.generateSubscriptionCheckoutUrl(productId, paymentPlanId, customer, options)\n setIsLoading(false)\n return handleSuccess(url)\n } catch (err) {\n setIsLoading(false)\n return handleError(err)\n }\n }, [torque, handleError, handleSuccess])\n\n const validateCart = useCallback(async (cart: CartData): Promise<CartValidation> => {\n if (!torque) {\n return {\n valid: false,\n errors: ['TorqueCheckout not initialized'],\n warnings: [],\n estimatedTotal: 0\n }\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const validation = await torque.validateCart(cart)\n setIsLoading(false)\n return validation\n } catch (err) {\n setIsLoading(false)\n const error = err instanceof Error && 'code' in err \n ? err as TorqueCheckoutError \n : new Error(err instanceof Error ? err.message : 'Validation failed') as TorqueCheckoutError\n setError(error)\n return {\n valid: false,\n errors: [error.message],\n warnings: [],\n estimatedTotal: 0\n }\n }\n }, [torque])\n\n const getOrderStatus = useCallback(async (orderId: string): Promise<OrderStatus | null> => {\n if (!torque) {\n return handleError(new Error('TorqueCheckout not initialized') as TorqueCheckoutError)\n }\n\n setIsLoading(true)\n setError(null)\n\n try {\n const status = await torque.getOrderStatus(orderId)\n setIsLoading(false)\n return status\n } catch (err) {\n setIsLoading(false)\n return handleError(err)\n }\n }, [torque, handleError])\n\n return {\n generateCheckout,\n requestCheckoutSession,\n generateProductCheckout,\n generateSubscriptionCheckout,\n validateCart,\n getOrderStatus,\n isLoading,\n error,\n checkoutUrl\n }\n}\n\n// ============================================================================\n// Hook: useCart\n// ============================================================================\n\nexport interface UseCartReturn {\n items: CartItem[]\n addItem: (item: CartItem) => void\n removeItem: (productId: string, variant?: string) => void\n updateQuantity: (productId: string, quantity: number, variant?: string) => void\n clearCart: () => void\n getTotal: () => number\n getItemCount: () => number\n}\n\n/**\n * React hook for managing shopping cart state\n * \n * @example\n * ```tsx\n * const { items, addItem, removeItem, getTotal } = useCart()\n * \n * <button onClick={() => addItem({ productId: 'prod_123', quantity: 1 })}>\n * Add to Cart\n * </button>\n * ```\n */\nexport function useCart(): UseCartReturn {\n const [items, setItems] = useState<CartItem[]>([])\n\n const addItem = useCallback((item: CartItem) => {\n setItems(prev => {\n const existingIndex = prev.findIndex(\n i => i.productId === item.productId && i.variant === item.variant\n )\n \n if (existingIndex >= 0) {\n const updated = [...prev]\n updated[existingIndex] = {\n ...updated[existingIndex],\n quantity: updated[existingIndex].quantity + item.quantity\n }\n return updated\n }\n \n return [...prev, item]\n })\n }, [])\n\n const removeItem = useCallback((productId: string, variant?: string) => {\n setItems(prev => prev.filter(\n item => !(item.productId === productId && item.variant === variant)\n ))\n }, [])\n\n const updateQuantity = useCallback((productId: string, quantity: number, variant?: string) => {\n if (quantity <= 0) {\n removeItem(productId, variant)\n return\n }\n\n setItems(prev => prev.map(item => \n item.productId === productId && item.variant === variant\n ? { ...item, quantity }\n : item\n ))\n }, [removeItem])\n\n const clearCart = useCallback(() => {\n setItems([])\n }, [])\n\n const getTotal = useCallback(() => {\n // Note: Prices come from Torque product database, not from cart items\n // This function returns 0 as prices are only available after checkout URL generation\n // Use the cartSummary from generateCartCheckoutUrl response for accurate totals\n console.warn('getTotal() returns 0 because prices come from Torque product database. Use cartSummary from checkout URL generation for accurate totals.')\n return 0\n }, [items])\n\n const getItemCount = useCallback(() => {\n return items.reduce((count, item) => count + item.quantity, 0)\n }, [items])\n\n return {\n items,\n addItem,\n removeItem,\n updateQuantity,\n clearCart,\n getTotal,\n getItemCount\n }\n}\n\n"],"names":["useState","useMemo","createTorqueCheckout","createTorqueCheckoutFromEnv","useCallback"],"mappings":"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"}
|