@libreapps/checkout 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +4 -0
- package/CHANGELOG.md +24 -0
- package/LICENSE.md +21 -0
- package/README.md +211 -0
- package/client.ts +318 -0
- package/dist/client.d.ts +80 -0
- package/dist/client.js +229 -0
- package/dist/client.js.map +1 -0
- package/dist/elements/checkout-form.d.ts +14 -0
- package/dist/elements/checkout-form.js +112 -0
- package/dist/elements/checkout-form.js.map +1 -0
- package/dist/elements/index.d.ts +7 -0
- package/dist/elements/index.js +7 -0
- package/dist/elements/index.js.map +1 -0
- package/dist/embed/index.d.ts +6 -0
- package/dist/embed/index.js +7 -0
- package/dist/embed/index.js.map +1 -0
- package/dist/embed/libreapps-checkout.d.ts +32 -0
- package/dist/embed/libreapps-checkout.js +131 -0
- package/dist/embed/libreapps-checkout.js.map +1 -0
- package/dist/hooks/index.d.ts +5 -0
- package/dist/hooks/index.js +5 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/use-checkout.d.ts +42 -0
- package/dist/hooks/use-checkout.js +168 -0
- package/dist/hooks/use-checkout.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.js +50 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +219 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/elements/checkout-form.tsx +543 -0
- package/elements/index.ts +8 -0
- package/embed/index.ts +7 -0
- package/embed/libreapps-checkout.ts +172 -0
- package/hooks/index.ts +6 -0
- package/hooks/use-checkout.tsx +244 -0
- package/index.ts +70 -0
- package/package.json +57 -0
- package/tsconfig.json +15 -0
- package/types.ts +301 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import { LibreAppsCheckout } from '../client';
|
|
3
|
+
import type { CheckoutOptions, CheckoutSession, CheckoutState, CheckoutStep, CheckoutAddress, CheckoutResult, CreateSessionParams } from '../types';
|
|
4
|
+
interface CheckoutContextValue extends CheckoutState {
|
|
5
|
+
/** Checkout client instance */
|
|
6
|
+
checkout: LibreAppsCheckout | null;
|
|
7
|
+
/** Create a new session */
|
|
8
|
+
createSession: (params: CreateSessionParams) => Promise<CheckoutSession>;
|
|
9
|
+
/** Load existing session */
|
|
10
|
+
loadSession: (sessionId: string) => Promise<CheckoutSession>;
|
|
11
|
+
/** Update shipping address */
|
|
12
|
+
updateShipping: (address: CheckoutAddress) => Promise<void>;
|
|
13
|
+
/** Update billing address */
|
|
14
|
+
updateBilling: (address: CheckoutAddress) => Promise<void>;
|
|
15
|
+
/** Apply promo code */
|
|
16
|
+
applyPromo: (code: string) => Promise<void>;
|
|
17
|
+
/** Confirm payment */
|
|
18
|
+
confirmPayment: (paymentMethod: Parameters<LibreAppsCheckout['confirmPayment']>[1]) => Promise<CheckoutResult>;
|
|
19
|
+
/** Cancel checkout */
|
|
20
|
+
cancel: () => Promise<void>;
|
|
21
|
+
/** Go to step */
|
|
22
|
+
goToStep: (step: CheckoutStep) => void;
|
|
23
|
+
/** Go to next step */
|
|
24
|
+
nextStep: () => void;
|
|
25
|
+
/** Go to previous step */
|
|
26
|
+
prevStep: () => void;
|
|
27
|
+
/** Redirect to hosted checkout */
|
|
28
|
+
redirectToHosted: () => void;
|
|
29
|
+
/** Open popup checkout */
|
|
30
|
+
openPopup: () => Window | null;
|
|
31
|
+
}
|
|
32
|
+
export interface CheckoutProviderProps {
|
|
33
|
+
/** Checkout options */
|
|
34
|
+
options: CheckoutOptions;
|
|
35
|
+
/** Initial session ID to load */
|
|
36
|
+
sessionId?: string;
|
|
37
|
+
/** Children */
|
|
38
|
+
children: ReactNode;
|
|
39
|
+
}
|
|
40
|
+
export declare function CheckoutProvider({ options, sessionId, children }: CheckoutProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
41
|
+
export declare function useCheckout(): CheckoutContextValue;
|
|
42
|
+
export default useCheckout;
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
/**
|
|
4
|
+
* @libreapps/checkout - useCheckout hook
|
|
5
|
+
*
|
|
6
|
+
* React hook for managing checkout state
|
|
7
|
+
*/
|
|
8
|
+
import { useState, useCallback, useEffect, createContext, useContext } from 'react';
|
|
9
|
+
import { LibreAppsCheckout } from '../client';
|
|
10
|
+
const CheckoutContext = createContext(null);
|
|
11
|
+
const STEP_ORDER = ['cart', 'shipping', 'payment', 'confirmation'];
|
|
12
|
+
export function CheckoutProvider({ options, sessionId, children }) {
|
|
13
|
+
const [checkout] = useState(() => new LibreAppsCheckout(options));
|
|
14
|
+
const [state, setState] = useState({
|
|
15
|
+
step: 'cart',
|
|
16
|
+
session: null,
|
|
17
|
+
isLoading: false,
|
|
18
|
+
error: null,
|
|
19
|
+
isProcessing: false
|
|
20
|
+
});
|
|
21
|
+
// Load session on mount if sessionId provided
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
if (sessionId) {
|
|
24
|
+
loadSession(sessionId);
|
|
25
|
+
}
|
|
26
|
+
}, [sessionId]);
|
|
27
|
+
const createSession = useCallback(async (params) => {
|
|
28
|
+
setState(s => ({ ...s, isLoading: true, error: null }));
|
|
29
|
+
try {
|
|
30
|
+
const session = await checkout.createSession(params);
|
|
31
|
+
setState(s => ({ ...s, session, isLoading: false }));
|
|
32
|
+
return session;
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
const error = err;
|
|
36
|
+
setState(s => ({ ...s, error, isLoading: false }));
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
}, [checkout]);
|
|
40
|
+
const loadSession = useCallback(async (id) => {
|
|
41
|
+
setState(s => ({ ...s, isLoading: true, error: null }));
|
|
42
|
+
try {
|
|
43
|
+
const session = await checkout.retrieveSession(id);
|
|
44
|
+
setState(s => ({ ...s, session, isLoading: false }));
|
|
45
|
+
return session;
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
const error = err;
|
|
49
|
+
setState(s => ({ ...s, error, isLoading: false }));
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
}, [checkout]);
|
|
53
|
+
const updateShipping = useCallback(async (address) => {
|
|
54
|
+
if (!state.session)
|
|
55
|
+
throw new Error('No session');
|
|
56
|
+
setState(s => ({ ...s, isLoading: true, error: null }));
|
|
57
|
+
try {
|
|
58
|
+
const session = await checkout.updateShipping(state.session.id, address);
|
|
59
|
+
setState(s => ({ ...s, session, isLoading: false }));
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
const error = err;
|
|
63
|
+
setState(s => ({ ...s, error, isLoading: false }));
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
}, [checkout, state.session]);
|
|
67
|
+
const updateBilling = useCallback(async (address) => {
|
|
68
|
+
if (!state.session)
|
|
69
|
+
throw new Error('No session');
|
|
70
|
+
setState(s => ({ ...s, isLoading: true, error: null }));
|
|
71
|
+
try {
|
|
72
|
+
const session = await checkout.updateBilling(state.session.id, address);
|
|
73
|
+
setState(s => ({ ...s, session, isLoading: false }));
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
const error = err;
|
|
77
|
+
setState(s => ({ ...s, error, isLoading: false }));
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
}, [checkout, state.session]);
|
|
81
|
+
const applyPromo = useCallback(async (code) => {
|
|
82
|
+
if (!state.session)
|
|
83
|
+
throw new Error('No session');
|
|
84
|
+
setState(s => ({ ...s, isLoading: true, error: null }));
|
|
85
|
+
try {
|
|
86
|
+
const session = await checkout.applyPromoCode(state.session.id, code);
|
|
87
|
+
setState(s => ({ ...s, session, isLoading: false }));
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
const error = err;
|
|
91
|
+
setState(s => ({ ...s, error, isLoading: false }));
|
|
92
|
+
throw error;
|
|
93
|
+
}
|
|
94
|
+
}, [checkout, state.session]);
|
|
95
|
+
const confirmPayment = useCallback(async (paymentMethod) => {
|
|
96
|
+
if (!state.session)
|
|
97
|
+
throw new Error('No session');
|
|
98
|
+
setState(s => ({ ...s, isProcessing: true, error: null }));
|
|
99
|
+
try {
|
|
100
|
+
const result = await checkout.confirmPayment(state.session.id, paymentMethod);
|
|
101
|
+
setState(s => ({ ...s, isProcessing: false, step: 'confirmation' }));
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
const error = err;
|
|
106
|
+
setState(s => ({ ...s, error, isProcessing: false }));
|
|
107
|
+
throw error;
|
|
108
|
+
}
|
|
109
|
+
}, [checkout, state.session]);
|
|
110
|
+
const cancel = useCallback(async () => {
|
|
111
|
+
if (!state.session)
|
|
112
|
+
return;
|
|
113
|
+
await checkout.cancelSession(state.session.id);
|
|
114
|
+
setState(s => ({ ...s, session: null, step: 'cart' }));
|
|
115
|
+
}, [checkout, state.session]);
|
|
116
|
+
const goToStep = useCallback((step) => {
|
|
117
|
+
setState(s => ({ ...s, step }));
|
|
118
|
+
}, []);
|
|
119
|
+
const nextStep = useCallback(() => {
|
|
120
|
+
const currentIndex = STEP_ORDER.indexOf(state.step);
|
|
121
|
+
if (currentIndex < STEP_ORDER.length - 1) {
|
|
122
|
+
setState(s => ({ ...s, step: STEP_ORDER[currentIndex + 1] }));
|
|
123
|
+
}
|
|
124
|
+
}, [state.step]);
|
|
125
|
+
const prevStep = useCallback(() => {
|
|
126
|
+
const currentIndex = STEP_ORDER.indexOf(state.step);
|
|
127
|
+
if (currentIndex > 0) {
|
|
128
|
+
setState(s => ({ ...s, step: STEP_ORDER[currentIndex - 1] }));
|
|
129
|
+
}
|
|
130
|
+
}, [state.step]);
|
|
131
|
+
const redirectToHosted = useCallback(() => {
|
|
132
|
+
if (state.session) {
|
|
133
|
+
checkout.redirectToCheckout(state.session.id);
|
|
134
|
+
}
|
|
135
|
+
}, [checkout, state.session]);
|
|
136
|
+
const openPopup = useCallback(() => {
|
|
137
|
+
if (state.session) {
|
|
138
|
+
return checkout.openPopup(state.session.id);
|
|
139
|
+
}
|
|
140
|
+
return null;
|
|
141
|
+
}, [checkout, state.session]);
|
|
142
|
+
const value = {
|
|
143
|
+
...state,
|
|
144
|
+
checkout,
|
|
145
|
+
createSession,
|
|
146
|
+
loadSession,
|
|
147
|
+
updateShipping,
|
|
148
|
+
updateBilling,
|
|
149
|
+
applyPromo,
|
|
150
|
+
confirmPayment,
|
|
151
|
+
cancel,
|
|
152
|
+
goToStep,
|
|
153
|
+
nextStep,
|
|
154
|
+
prevStep,
|
|
155
|
+
redirectToHosted,
|
|
156
|
+
openPopup
|
|
157
|
+
};
|
|
158
|
+
return (_jsx(CheckoutContext.Provider, { value: value, children: children }));
|
|
159
|
+
}
|
|
160
|
+
export function useCheckout() {
|
|
161
|
+
const context = useContext(CheckoutContext);
|
|
162
|
+
if (!context) {
|
|
163
|
+
throw new Error('useCheckout must be used within a CheckoutProvider');
|
|
164
|
+
}
|
|
165
|
+
return context;
|
|
166
|
+
}
|
|
167
|
+
export default useCheckout;
|
|
168
|
+
//# sourceMappingURL=use-checkout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-checkout.js","sourceRoot":"","sources":["../../hooks/use-checkout.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @libreapps/checkout
|
|
3
|
+
*
|
|
4
|
+
* Embeddable checkout widget for LibreApps Commerce
|
|
5
|
+
* Similar to Stripe Checkout
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
*
|
|
9
|
+
* 1. React Integration:
|
|
10
|
+
* ```tsx
|
|
11
|
+
* import { CheckoutProvider, CheckoutForm, useCheckout } from '@libreapps/checkout'
|
|
12
|
+
*
|
|
13
|
+
* function App() {
|
|
14
|
+
* return (
|
|
15
|
+
* <CheckoutProvider options={{ apiKey: 'pk_live_xxx' }}>
|
|
16
|
+
* <CheckoutForm />
|
|
17
|
+
* </CheckoutProvider>
|
|
18
|
+
* )
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* 2. Vanilla JS / Redirect:
|
|
23
|
+
* ```ts
|
|
24
|
+
* import { createCheckout } from '@libreapps/checkout'
|
|
25
|
+
*
|
|
26
|
+
* const checkout = createCheckout({ apiKey: 'pk_live_xxx' })
|
|
27
|
+
* const session = await checkout.createSession({
|
|
28
|
+
* lineItems: [{ name: 'Product', unitPrice: 1999, quantity: 1 }]
|
|
29
|
+
* })
|
|
30
|
+
* checkout.redirectToCheckout(session.id)
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* 3. Embed Script (no build step):
|
|
34
|
+
* ```html
|
|
35
|
+
* <script src="https://js.libreapps.com/checkout.js"></script>
|
|
36
|
+
* <button data-libreapps-checkout data-libreapps-key="pk_live_xxx" data-libreapps-amount="1999">
|
|
37
|
+
* Pay $19.99
|
|
38
|
+
* </button>
|
|
39
|
+
* <script>
|
|
40
|
+
* LibreAppsCheckout.init('pk_live_xxx')
|
|
41
|
+
* </script>
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export type { CheckoutOptions, CheckoutAppearance, CheckoutSession, CheckoutLineItem, CheckoutCustomer, CheckoutAddress, CheckoutPaymentMethod, CheckoutResult, CheckoutError, CreateSessionParams, ElementsOptions, CheckoutStep, CheckoutState } from './types';
|
|
45
|
+
export { LibreAppsCheckout, createCheckout } from './client';
|
|
46
|
+
export { CheckoutProvider, useCheckout } from './hooks';
|
|
47
|
+
export type { CheckoutProviderProps } from './hooks';
|
|
48
|
+
export { CheckoutForm } from './elements';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @libreapps/checkout
|
|
3
|
+
*
|
|
4
|
+
* Embeddable checkout widget for LibreApps Commerce
|
|
5
|
+
* Similar to Stripe Checkout
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
*
|
|
9
|
+
* 1. React Integration:
|
|
10
|
+
* ```tsx
|
|
11
|
+
* import { CheckoutProvider, CheckoutForm, useCheckout } from '@libreapps/checkout'
|
|
12
|
+
*
|
|
13
|
+
* function App() {
|
|
14
|
+
* return (
|
|
15
|
+
* <CheckoutProvider options={{ apiKey: 'pk_live_xxx' }}>
|
|
16
|
+
* <CheckoutForm />
|
|
17
|
+
* </CheckoutProvider>
|
|
18
|
+
* )
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* 2. Vanilla JS / Redirect:
|
|
23
|
+
* ```ts
|
|
24
|
+
* import { createCheckout } from '@libreapps/checkout'
|
|
25
|
+
*
|
|
26
|
+
* const checkout = createCheckout({ apiKey: 'pk_live_xxx' })
|
|
27
|
+
* const session = await checkout.createSession({
|
|
28
|
+
* lineItems: [{ name: 'Product', unitPrice: 1999, quantity: 1 }]
|
|
29
|
+
* })
|
|
30
|
+
* checkout.redirectToCheckout(session.id)
|
|
31
|
+
* ```
|
|
32
|
+
*
|
|
33
|
+
* 3. Embed Script (no build step):
|
|
34
|
+
* ```html
|
|
35
|
+
* <script src="https://js.libreapps.com/checkout.js"></script>
|
|
36
|
+
* <button data-libreapps-checkout data-libreapps-key="pk_live_xxx" data-libreapps-amount="1999">
|
|
37
|
+
* Pay $19.99
|
|
38
|
+
* </button>
|
|
39
|
+
* <script>
|
|
40
|
+
* LibreAppsCheckout.init('pk_live_xxx')
|
|
41
|
+
* </script>
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
// Client
|
|
45
|
+
export { LibreAppsCheckout, createCheckout } from './client';
|
|
46
|
+
// Hooks
|
|
47
|
+
export { CheckoutProvider, useCheckout } from './hooks';
|
|
48
|
+
// Elements
|
|
49
|
+
export { CheckoutForm } from './elements';
|
|
50
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAmBH,SAAS;AACT,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAE5D,QAAQ;AACR,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAGvD,WAAW;AACX,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @libreapps/checkout - Type definitions
|
|
3
|
+
*
|
|
4
|
+
* Stripe-like checkout widget for LibreApps Commerce
|
|
5
|
+
*/
|
|
6
|
+
export interface CheckoutOptions {
|
|
7
|
+
/** LibreApps API key (publishable key) */
|
|
8
|
+
apiKey: string;
|
|
9
|
+
/** Environment: 'production' | 'sandbox' */
|
|
10
|
+
mode?: 'production' | 'sandbox';
|
|
11
|
+
/** Custom API endpoint */
|
|
12
|
+
apiEndpoint?: string;
|
|
13
|
+
/** Locale for i18n */
|
|
14
|
+
locale?: string;
|
|
15
|
+
/** Theme configuration */
|
|
16
|
+
appearance?: CheckoutAppearance;
|
|
17
|
+
/** Callbacks */
|
|
18
|
+
onSuccess?: (result: CheckoutResult) => void;
|
|
19
|
+
onError?: (error: CheckoutError) => void;
|
|
20
|
+
onCancel?: () => void;
|
|
21
|
+
/** Enable test mode */
|
|
22
|
+
testMode?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface CheckoutAppearance {
|
|
25
|
+
/** Theme: 'light' | 'dark' | 'auto' */
|
|
26
|
+
theme?: 'light' | 'dark' | 'auto';
|
|
27
|
+
/** Primary brand color */
|
|
28
|
+
primaryColor?: string;
|
|
29
|
+
/** Background color */
|
|
30
|
+
backgroundColor?: string;
|
|
31
|
+
/** Border radius */
|
|
32
|
+
borderRadius?: string;
|
|
33
|
+
/** Font family */
|
|
34
|
+
fontFamily?: string;
|
|
35
|
+
/** Custom CSS variables */
|
|
36
|
+
variables?: Record<string, string>;
|
|
37
|
+
/** Custom CSS rules */
|
|
38
|
+
rules?: Record<string, Record<string, string>>;
|
|
39
|
+
}
|
|
40
|
+
export interface CheckoutSession {
|
|
41
|
+
/** Session ID */
|
|
42
|
+
id: string;
|
|
43
|
+
/** Session status */
|
|
44
|
+
status: 'pending' | 'processing' | 'completed' | 'failed' | 'cancelled';
|
|
45
|
+
/** Line items */
|
|
46
|
+
lineItems: CheckoutLineItem[];
|
|
47
|
+
/** Subtotal in cents */
|
|
48
|
+
subtotal: number;
|
|
49
|
+
/** Tax amount in cents */
|
|
50
|
+
tax: number;
|
|
51
|
+
/** Shipping cost in cents */
|
|
52
|
+
shipping: number;
|
|
53
|
+
/** Total in cents */
|
|
54
|
+
total: number;
|
|
55
|
+
/** Currency code */
|
|
56
|
+
currency: string;
|
|
57
|
+
/** Customer info */
|
|
58
|
+
customer?: CheckoutCustomer;
|
|
59
|
+
/** Shipping address */
|
|
60
|
+
shippingAddress?: CheckoutAddress;
|
|
61
|
+
/** Billing address */
|
|
62
|
+
billingAddress?: CheckoutAddress;
|
|
63
|
+
/** Payment method */
|
|
64
|
+
paymentMethod?: CheckoutPaymentMethod;
|
|
65
|
+
/** Metadata */
|
|
66
|
+
metadata?: Record<string, string>;
|
|
67
|
+
/** URLs */
|
|
68
|
+
successUrl?: string;
|
|
69
|
+
cancelUrl?: string;
|
|
70
|
+
/** Expiration */
|
|
71
|
+
expiresAt?: string;
|
|
72
|
+
/** Timestamps */
|
|
73
|
+
createdAt: string;
|
|
74
|
+
updatedAt: string;
|
|
75
|
+
}
|
|
76
|
+
export interface CheckoutLineItem {
|
|
77
|
+
/** Item ID */
|
|
78
|
+
id: string;
|
|
79
|
+
/** Product ID */
|
|
80
|
+
productId: string;
|
|
81
|
+
/** SKU */
|
|
82
|
+
sku?: string;
|
|
83
|
+
/** Name */
|
|
84
|
+
name: string;
|
|
85
|
+
/** Description */
|
|
86
|
+
description?: string;
|
|
87
|
+
/** Image URL */
|
|
88
|
+
imageUrl?: string;
|
|
89
|
+
/** Quantity */
|
|
90
|
+
quantity: number;
|
|
91
|
+
/** Unit price in cents */
|
|
92
|
+
unitPrice: number;
|
|
93
|
+
/** Total price in cents */
|
|
94
|
+
totalPrice: number;
|
|
95
|
+
/** Currency */
|
|
96
|
+
currency: string;
|
|
97
|
+
/** Metadata */
|
|
98
|
+
metadata?: Record<string, string>;
|
|
99
|
+
}
|
|
100
|
+
export interface CheckoutCustomer {
|
|
101
|
+
/** Customer ID */
|
|
102
|
+
id?: string;
|
|
103
|
+
/** Email */
|
|
104
|
+
email: string;
|
|
105
|
+
/** Name */
|
|
106
|
+
name?: string;
|
|
107
|
+
/** Phone */
|
|
108
|
+
phone?: string;
|
|
109
|
+
}
|
|
110
|
+
export interface CheckoutAddress {
|
|
111
|
+
/** Address line 1 */
|
|
112
|
+
line1: string;
|
|
113
|
+
/** Address line 2 */
|
|
114
|
+
line2?: string;
|
|
115
|
+
/** City */
|
|
116
|
+
city: string;
|
|
117
|
+
/** State/Province */
|
|
118
|
+
state?: string;
|
|
119
|
+
/** Postal code */
|
|
120
|
+
postalCode: string;
|
|
121
|
+
/** Country code (ISO 3166-1 alpha-2) */
|
|
122
|
+
country: string;
|
|
123
|
+
}
|
|
124
|
+
export interface CheckoutPaymentMethod {
|
|
125
|
+
/** Payment method type */
|
|
126
|
+
type: 'card' | 'crypto' | 'apple_pay' | 'google_pay' | 'bank_transfer';
|
|
127
|
+
/** Card details (if type is 'card') */
|
|
128
|
+
card?: {
|
|
129
|
+
brand: string;
|
|
130
|
+
last4: string;
|
|
131
|
+
expMonth: number;
|
|
132
|
+
expYear: number;
|
|
133
|
+
};
|
|
134
|
+
/** Crypto details (if type is 'crypto') */
|
|
135
|
+
crypto?: {
|
|
136
|
+
currency: string;
|
|
137
|
+
network: string;
|
|
138
|
+
address: string;
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
export interface CheckoutResult {
|
|
142
|
+
/** Session ID */
|
|
143
|
+
sessionId: string;
|
|
144
|
+
/** Order ID */
|
|
145
|
+
orderId: string;
|
|
146
|
+
/** Status */
|
|
147
|
+
status: 'success' | 'pending';
|
|
148
|
+
/** Payment intent ID */
|
|
149
|
+
paymentIntentId?: string;
|
|
150
|
+
/** Customer ID */
|
|
151
|
+
customerId?: string;
|
|
152
|
+
/** Receipt URL */
|
|
153
|
+
receiptUrl?: string;
|
|
154
|
+
}
|
|
155
|
+
export interface CheckoutError {
|
|
156
|
+
/** Error code */
|
|
157
|
+
code: string;
|
|
158
|
+
/** Error message */
|
|
159
|
+
message: string;
|
|
160
|
+
/** Additional details */
|
|
161
|
+
details?: Record<string, unknown>;
|
|
162
|
+
}
|
|
163
|
+
export interface CreateSessionParams {
|
|
164
|
+
/** Line items */
|
|
165
|
+
lineItems: Array<{
|
|
166
|
+
productId?: string;
|
|
167
|
+
sku?: string;
|
|
168
|
+
name: string;
|
|
169
|
+
description?: string;
|
|
170
|
+
imageUrl?: string;
|
|
171
|
+
quantity: number;
|
|
172
|
+
unitPrice: number;
|
|
173
|
+
currency?: string;
|
|
174
|
+
metadata?: Record<string, string>;
|
|
175
|
+
}>;
|
|
176
|
+
/** Customer info */
|
|
177
|
+
customer?: {
|
|
178
|
+
email: string;
|
|
179
|
+
name?: string;
|
|
180
|
+
phone?: string;
|
|
181
|
+
};
|
|
182
|
+
/** Success URL */
|
|
183
|
+
successUrl?: string;
|
|
184
|
+
/** Cancel URL */
|
|
185
|
+
cancelUrl?: string;
|
|
186
|
+
/** Currency code */
|
|
187
|
+
currency?: string;
|
|
188
|
+
/** Metadata */
|
|
189
|
+
metadata?: Record<string, string>;
|
|
190
|
+
/** Enable shipping */
|
|
191
|
+
shipping?: boolean;
|
|
192
|
+
/** Collect phone */
|
|
193
|
+
collectPhone?: boolean;
|
|
194
|
+
/** Allowed payment methods */
|
|
195
|
+
paymentMethods?: Array<'card' | 'crypto' | 'apple_pay' | 'google_pay'>;
|
|
196
|
+
/** Promo code */
|
|
197
|
+
promoCode?: string;
|
|
198
|
+
}
|
|
199
|
+
export interface ElementsOptions {
|
|
200
|
+
/** Checkout session or session ID */
|
|
201
|
+
session: CheckoutSession | string;
|
|
202
|
+
/** Appearance options */
|
|
203
|
+
appearance?: CheckoutAppearance;
|
|
204
|
+
/** Locale */
|
|
205
|
+
locale?: string;
|
|
206
|
+
}
|
|
207
|
+
export type CheckoutStep = 'cart' | 'shipping' | 'payment' | 'confirmation';
|
|
208
|
+
export interface CheckoutState {
|
|
209
|
+
/** Current step */
|
|
210
|
+
step: CheckoutStep;
|
|
211
|
+
/** Session data */
|
|
212
|
+
session: CheckoutSession | null;
|
|
213
|
+
/** Loading state */
|
|
214
|
+
isLoading: boolean;
|
|
215
|
+
/** Error state */
|
|
216
|
+
error: CheckoutError | null;
|
|
217
|
+
/** Processing payment */
|
|
218
|
+
isProcessing: boolean;
|
|
219
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|