@rotateprotocol/sdk 1.0.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.
Files changed (74) hide show
  1. package/README.md +453 -0
  2. package/dist/catalog.d.ts +112 -0
  3. package/dist/catalog.d.ts.map +1 -0
  4. package/dist/catalog.js +210 -0
  5. package/dist/catalog.js.map +1 -0
  6. package/dist/components/CheckoutForm.d.ts +86 -0
  7. package/dist/components/CheckoutForm.d.ts.map +1 -0
  8. package/dist/components/CheckoutForm.js +332 -0
  9. package/dist/components/CheckoutForm.js.map +1 -0
  10. package/dist/components/HostedCheckout.d.ts +57 -0
  11. package/dist/components/HostedCheckout.d.ts.map +1 -0
  12. package/dist/components/HostedCheckout.js +414 -0
  13. package/dist/components/HostedCheckout.js.map +1 -0
  14. package/dist/components/PaymentButton.d.ts +80 -0
  15. package/dist/components/PaymentButton.d.ts.map +1 -0
  16. package/dist/components/PaymentButton.js +210 -0
  17. package/dist/components/PaymentButton.js.map +1 -0
  18. package/dist/components/RotateProvider.d.ts +115 -0
  19. package/dist/components/RotateProvider.d.ts.map +1 -0
  20. package/dist/components/RotateProvider.js +264 -0
  21. package/dist/components/RotateProvider.js.map +1 -0
  22. package/dist/components/index.d.ts +17 -0
  23. package/dist/components/index.d.ts.map +1 -0
  24. package/dist/components/index.js +27 -0
  25. package/dist/components/index.js.map +1 -0
  26. package/dist/embed.d.ts +85 -0
  27. package/dist/embed.d.ts.map +1 -0
  28. package/dist/embed.js +313 -0
  29. package/dist/embed.js.map +1 -0
  30. package/dist/hooks.d.ts +156 -0
  31. package/dist/hooks.d.ts.map +1 -0
  32. package/dist/hooks.js +280 -0
  33. package/dist/hooks.js.map +1 -0
  34. package/dist/idl/rotate_connect.json +2572 -0
  35. package/dist/index.d.ts +505 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +1197 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/marketplace.d.ts +257 -0
  40. package/dist/marketplace.d.ts.map +1 -0
  41. package/dist/marketplace.js +433 -0
  42. package/dist/marketplace.js.map +1 -0
  43. package/dist/platform.d.ts +234 -0
  44. package/dist/platform.d.ts.map +1 -0
  45. package/dist/platform.js +268 -0
  46. package/dist/platform.js.map +1 -0
  47. package/dist/react.d.ts +140 -0
  48. package/dist/react.d.ts.map +1 -0
  49. package/dist/react.js +429 -0
  50. package/dist/react.js.map +1 -0
  51. package/dist/store.d.ts +213 -0
  52. package/dist/store.d.ts.map +1 -0
  53. package/dist/store.js +404 -0
  54. package/dist/store.js.map +1 -0
  55. package/dist/webhooks.d.ts +149 -0
  56. package/dist/webhooks.d.ts.map +1 -0
  57. package/dist/webhooks.js +371 -0
  58. package/dist/webhooks.js.map +1 -0
  59. package/package.json +114 -0
  60. package/src/catalog.ts +299 -0
  61. package/src/components/CheckoutForm.tsx +608 -0
  62. package/src/components/HostedCheckout.tsx +675 -0
  63. package/src/components/PaymentButton.tsx +348 -0
  64. package/src/components/RotateProvider.tsx +370 -0
  65. package/src/components/index.ts +26 -0
  66. package/src/embed.ts +408 -0
  67. package/src/hooks.ts +518 -0
  68. package/src/idl/rotate_connect.json +2572 -0
  69. package/src/index.ts +1538 -0
  70. package/src/marketplace.ts +642 -0
  71. package/src/platform.ts +403 -0
  72. package/src/react.ts +459 -0
  73. package/src/store.ts +577 -0
  74. package/src/webhooks.ts +506 -0
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PaymentButton = PaymentButton;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ /**
6
+ * Rotate Payment Button
7
+ *
8
+ * Drop-in payment button that handles the entire checkout flow.
9
+ * Just add to your page and you're accepting payments!
10
+ *
11
+ * @example
12
+ * ```tsx
13
+ * // Simple usage - just amount!
14
+ * <PaymentButton amount={29.99} />
15
+ *
16
+ * // With customization
17
+ * <PaymentButton
18
+ * amount={99.99}
19
+ * currency="USD"
20
+ * label="Buy Now"
21
+ * description="Premium Plan"
22
+ * onSuccess={(payment) => console.log('Paid!', payment)}
23
+ * />
24
+ *
25
+ * // Styled button
26
+ * <PaymentButton
27
+ * amount={49.99}
28
+ * variant="outline"
29
+ * size="lg"
30
+ * className="my-custom-class"
31
+ * />
32
+ * ```
33
+ */
34
+ const react_1 = require("react");
35
+ const RotateProvider_1 = require("./RotateProvider");
36
+ // ==================== STYLES ====================
37
+ const baseStyles = {
38
+ display: 'inline-flex',
39
+ alignItems: 'center',
40
+ justifyContent: 'center',
41
+ gap: '8px',
42
+ fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
43
+ fontWeight: 600,
44
+ border: 'none',
45
+ borderRadius: '8px',
46
+ cursor: 'pointer',
47
+ transition: 'all 0.2s ease',
48
+ position: 'relative',
49
+ overflow: 'hidden',
50
+ };
51
+ const sizeStyles = {
52
+ sm: { padding: '8px 16px', fontSize: '14px', borderRadius: '6px' },
53
+ md: { padding: '12px 24px', fontSize: '16px', borderRadius: '8px' },
54
+ lg: { padding: '16px 32px', fontSize: '18px', borderRadius: '10px' },
55
+ };
56
+ const variantStyles = {
57
+ solid: (color) => ({
58
+ background: `linear-gradient(135deg, ${color} 0%, ${adjustColor(color, -20)} 100%)`,
59
+ color: '#ffffff',
60
+ boxShadow: `0 4px 14px ${color}40`,
61
+ }),
62
+ outline: (color) => ({
63
+ background: 'transparent',
64
+ color: color,
65
+ border: `2px solid ${color}`,
66
+ boxShadow: 'none',
67
+ }),
68
+ ghost: (color) => ({
69
+ background: `${color}15`,
70
+ color: color,
71
+ border: 'none',
72
+ boxShadow: 'none',
73
+ }),
74
+ };
75
+ function adjustColor(hex, percent) {
76
+ const num = parseInt(hex.replace('#', ''), 16);
77
+ const amt = Math.round(2.55 * percent);
78
+ const R = (num >> 16) + amt;
79
+ const G = (num >> 8 & 0x00FF) + amt;
80
+ const B = (num & 0x0000FF) + amt;
81
+ return '#' + (0x1000000 +
82
+ (R < 255 ? R < 1 ? 0 : R : 255) * 0x10000 +
83
+ (G < 255 ? G < 1 ? 0 : G : 255) * 0x100 +
84
+ (B < 255 ? B < 1 ? 0 : B : 255)).toString(16).slice(1);
85
+ }
86
+ // ==================== ICONS ====================
87
+ const WalletIcon = () => ((0, jsx_runtime_1.jsxs)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: [(0, jsx_runtime_1.jsx)("path", { d: "M21 12V7H5a2 2 0 0 1 0-4h14v4" }), (0, jsx_runtime_1.jsx)("path", { d: "M3 5v14a2 2 0 0 0 2 2h16v-5" }), (0, jsx_runtime_1.jsx)("path", { d: "M18 12a2 2 0 0 0 0 4h4v-4h-4z" })] }));
88
+ const SpinnerIcon = () => ((0, jsx_runtime_1.jsxs)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", style: { animation: 'rotate-spin 1s linear infinite' }, children: [(0, jsx_runtime_1.jsx)("circle", { cx: "12", cy: "12", r: "10", strokeOpacity: "0.25" }), (0, jsx_runtime_1.jsx)("path", { d: "M12 2a10 10 0 0 1 10 10", strokeLinecap: "round" })] }));
89
+ const CheckIcon = () => ((0, jsx_runtime_1.jsx)("svg", { width: "20", height: "20", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: (0, jsx_runtime_1.jsx)("polyline", { points: "20 6 9 17 4 12" }) }));
90
+ // ==================== COMPONENT ====================
91
+ function PaymentButton({ amount, currency = 'USD', label, description, orderRef, allowTips = false, variant = 'solid', size = 'md', disabled = false, className = '', style = {}, onSuccess, onError, onCancel, onLoadingChange, popup = true, successUrl, cancelUrl, metadata, }) {
92
+ const { config, createCheckoutSession, getCheckoutUrl, calculateTotal } = (0, RotateProvider_1.useRotateContext)();
93
+ const [loading, setLoading] = (0, react_1.useState)(false);
94
+ const [success, setSuccess] = (0, react_1.useState)(false);
95
+ const brandColor = config.brandColor || '#8B5CF6';
96
+ const { total } = calculateTotal(amount);
97
+ // Format amount for display
98
+ const formatAmount = (amt, curr) => {
99
+ if (curr === 'SOL') {
100
+ return `${amt.toFixed(amt < 1 ? 4 : 2)} SOL`;
101
+ }
102
+ return `$${amt.toFixed(2)}`;
103
+ };
104
+ const buttonLabel = label || `Pay ${formatAmount(total, currency)}`;
105
+ // Handle payment click
106
+ const handleClick = (0, react_1.useCallback)(async () => {
107
+ if (disabled || loading || success)
108
+ return;
109
+ setLoading(true);
110
+ onLoadingChange?.(true);
111
+ try {
112
+ // Create checkout session
113
+ const session = await createCheckoutSession({
114
+ amount,
115
+ currency,
116
+ description,
117
+ orderRef,
118
+ allowTips,
119
+ successUrl: successUrl || config.successUrl,
120
+ cancelUrl: cancelUrl || config.cancelUrl,
121
+ metadata,
122
+ });
123
+ // Get checkout URL
124
+ const checkoutUrl = getCheckoutUrl(session.linkId);
125
+ if (popup) {
126
+ // Open in popup window
127
+ const width = 450;
128
+ const height = 700;
129
+ const left = window.screenX + (window.outerWidth - width) / 2;
130
+ const top = window.screenY + (window.outerHeight - height) / 2;
131
+ const popupWindow = window.open(checkoutUrl, 'rotate_checkout', `width=${width},height=${height},left=${left},top=${top},popup=1`);
132
+ // Listen for popup close or success message
133
+ if (popupWindow) {
134
+ const checkClosed = setInterval(() => {
135
+ if (popupWindow.closed) {
136
+ clearInterval(checkClosed);
137
+ setLoading(false);
138
+ onLoadingChange?.(false);
139
+ // Could be cancelled or completed
140
+ }
141
+ }, 500);
142
+ // Listen for postMessage from checkout
143
+ window.addEventListener('message', function handler(event) {
144
+ if (event.data?.type === 'rotate_payment_success') {
145
+ clearInterval(checkClosed);
146
+ setLoading(false);
147
+ setSuccess(true);
148
+ onLoadingChange?.(false);
149
+ onSuccess?.(event.data.payment);
150
+ popupWindow.close();
151
+ window.removeEventListener('message', handler);
152
+ // Reset success state after animation
153
+ setTimeout(() => setSuccess(false), 2000);
154
+ }
155
+ else if (event.data?.type === 'rotate_payment_cancel') {
156
+ clearInterval(checkClosed);
157
+ setLoading(false);
158
+ onLoadingChange?.(false);
159
+ onCancel?.();
160
+ popupWindow.close();
161
+ window.removeEventListener('message', handler);
162
+ }
163
+ });
164
+ }
165
+ }
166
+ else {
167
+ // Redirect to checkout
168
+ window.location.href = checkoutUrl;
169
+ }
170
+ }
171
+ catch (error) {
172
+ setLoading(false);
173
+ onLoadingChange?.(false);
174
+ onError?.(error);
175
+ }
176
+ }, [
177
+ amount, currency, description, orderRef, allowTips,
178
+ disabled, loading, success, popup,
179
+ config, createCheckoutSession, getCheckoutUrl,
180
+ successUrl, cancelUrl, metadata,
181
+ onSuccess, onError, onCancel, onLoadingChange,
182
+ ]);
183
+ // Combine styles
184
+ const combinedStyles = {
185
+ ...baseStyles,
186
+ ...sizeStyles[size],
187
+ ...variantStyles[variant](brandColor),
188
+ ...(disabled && { opacity: 0.5, cursor: 'not-allowed' }),
189
+ ...(success && {
190
+ background: '#10B981',
191
+ boxShadow: '0 4px 14px rgba(16, 185, 129, 0.4)',
192
+ }),
193
+ ...style,
194
+ };
195
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("style", { children: `
196
+ @keyframes rotate-spin {
197
+ from { transform: rotate(0deg); }
198
+ to { transform: rotate(360deg); }
199
+ }
200
+ .rotate-btn:hover:not(:disabled) {
201
+ transform: translateY(-2px);
202
+ filter: brightness(1.1);
203
+ }
204
+ .rotate-btn:active:not(:disabled) {
205
+ transform: translateY(0);
206
+ }
207
+ ` }), (0, jsx_runtime_1.jsx)("button", { className: `rotate-btn ${className}`, style: combinedStyles, onClick: handleClick, disabled: disabled || loading, type: "button", children: success ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(CheckIcon, {}), (0, jsx_runtime_1.jsx)("span", { children: "Paid!" })] })) : loading ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(SpinnerIcon, {}), (0, jsx_runtime_1.jsx)("span", { children: "Processing..." })] })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(WalletIcon, {}), (0, jsx_runtime_1.jsx)("span", { children: buttonLabel })] })) })] }));
208
+ }
209
+ exports.default = PaymentButton;
210
+ //# sourceMappingURL=PaymentButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaymentButton.js","sourceRoot":"","sources":["../../src/components/PaymentButton.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Rotate Provider - Context Wrapper
3
+ *
4
+ * Provides Rotate SDK context to your entire app with one simple wrapper.
5
+ * Wrap your app once, and all Rotate components will work seamlessly.
6
+ *
7
+ * @example
8
+ * ```tsx
9
+ * import { RotateProvider } from '@rotateprotocol/sdk/components';
10
+ *
11
+ * function App() {
12
+ * return (
13
+ * <RotateProvider
14
+ * merchantId={1000000}
15
+ * platformId={1000000}
16
+ * network="mainnet-beta"
17
+ * >
18
+ * <YourApp />
19
+ * </RotateProvider>
20
+ * );
21
+ * }
22
+ * ```
23
+ */
24
+ import { ReactNode } from 'react';
25
+ import RotateSDK, { Network, Platform, Merchant } from '../index';
26
+ export interface RotateConfig {
27
+ /** Your merchant ID (7-digit number) */
28
+ merchantId: number;
29
+ /** Platform ID (7-digit number) */
30
+ platformId: number;
31
+ /** Network to use */
32
+ network?: Network;
33
+ /** Custom RPC endpoint */
34
+ rpcEndpoint?: string;
35
+ /** Your brand name (shown on checkout) */
36
+ brandName?: string;
37
+ /** Your brand logo URL */
38
+ brandLogo?: string;
39
+ /** Primary brand color (hex) */
40
+ brandColor?: string;
41
+ /** Success redirect URL */
42
+ successUrl?: string;
43
+ /** Cancel redirect URL */
44
+ cancelUrl?: string;
45
+ /** Webhook URL for payment notifications */
46
+ webhookUrl?: string;
47
+ /** Custom checkout base URL (default: https://rotate.app) */
48
+ checkoutBaseUrl?: string;
49
+ }
50
+ export interface CheckoutSession {
51
+ id: string;
52
+ linkId: number;
53
+ amount: number;
54
+ currency: 'SOL' | 'USDC' | 'USDT' | 'USD';
55
+ status: 'pending' | 'paid' | 'expired' | 'cancelled';
56
+ createdAt: number;
57
+ expiresAt?: number;
58
+ metadata?: Record<string, string>;
59
+ }
60
+ export interface RotateContextType {
61
+ config: RotateConfig;
62
+ sdk: RotateSDK;
63
+ connected: boolean;
64
+ merchant: Merchant | null;
65
+ platform: Platform | null;
66
+ createCheckoutSession: (params: CreateCheckoutParams) => Promise<CheckoutSession>;
67
+ getCheckoutUrl: (linkId: number) => string;
68
+ calculateTotal: (amount: number) => {
69
+ subtotal: number;
70
+ fees: number;
71
+ total: number;
72
+ merchantReceives: number;
73
+ };
74
+ loading: boolean;
75
+ error: string | null;
76
+ }
77
+ export interface CreateCheckoutParams {
78
+ /** Amount in the specified currency */
79
+ amount: number;
80
+ /** Currency (default: USD) */
81
+ currency?: 'SOL' | 'USDC' | 'USDT' | 'USD';
82
+ /** Order description */
83
+ description?: string;
84
+ /** Order reference (your order ID) */
85
+ orderRef?: string;
86
+ /** Allow customer tips */
87
+ allowTips?: boolean;
88
+ /** Expiration in seconds (default: 3600 = 1 hour) */
89
+ expiresIn?: number;
90
+ /** Custom metadata */
91
+ metadata?: Record<string, string>;
92
+ /** Success redirect URL (overrides provider config) */
93
+ successUrl?: string;
94
+ /** Cancel redirect URL (overrides provider config) */
95
+ cancelUrl?: string;
96
+ }
97
+ export interface RotateProviderProps {
98
+ children: ReactNode;
99
+ merchantId: number;
100
+ platformId: number;
101
+ network?: Network;
102
+ rpcEndpoint?: string;
103
+ brandName?: string;
104
+ brandLogo?: string;
105
+ brandColor?: string;
106
+ successUrl?: string;
107
+ cancelUrl?: string;
108
+ webhookUrl?: string;
109
+ /** Custom checkout base URL (default: https://rotate.app) */
110
+ checkoutBaseUrl?: string;
111
+ }
112
+ export declare function RotateProvider({ children, merchantId, platformId, network, rpcEndpoint, brandName, brandLogo, brandColor, successUrl, cancelUrl, webhookUrl, checkoutBaseUrl, }: RotateProviderProps): import("react/jsx-runtime").JSX.Element;
113
+ export declare function useRotateContext(): RotateContextType;
114
+ export default RotateProvider;
115
+ //# sourceMappingURL=RotateProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RotateProvider.d.ts","sourceRoot":"","sources":["../../src/components/RotateProvider.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.RotateProvider = RotateProvider;
37
+ exports.useRotateContext = useRotateContext;
38
+ const jsx_runtime_1 = require("react/jsx-runtime");
39
+ /**
40
+ * Rotate Provider - Context Wrapper
41
+ *
42
+ * Provides Rotate SDK context to your entire app with one simple wrapper.
43
+ * Wrap your app once, and all Rotate components will work seamlessly.
44
+ *
45
+ * @example
46
+ * ```tsx
47
+ * import { RotateProvider } from '@rotateprotocol/sdk/components';
48
+ *
49
+ * function App() {
50
+ * return (
51
+ * <RotateProvider
52
+ * merchantId={1000000}
53
+ * platformId={1000000}
54
+ * network="mainnet-beta"
55
+ * >
56
+ * <YourApp />
57
+ * </RotateProvider>
58
+ * );
59
+ * }
60
+ * ```
61
+ */
62
+ const react_1 = require("react");
63
+ const index_1 = __importStar(require("../index"));
64
+ // ==================== CONTEXT ====================
65
+ const RotateContext = (0, react_1.createContext)(null);
66
+ function RotateProvider({ children, merchantId, platformId, network = 'mainnet-beta', rpcEndpoint, brandName, brandLogo, brandColor = '#8B5CF6', successUrl, cancelUrl, webhookUrl, checkoutBaseUrl, }) {
67
+ const [merchant, setMerchant] = (0, react_1.useState)(null);
68
+ const [platform, setPlatform] = (0, react_1.useState)(null);
69
+ const [loading, setLoading] = (0, react_1.useState)(true);
70
+ const [error, setError] = (0, react_1.useState)(null);
71
+ const [connected, setConnected] = (0, react_1.useState)(false);
72
+ // Config object
73
+ const config = (0, react_1.useMemo)(() => ({
74
+ merchantId,
75
+ platformId,
76
+ network,
77
+ rpcEndpoint,
78
+ brandName,
79
+ brandLogo,
80
+ brandColor,
81
+ successUrl,
82
+ cancelUrl,
83
+ webhookUrl,
84
+ checkoutBaseUrl,
85
+ }), [merchantId, platformId, network, rpcEndpoint, brandName, brandLogo, brandColor, successUrl, cancelUrl, webhookUrl, checkoutBaseUrl]);
86
+ // Initialize SDK
87
+ const sdk = (0, react_1.useMemo)(() => {
88
+ return new index_1.default({
89
+ network,
90
+ rpcEndpoint,
91
+ });
92
+ }, [network, rpcEndpoint]);
93
+ // Load merchant and platform data
94
+ (0, react_1.useEffect)(() => {
95
+ async function loadData() {
96
+ setLoading(true);
97
+ setError(null);
98
+ try {
99
+ const [merchantData, platformData] = await Promise.all([
100
+ sdk.getMerchant(merchantId),
101
+ sdk.getPlatform(platformId),
102
+ ]);
103
+ if (!merchantData) {
104
+ setError(`Merchant #${merchantId} not found`);
105
+ }
106
+ else if (!platformData) {
107
+ setError(`Platform #${platformId} not found`);
108
+ }
109
+ else {
110
+ setMerchant(merchantData);
111
+ setPlatform(platformData);
112
+ setConnected(true);
113
+ }
114
+ }
115
+ catch (e) {
116
+ setError(e.message);
117
+ }
118
+ finally {
119
+ setLoading(false);
120
+ }
121
+ }
122
+ loadData();
123
+ }, [sdk, merchantId, platformId]);
124
+ // Calculate total with fees
125
+ // `amount` is in human-readable units (e.g. dollars).
126
+ // calculateFees uses integer math, so we convert to micro-units first,
127
+ // then convert back to dollars for display.
128
+ const calculateTotal = (0, react_1.useCallback)((amount) => {
129
+ const platformFeeBps = platform?.feeBps || 0;
130
+ const microAmount = Math.floor(amount * 1000000);
131
+ const fees = (0, index_1.calculateFees)(microAmount, platformFeeBps);
132
+ return {
133
+ subtotal: amount,
134
+ fees: fees.buyerFeeShare / 1000000,
135
+ total: fees.buyerPays / 1000000,
136
+ merchantReceives: fees.merchantReceives / 1000000,
137
+ };
138
+ }, [platform]);
139
+ // Create checkout session — creates a real on-chain payment link via the SDK
140
+ const createCheckoutSession = (0, react_1.useCallback)(async (params) => {
141
+ if (!merchant || !platform) {
142
+ throw new Error('Merchant or platform not loaded');
143
+ }
144
+ const currency = params.currency || 'USD';
145
+ const expiresAt = params.expiresIn
146
+ ? Math.floor(Date.now() / 1000) + params.expiresIn
147
+ : 0;
148
+ const orderRef = params.orderRef || Date.now().toString();
149
+ // Convert amount to on-chain micro-units (6 decimal places for USD/USDC/USDT, lamports for SOL)
150
+ let amountMicro;
151
+ if (currency === 'SOL') {
152
+ // params.amount is in SOL; convert to lamports
153
+ amountMicro = BigInt(Math.floor(params.amount * 1000000000));
154
+ }
155
+ else {
156
+ // USD / USDC / USDT: params.amount is in dollars; convert to micro-units (6 decimals)
157
+ amountMicro = BigInt(Math.floor(params.amount * 1000000));
158
+ }
159
+ let linkId;
160
+ let txSig;
161
+ try {
162
+ if (currency === 'SOL') {
163
+ // Create a SOL-denominated payment link
164
+ const result = await sdk.createLinkSol({
165
+ merchantId: config.merchantId,
166
+ platformId: config.platformId,
167
+ amount: amountMicro,
168
+ expiresAt,
169
+ allowTips: params.allowTips ?? false,
170
+ allowPartial: false,
171
+ orderRef,
172
+ });
173
+ linkId = result.linkId;
174
+ txSig = result.tx;
175
+ }
176
+ else if (currency === 'USDC' || currency === 'USDT') {
177
+ // Create a token-denominated payment link
178
+ const result = await sdk.createLinkToken({
179
+ merchantId: config.merchantId,
180
+ platformId: config.platformId,
181
+ amount: amountMicro,
182
+ expiresAt,
183
+ allowTips: params.allowTips ?? false,
184
+ allowPartial: false,
185
+ orderRef,
186
+ currency,
187
+ });
188
+ linkId = result.linkId;
189
+ txSig = result.tx;
190
+ }
191
+ else {
192
+ // USD-denominated link (buyer chooses SOL/USDC/USDT at payment time)
193
+ const result = await sdk.createLinkUsd({
194
+ merchantId: config.merchantId,
195
+ platformId: config.platformId,
196
+ amount: amountMicro,
197
+ expiresAt,
198
+ allowTips: params.allowTips ?? false,
199
+ allowPartial: false,
200
+ orderRef,
201
+ });
202
+ linkId = result.linkId;
203
+ txSig = result.tx;
204
+ }
205
+ }
206
+ catch (e) {
207
+ throw new Error(`Failed to create on-chain payment link: ${e.message}`);
208
+ }
209
+ return {
210
+ id: txSig,
211
+ linkId,
212
+ amount: params.amount,
213
+ currency,
214
+ status: 'pending',
215
+ createdAt: Date.now(),
216
+ expiresAt: expiresAt > 0 ? expiresAt * 1000 : undefined,
217
+ metadata: params.metadata,
218
+ };
219
+ }, [merchant, platform, sdk, config]);
220
+ // Get checkout URL — uses configurable base URL from config or environment
221
+ const getCheckoutUrl = (0, react_1.useCallback)((linkId) => {
222
+ const baseUrl = config.checkoutBaseUrl || 'https://rotate.app';
223
+ const params = new URLSearchParams({
224
+ link: linkId.toString(),
225
+ network: config.network || 'mainnet-beta',
226
+ merchant: merchantId.toString(),
227
+ platform: platformId.toString(),
228
+ });
229
+ if (config.brandName)
230
+ params.set('brand', config.brandName);
231
+ if (config.brandColor)
232
+ params.set('color', config.brandColor.replace('#', ''));
233
+ if (config.successUrl)
234
+ params.set('success', config.successUrl);
235
+ if (config.cancelUrl)
236
+ params.set('cancel', config.cancelUrl);
237
+ return `${baseUrl}/checkout/?${params.toString()}`;
238
+ }, [merchantId, platformId, config]);
239
+ // Context value
240
+ const value = (0, react_1.useMemo)(() => ({
241
+ config,
242
+ sdk,
243
+ connected,
244
+ merchant,
245
+ platform,
246
+ createCheckoutSession,
247
+ getCheckoutUrl,
248
+ calculateTotal,
249
+ loading,
250
+ error,
251
+ }), [config, sdk, connected, merchant, platform, createCheckoutSession, getCheckoutUrl, calculateTotal, loading, error]);
252
+ return ((0, jsx_runtime_1.jsx)(RotateContext.Provider, { value: value, children: children }));
253
+ }
254
+ // ==================== HOOK ====================
255
+ function useRotateContext() {
256
+ const context = (0, react_1.useContext)(RotateContext);
257
+ if (!context) {
258
+ throw new Error('useRotateContext must be used within a RotateProvider. ' +
259
+ 'Wrap your app with <RotateProvider merchantId={...} platformId={...}>');
260
+ }
261
+ return context;
262
+ }
263
+ exports.default = RotateProvider;
264
+ //# sourceMappingURL=RotateProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RotateProvider.js","sourceRoot":"","sources":["../../src/components/RotateProvider.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Rotate Protocol React Components
3
+ *
4
+ * Drop-in components for seamless payment integration on Solana.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ export { RotateProvider, useRotateContext } from './RotateProvider';
9
+ export type { RotateProviderProps, RotateConfig, RotateContextType, CheckoutSession, CreateCheckoutParams } from './RotateProvider';
10
+ export { PaymentButton } from './PaymentButton';
11
+ export type { PaymentButtonProps, PaymentResult } from './PaymentButton';
12
+ export { CheckoutForm } from './CheckoutForm';
13
+ export type { CheckoutFormProps } from './CheckoutForm';
14
+ export { HostedCheckout } from './HostedCheckout';
15
+ export type { HostedCheckoutProps } from './HostedCheckout';
16
+ export { RotateProvider as default } from './RotateProvider';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpE,YAAY,EAAE,mBAAmB,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGpI,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGzE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGxD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAG5D,OAAO,EAAE,cAAc,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC"}