@alphadevs_labs/upay-sdk 0.0.1 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +115 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -1
package/README.md
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# @alphadevs_labs/upay-sdk
|
|
2
|
+
|
|
3
|
+
The official SDK for [UPay](https://tryupay.xyz) — a Stripe-style crypto checkout. Drop a Pay button on any website and let customers pay with whatever tokens they hold, on whatever chain, in one tap. You receive your chosen stablecoin on your chosen chain, powered by [Particle Network Universal Accounts](https://particle.network).
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @alphadevs_labs/upay-sdk
|
|
9
|
+
# or
|
|
10
|
+
pnpm add @alphadevs_labs/upay-sdk
|
|
11
|
+
# or
|
|
12
|
+
yarn add @alphadevs_labs/upay-sdk
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Requires React ≥ 18 (only needed if you use `UPayButton`; the imperative `UPay` client has no React dependency).
|
|
16
|
+
|
|
17
|
+
## Quick start — React
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
import { UPayButton } from "@alphadevs_labs/upay-sdk";
|
|
21
|
+
|
|
22
|
+
export function CheckoutButton() {
|
|
23
|
+
return (
|
|
24
|
+
<UPayButton
|
|
25
|
+
apiKey="pk_live_..."
|
|
26
|
+
amount="40"
|
|
27
|
+
token="USDC"
|
|
28
|
+
chain="base"
|
|
29
|
+
onSuccess={(payment) => console.log("Paid!", payment.txHashes)}
|
|
30
|
+
onError={(err) => console.error(err)}
|
|
31
|
+
/>
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Clicking the button creates a checkout session against your UPay account and opens it in an embedded modal. On success, `onSuccess` fires with the completed payment.
|
|
37
|
+
|
|
38
|
+
## Quick start — imperative client
|
|
39
|
+
|
|
40
|
+
Use `UPay` directly if you're not in React, or want full control over the checkout flow:
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
import { UPay } from "@alphadevs_labs/upay-sdk";
|
|
44
|
+
|
|
45
|
+
const upay = new UPay({ apiKey: "pk_live_..." });
|
|
46
|
+
|
|
47
|
+
const session = await upay.createCheckout({
|
|
48
|
+
amount: "40",
|
|
49
|
+
token: "USDC",
|
|
50
|
+
chain: "base",
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
upay.openCheckout(session.id);
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Quick start — script tag (no build step)
|
|
57
|
+
|
|
58
|
+
```html
|
|
59
|
+
<script src="https://tryupay.xyz/sdk.js" defer></script>
|
|
60
|
+
|
|
61
|
+
<div
|
|
62
|
+
data-upay-button
|
|
63
|
+
data-key="pk_live_..."
|
|
64
|
+
data-amount="40"
|
|
65
|
+
data-token="USDC"
|
|
66
|
+
data-chain="base"
|
|
67
|
+
></div>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
The script scans the page for `[data-upay-button]` elements on load and mounts a working Pay button into each one.
|
|
71
|
+
|
|
72
|
+
## API reference
|
|
73
|
+
|
|
74
|
+
### `<UPayButton />`
|
|
75
|
+
|
|
76
|
+
| Prop | Type | Required | Description |
|
|
77
|
+
|---|---|---|---|
|
|
78
|
+
| `apiKey` | `string` | ✅ | Your publishable key (`pk_live_...`), safe to expose client-side. |
|
|
79
|
+
| `amount` | `string` | ✅ | Amount to charge, in the settlement token's units. |
|
|
80
|
+
| `baseUrl` | `string` | | Override the UPay API/checkout host. Defaults to the current origin. |
|
|
81
|
+
| `token` | `string` | | Settlement token override (e.g. `"USDC"`). |
|
|
82
|
+
| `chain` | `string` | | Settlement chain override (e.g. `"base"`). |
|
|
83
|
+
| `metadata` | `Record<string, unknown>` | | Arbitrary metadata attached to the session (order id, product id, etc.). |
|
|
84
|
+
| `label` | `string` | | Button text. Defaults to `"Pay with UPay"`. |
|
|
85
|
+
| `className` | `string` | | Use your own styles instead of the built-in gradient button. |
|
|
86
|
+
| `onSuccess` | `(payment: UPayPayment) => void` | | Called once the payment is confirmed. |
|
|
87
|
+
| `onError` | `(err: Error) => void` | | Called if session creation or checkout fails. |
|
|
88
|
+
|
|
89
|
+
### `new UPay(options)`
|
|
90
|
+
|
|
91
|
+
| Option | Type | Required | Description |
|
|
92
|
+
|---|---|---|---|
|
|
93
|
+
| `apiKey` | `string` | ✅ | Your publishable key. |
|
|
94
|
+
| `baseUrl` | `string` | | Override the UPay API/checkout host. |
|
|
95
|
+
|
|
96
|
+
**`upay.createCheckout(options)`** → `Promise<UPayCheckoutSession>`
|
|
97
|
+
|
|
98
|
+
| Option | Type | Required |
|
|
99
|
+
|---|---|---|
|
|
100
|
+
| `amount` | `string` | ✅ |
|
|
101
|
+
| `token` | `string` | |
|
|
102
|
+
| `chain` | `string` | |
|
|
103
|
+
| `metadata` | `Record<string, unknown>` | |
|
|
104
|
+
| `successUrl` | `string` | |
|
|
105
|
+
| `cancelUrl` | `string` | |
|
|
106
|
+
|
|
107
|
+
**`upay.openCheckout(sessionId)`** — mounts an embedded checkout modal (iframe) for the given session and handles close/resize/success messaging automatically.
|
|
108
|
+
|
|
109
|
+
## Getting API keys
|
|
110
|
+
|
|
111
|
+
Sign up and create a merchant account at [tryupay.xyz/dashboard](https://tryupay.xyz/dashboard) to get your publishable (`pk_live_...`) and secret (`sk_live_...`) keys. Only the publishable key is used by this SDK — never expose your secret key client-side.
|
|
112
|
+
|
|
113
|
+
## License
|
|
114
|
+
|
|
115
|
+
MIT
|
package/dist/index.js
CHANGED
|
@@ -117,7 +117,7 @@ var UPay = class {
|
|
|
117
117
|
"transition:height 0.2s ease",
|
|
118
118
|
"overflow:hidden"
|
|
119
119
|
].join(";");
|
|
120
|
-
iframe.allow = "payment";
|
|
120
|
+
iframe.allow = "payment; clipboard-write";
|
|
121
121
|
iframe.onload = () => {
|
|
122
122
|
spinner.remove();
|
|
123
123
|
iframe.style.display = "block";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/UPayButton.tsx","../src/client.ts"],"sourcesContent":["export { UPayButton } from \"./UPayButton\";\nexport { UPay } from \"./client\";\nexport type {\n UPayButtonProps,\n UPayPayment,\n UPayCheckoutSession,\n UPayClientOptions,\n CreateCheckoutOptions,\n} from \"./types\";\n","\"use client\";\n\nimport React, { useState, useCallback } from \"react\";\nimport { UPay } from \"./client\";\nimport type { UPayButtonProps, UPayPayment } from \"./types\";\n\nconst defaultStyles = {\n button: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"12px 24px\",\n background: \"linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)\",\n color: \"#fff\",\n border: \"none\",\n borderRadius: \"10px\",\n fontSize: \"15px\",\n fontWeight: \"600\",\n fontFamily: \"inherit\",\n cursor: \"pointer\",\n transition: \"opacity 0.15s, transform 0.1s\",\n minHeight: \"44px\",\n letterSpacing: \"-0.01em\",\n } as React.CSSProperties,\n loading: {\n opacity: 0.7,\n cursor: \"not-allowed\",\n } as React.CSSProperties,\n};\n\nconst UPayLogo = () => (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle cx=\"9\" cy=\"9\" r=\"8.5\" stroke=\"rgba(255,255,255,0.6)\" />\n <path\n d=\"M5.5 6.5L9 11.5L12.5 6.5\"\n stroke=\"white\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst Spinner = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n style={{ animation: \"upay-spin 0.8s linear infinite\" }}\n >\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n stroke=\"rgba(255,255,255,0.35)\"\n strokeWidth=\"2\"\n />\n <path\n d=\"M8 2a6 6 0 0 1 6 6\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n <style>{`@keyframes upay-spin{to{transform:rotate(360deg)}}`}</style>\n </svg>\n);\n\nexport function UPayButton({\n apiKey,\n baseUrl,\n amount,\n token,\n chain,\n metadata,\n onSuccess,\n onError,\n label = \"Pay with UPay\",\n className,\n}: UPayButtonProps) {\n const [loading, setLoading] = useState(false);\n\n const handleClick = useCallback(async () => {\n if (loading) return;\n setLoading(true);\n\n try {\n const client = new UPay({ apiKey, baseUrl });\n const session = await client.createCheckout({\n amount,\n token,\n chain,\n metadata,\n });\n client.openCheckout(session.id);\n\n const handleSuccess = (e: Event) => {\n const payment = (e as CustomEvent<UPayPayment>).detail;\n onSuccess?.(payment);\n window.removeEventListener(\"upay:payment-success\", handleSuccess);\n };\n window.addEventListener(\"upay:payment-success\", handleSuccess);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n onError?.(error);\n } finally {\n setLoading(false);\n }\n }, [loading, apiKey, amount, token, chain, metadata, onSuccess, onError]);\n\n return (\n <button\n onClick={handleClick}\n disabled={loading}\n className={className}\n style={\n className\n ? undefined\n : {\n ...defaultStyles.button,\n ...(loading ? defaultStyles.loading : {}),\n }\n }\n aria-label={loading ? \"Processing payment…\" : label}\n aria-busy={loading}\n >\n {loading ? <Spinner /> : <UPayLogo />}\n <span>{loading ? \"Opening checkout…\" : label}</span>\n </button>\n );\n}\n","import type {\n UPayClientOptions,\n CreateCheckoutOptions,\n UPayCheckoutSession,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL =\n typeof window !== \"undefined\"\n ? window.location.origin\n : \"http://localhost:3000\";\n\nexport class UPay {\n private apiKey: string;\n private baseUrl: string;\n\n constructor(options: UPayClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n }\n\n async createCheckout(\n options: CreateCheckoutOptions\n ): Promise<UPayCheckoutSession> {\n const res = await fetch(`${this.baseUrl}/api/v1/sessions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n amount: options.amount,\n token: options.token,\n chain: options.chain,\n metadata: options.metadata,\n success_url: options.successUrl,\n cancel_url: options.cancelUrl,\n }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(err.error ?? `HTTP ${res.status}`);\n }\n\n return res.json();\n }\n\n openCheckout(sessionId: string): void {\n const url = `${this.baseUrl}/checkout/${sessionId}`;\n\n if (typeof window === \"undefined\") return;\n\n const existingModal = document.getElementById(\"upay-modal-container\");\n if (existingModal) existingModal.remove();\n\n const container = document.createElement(\"div\");\n container.id = \"upay-modal-container\";\n container.style.cssText = [\n \"position:fixed\",\n \"inset:0\",\n \"z-index:2147483647\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:center\",\n \"background:rgba(0,0,0,0.6)\",\n \"backdrop-filter:blur(4px)\",\n ].join(\";\");\n\n // Spinner shown while iframe loads\n const spinner = document.createElement(\"div\");\n spinner.style.cssText = [\n \"width:min(480px,100vw)\",\n \"height:min(700px,100vh)\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:center\",\n \"border-radius:16px\",\n \"background:#fff\",\n ].join(\";\");\n spinner.innerHTML = `\n <style>@keyframes upay-modal-spin{to{transform:rotate(360deg)}}</style>\n <svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\"\n style=\"animation:upay-modal-spin 0.8s linear infinite\">\n <circle cx=\"18\" cy=\"18\" r=\"14\" stroke=\"#e5e7eb\" stroke-width=\"3\"/>\n <path d=\"M18 4a14 14 0 0 1 14 14\" stroke=\"#6366f1\"\n stroke-width=\"3\" stroke-linecap=\"round\"/>\n </svg>`;\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = url;\n iframe.style.cssText = [\n \"display:none\",\n \"width:min(480px,100vw)\",\n \"height:0\",\n \"max-height:90vh\",\n \"border:none\",\n \"border-radius:16px\",\n \"box-shadow:0 25px 50px rgba(0,0,0,0.4)\",\n \"transition:height 0.2s ease\",\n \"overflow:hidden\",\n ].join(\";\");\n iframe.allow = \"payment\";\n iframe.onload = () => {\n spinner.remove();\n iframe.style.display = \"block\";\n };\n\n const close = (): void => container.remove();\n\n container.addEventListener(\"click\", (e) => {\n if (e.target === container) close();\n });\n\n window.addEventListener(\n \"message\",\n (e) => {\n if (e.data?.type === \"upay:close\") close();\n if (e.data?.type === \"upay:height\") {\n const maxPx = window.innerHeight * 0.9;\n iframe.style.height = `${Math.min(e.data.height, maxPx)}px`;\n }\n if (e.data?.type === \"upay:success\") {\n close();\n window.dispatchEvent(\n new CustomEvent(\"upay:payment-success\", { detail: e.data.payment })\n );\n }\n },\n { once: false }\n );\n\n container.appendChild(spinner);\n container.appendChild(iframe);\n document.body.appendChild(container);\n }\n}\n"],"mappings":"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","names":["React"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/UPayButton.tsx","../src/client.ts"],"sourcesContent":["export { UPayButton } from \"./UPayButton\";\nexport { UPay } from \"./client\";\nexport type {\n UPayButtonProps,\n UPayPayment,\n UPayCheckoutSession,\n UPayClientOptions,\n CreateCheckoutOptions,\n} from \"./types\";\n","\"use client\";\n\nimport React, { useState, useCallback } from \"react\";\nimport { UPay } from \"./client\";\nimport type { UPayButtonProps, UPayPayment } from \"./types\";\n\nconst defaultStyles = {\n button: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"12px 24px\",\n background: \"linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)\",\n color: \"#fff\",\n border: \"none\",\n borderRadius: \"10px\",\n fontSize: \"15px\",\n fontWeight: \"600\",\n fontFamily: \"inherit\",\n cursor: \"pointer\",\n transition: \"opacity 0.15s, transform 0.1s\",\n minHeight: \"44px\",\n letterSpacing: \"-0.01em\",\n } as React.CSSProperties,\n loading: {\n opacity: 0.7,\n cursor: \"not-allowed\",\n } as React.CSSProperties,\n};\n\nconst UPayLogo = () => (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle cx=\"9\" cy=\"9\" r=\"8.5\" stroke=\"rgba(255,255,255,0.6)\" />\n <path\n d=\"M5.5 6.5L9 11.5L12.5 6.5\"\n stroke=\"white\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst Spinner = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n style={{ animation: \"upay-spin 0.8s linear infinite\" }}\n >\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n stroke=\"rgba(255,255,255,0.35)\"\n strokeWidth=\"2\"\n />\n <path\n d=\"M8 2a6 6 0 0 1 6 6\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n <style>{`@keyframes upay-spin{to{transform:rotate(360deg)}}`}</style>\n </svg>\n);\n\nexport function UPayButton({\n apiKey,\n baseUrl,\n amount,\n token,\n chain,\n metadata,\n onSuccess,\n onError,\n label = \"Pay with UPay\",\n className,\n}: UPayButtonProps) {\n const [loading, setLoading] = useState(false);\n\n const handleClick = useCallback(async () => {\n if (loading) return;\n setLoading(true);\n\n try {\n const client = new UPay({ apiKey, baseUrl });\n const session = await client.createCheckout({\n amount,\n token,\n chain,\n metadata,\n });\n client.openCheckout(session.id);\n\n const handleSuccess = (e: Event) => {\n const payment = (e as CustomEvent<UPayPayment>).detail;\n onSuccess?.(payment);\n window.removeEventListener(\"upay:payment-success\", handleSuccess);\n };\n window.addEventListener(\"upay:payment-success\", handleSuccess);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n onError?.(error);\n } finally {\n setLoading(false);\n }\n }, [loading, apiKey, amount, token, chain, metadata, onSuccess, onError]);\n\n return (\n <button\n onClick={handleClick}\n disabled={loading}\n className={className}\n style={\n className\n ? undefined\n : {\n ...defaultStyles.button,\n ...(loading ? defaultStyles.loading : {}),\n }\n }\n aria-label={loading ? \"Processing payment…\" : label}\n aria-busy={loading}\n >\n {loading ? <Spinner /> : <UPayLogo />}\n <span>{loading ? \"Opening checkout…\" : label}</span>\n </button>\n );\n}\n","import type {\n UPayClientOptions,\n CreateCheckoutOptions,\n UPayCheckoutSession,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL =\n typeof window !== \"undefined\"\n ? window.location.origin\n : \"http://localhost:3000\";\n\nexport class UPay {\n private apiKey: string;\n private baseUrl: string;\n\n constructor(options: UPayClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n }\n\n async createCheckout(\n options: CreateCheckoutOptions\n ): Promise<UPayCheckoutSession> {\n const res = await fetch(`${this.baseUrl}/api/v1/sessions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n amount: options.amount,\n token: options.token,\n chain: options.chain,\n metadata: options.metadata,\n success_url: options.successUrl,\n cancel_url: options.cancelUrl,\n }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(err.error ?? `HTTP ${res.status}`);\n }\n\n return res.json();\n }\n\n openCheckout(sessionId: string): void {\n const url = `${this.baseUrl}/checkout/${sessionId}`;\n\n if (typeof window === \"undefined\") return;\n\n const existingModal = document.getElementById(\"upay-modal-container\");\n if (existingModal) existingModal.remove();\n\n const container = document.createElement(\"div\");\n container.id = \"upay-modal-container\";\n container.style.cssText = [\n \"position:fixed\",\n \"inset:0\",\n \"z-index:2147483647\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:center\",\n \"background:rgba(0,0,0,0.6)\",\n \"backdrop-filter:blur(4px)\",\n ].join(\";\");\n\n // Spinner shown while iframe loads\n const spinner = document.createElement(\"div\");\n spinner.style.cssText = [\n \"width:min(480px,100vw)\",\n \"height:min(700px,100vh)\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:center\",\n \"border-radius:16px\",\n \"background:#fff\",\n ].join(\";\");\n spinner.innerHTML = `\n <style>@keyframes upay-modal-spin{to{transform:rotate(360deg)}}</style>\n <svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\"\n style=\"animation:upay-modal-spin 0.8s linear infinite\">\n <circle cx=\"18\" cy=\"18\" r=\"14\" stroke=\"#e5e7eb\" stroke-width=\"3\"/>\n <path d=\"M18 4a14 14 0 0 1 14 14\" stroke=\"#6366f1\"\n stroke-width=\"3\" stroke-linecap=\"round\"/>\n </svg>`;\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = url;\n iframe.style.cssText = [\n \"display:none\",\n \"width:min(480px,100vw)\",\n \"height:0\",\n \"max-height:90vh\",\n \"border:none\",\n \"border-radius:16px\",\n \"box-shadow:0 25px 50px rgba(0,0,0,0.4)\",\n \"transition:height 0.2s ease\",\n \"overflow:hidden\",\n ].join(\";\");\n iframe.allow = \"payment; clipboard-write\";\n iframe.onload = () => {\n spinner.remove();\n iframe.style.display = \"block\";\n };\n\n const close = (): void => container.remove();\n\n container.addEventListener(\"click\", (e) => {\n if (e.target === container) close();\n });\n\n window.addEventListener(\n \"message\",\n (e) => {\n if (e.data?.type === \"upay:close\") close();\n if (e.data?.type === \"upay:height\") {\n const maxPx = window.innerHeight * 0.9;\n iframe.style.height = `${Math.min(e.data.height, maxPx)}px`;\n }\n if (e.data?.type === \"upay:success\") {\n close();\n window.dispatchEvent(\n new CustomEvent(\"upay:payment-success\", { detail: e.data.payment })\n );\n }\n },\n { once: false }\n );\n\n container.appendChild(spinner);\n container.appendChild(iframe);\n document.body.appendChild(container);\n }\n}\n"],"mappings":"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","names":["React"]}
|
package/dist/index.mjs
CHANGED
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/UPayButton.tsx","../src/client.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useState, useCallback } from \"react\";\nimport { UPay } from \"./client\";\nimport type { UPayButtonProps, UPayPayment } from \"./types\";\n\nconst defaultStyles = {\n button: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"12px 24px\",\n background: \"linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)\",\n color: \"#fff\",\n border: \"none\",\n borderRadius: \"10px\",\n fontSize: \"15px\",\n fontWeight: \"600\",\n fontFamily: \"inherit\",\n cursor: \"pointer\",\n transition: \"opacity 0.15s, transform 0.1s\",\n minHeight: \"44px\",\n letterSpacing: \"-0.01em\",\n } as React.CSSProperties,\n loading: {\n opacity: 0.7,\n cursor: \"not-allowed\",\n } as React.CSSProperties,\n};\n\nconst UPayLogo = () => (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle cx=\"9\" cy=\"9\" r=\"8.5\" stroke=\"rgba(255,255,255,0.6)\" />\n <path\n d=\"M5.5 6.5L9 11.5L12.5 6.5\"\n stroke=\"white\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst Spinner = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n style={{ animation: \"upay-spin 0.8s linear infinite\" }}\n >\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n stroke=\"rgba(255,255,255,0.35)\"\n strokeWidth=\"2\"\n />\n <path\n d=\"M8 2a6 6 0 0 1 6 6\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n <style>{`@keyframes upay-spin{to{transform:rotate(360deg)}}`}</style>\n </svg>\n);\n\nexport function UPayButton({\n apiKey,\n baseUrl,\n amount,\n token,\n chain,\n metadata,\n onSuccess,\n onError,\n label = \"Pay with UPay\",\n className,\n}: UPayButtonProps) {\n const [loading, setLoading] = useState(false);\n\n const handleClick = useCallback(async () => {\n if (loading) return;\n setLoading(true);\n\n try {\n const client = new UPay({ apiKey, baseUrl });\n const session = await client.createCheckout({\n amount,\n token,\n chain,\n metadata,\n });\n client.openCheckout(session.id);\n\n const handleSuccess = (e: Event) => {\n const payment = (e as CustomEvent<UPayPayment>).detail;\n onSuccess?.(payment);\n window.removeEventListener(\"upay:payment-success\", handleSuccess);\n };\n window.addEventListener(\"upay:payment-success\", handleSuccess);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n onError?.(error);\n } finally {\n setLoading(false);\n }\n }, [loading, apiKey, amount, token, chain, metadata, onSuccess, onError]);\n\n return (\n <button\n onClick={handleClick}\n disabled={loading}\n className={className}\n style={\n className\n ? undefined\n : {\n ...defaultStyles.button,\n ...(loading ? defaultStyles.loading : {}),\n }\n }\n aria-label={loading ? \"Processing payment…\" : label}\n aria-busy={loading}\n >\n {loading ? <Spinner /> : <UPayLogo />}\n <span>{loading ? \"Opening checkout…\" : label}</span>\n </button>\n );\n}\n","import type {\n UPayClientOptions,\n CreateCheckoutOptions,\n UPayCheckoutSession,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL =\n typeof window !== \"undefined\"\n ? window.location.origin\n : \"http://localhost:3000\";\n\nexport class UPay {\n private apiKey: string;\n private baseUrl: string;\n\n constructor(options: UPayClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n }\n\n async createCheckout(\n options: CreateCheckoutOptions\n ): Promise<UPayCheckoutSession> {\n const res = await fetch(`${this.baseUrl}/api/v1/sessions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n amount: options.amount,\n token: options.token,\n chain: options.chain,\n metadata: options.metadata,\n success_url: options.successUrl,\n cancel_url: options.cancelUrl,\n }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(err.error ?? `HTTP ${res.status}`);\n }\n\n return res.json();\n }\n\n openCheckout(sessionId: string): void {\n const url = `${this.baseUrl}/checkout/${sessionId}`;\n\n if (typeof window === \"undefined\") return;\n\n const existingModal = document.getElementById(\"upay-modal-container\");\n if (existingModal) existingModal.remove();\n\n const container = document.createElement(\"div\");\n container.id = \"upay-modal-container\";\n container.style.cssText = [\n \"position:fixed\",\n \"inset:0\",\n \"z-index:2147483647\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:center\",\n \"background:rgba(0,0,0,0.6)\",\n \"backdrop-filter:blur(4px)\",\n ].join(\";\");\n\n // Spinner shown while iframe loads\n const spinner = document.createElement(\"div\");\n spinner.style.cssText = [\n \"width:min(480px,100vw)\",\n \"height:min(700px,100vh)\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:center\",\n \"border-radius:16px\",\n \"background:#fff\",\n ].join(\";\");\n spinner.innerHTML = `\n <style>@keyframes upay-modal-spin{to{transform:rotate(360deg)}}</style>\n <svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\"\n style=\"animation:upay-modal-spin 0.8s linear infinite\">\n <circle cx=\"18\" cy=\"18\" r=\"14\" stroke=\"#e5e7eb\" stroke-width=\"3\"/>\n <path d=\"M18 4a14 14 0 0 1 14 14\" stroke=\"#6366f1\"\n stroke-width=\"3\" stroke-linecap=\"round\"/>\n </svg>`;\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = url;\n iframe.style.cssText = [\n \"display:none\",\n \"width:min(480px,100vw)\",\n \"height:0\",\n \"max-height:90vh\",\n \"border:none\",\n \"border-radius:16px\",\n \"box-shadow:0 25px 50px rgba(0,0,0,0.4)\",\n \"transition:height 0.2s ease\",\n \"overflow:hidden\",\n ].join(\";\");\n iframe.allow = \"payment\";\n iframe.onload = () => {\n spinner.remove();\n iframe.style.display = \"block\";\n };\n\n const close = (): void => container.remove();\n\n container.addEventListener(\"click\", (e) => {\n if (e.target === container) close();\n });\n\n window.addEventListener(\n \"message\",\n (e) => {\n if (e.data?.type === \"upay:close\") close();\n if (e.data?.type === \"upay:height\") {\n const maxPx = window.innerHeight * 0.9;\n iframe.style.height = `${Math.min(e.data.height, maxPx)}px`;\n }\n if (e.data?.type === \"upay:success\") {\n close();\n window.dispatchEvent(\n new CustomEvent(\"upay:payment-success\", { detail: e.data.payment })\n );\n }\n },\n { once: false }\n );\n\n container.appendChild(spinner);\n container.appendChild(iframe);\n document.body.appendChild(container);\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/UPayButton.tsx","../src/client.ts"],"sourcesContent":["\"use client\";\n\nimport React, { useState, useCallback } from \"react\";\nimport { UPay } from \"./client\";\nimport type { UPayButtonProps, UPayPayment } from \"./types\";\n\nconst defaultStyles = {\n button: {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"12px 24px\",\n background: \"linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)\",\n color: \"#fff\",\n border: \"none\",\n borderRadius: \"10px\",\n fontSize: \"15px\",\n fontWeight: \"600\",\n fontFamily: \"inherit\",\n cursor: \"pointer\",\n transition: \"opacity 0.15s, transform 0.1s\",\n minHeight: \"44px\",\n letterSpacing: \"-0.01em\",\n } as React.CSSProperties,\n loading: {\n opacity: 0.7,\n cursor: \"not-allowed\",\n } as React.CSSProperties,\n};\n\nconst UPayLogo = () => (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle cx=\"9\" cy=\"9\" r=\"8.5\" stroke=\"rgba(255,255,255,0.6)\" />\n <path\n d=\"M5.5 6.5L9 11.5L12.5 6.5\"\n stroke=\"white\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst Spinner = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden=\"true\"\n style={{ animation: \"upay-spin 0.8s linear infinite\" }}\n >\n <circle\n cx=\"8\"\n cy=\"8\"\n r=\"6\"\n stroke=\"rgba(255,255,255,0.35)\"\n strokeWidth=\"2\"\n />\n <path\n d=\"M8 2a6 6 0 0 1 6 6\"\n stroke=\"white\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n />\n <style>{`@keyframes upay-spin{to{transform:rotate(360deg)}}`}</style>\n </svg>\n);\n\nexport function UPayButton({\n apiKey,\n baseUrl,\n amount,\n token,\n chain,\n metadata,\n onSuccess,\n onError,\n label = \"Pay with UPay\",\n className,\n}: UPayButtonProps) {\n const [loading, setLoading] = useState(false);\n\n const handleClick = useCallback(async () => {\n if (loading) return;\n setLoading(true);\n\n try {\n const client = new UPay({ apiKey, baseUrl });\n const session = await client.createCheckout({\n amount,\n token,\n chain,\n metadata,\n });\n client.openCheckout(session.id);\n\n const handleSuccess = (e: Event) => {\n const payment = (e as CustomEvent<UPayPayment>).detail;\n onSuccess?.(payment);\n window.removeEventListener(\"upay:payment-success\", handleSuccess);\n };\n window.addEventListener(\"upay:payment-success\", handleSuccess);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n onError?.(error);\n } finally {\n setLoading(false);\n }\n }, [loading, apiKey, amount, token, chain, metadata, onSuccess, onError]);\n\n return (\n <button\n onClick={handleClick}\n disabled={loading}\n className={className}\n style={\n className\n ? undefined\n : {\n ...defaultStyles.button,\n ...(loading ? defaultStyles.loading : {}),\n }\n }\n aria-label={loading ? \"Processing payment…\" : label}\n aria-busy={loading}\n >\n {loading ? <Spinner /> : <UPayLogo />}\n <span>{loading ? \"Opening checkout…\" : label}</span>\n </button>\n );\n}\n","import type {\n UPayClientOptions,\n CreateCheckoutOptions,\n UPayCheckoutSession,\n} from \"./types\";\n\nconst DEFAULT_BASE_URL =\n typeof window !== \"undefined\"\n ? window.location.origin\n : \"http://localhost:3000\";\n\nexport class UPay {\n private apiKey: string;\n private baseUrl: string;\n\n constructor(options: UPayClientOptions) {\n this.apiKey = options.apiKey;\n this.baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n }\n\n async createCheckout(\n options: CreateCheckoutOptions\n ): Promise<UPayCheckoutSession> {\n const res = await fetch(`${this.baseUrl}/api/v1/sessions`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n amount: options.amount,\n token: options.token,\n chain: options.chain,\n metadata: options.metadata,\n success_url: options.successUrl,\n cancel_url: options.cancelUrl,\n }),\n });\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ error: \"Unknown error\" }));\n throw new Error(err.error ?? `HTTP ${res.status}`);\n }\n\n return res.json();\n }\n\n openCheckout(sessionId: string): void {\n const url = `${this.baseUrl}/checkout/${sessionId}`;\n\n if (typeof window === \"undefined\") return;\n\n const existingModal = document.getElementById(\"upay-modal-container\");\n if (existingModal) existingModal.remove();\n\n const container = document.createElement(\"div\");\n container.id = \"upay-modal-container\";\n container.style.cssText = [\n \"position:fixed\",\n \"inset:0\",\n \"z-index:2147483647\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:center\",\n \"background:rgba(0,0,0,0.6)\",\n \"backdrop-filter:blur(4px)\",\n ].join(\";\");\n\n // Spinner shown while iframe loads\n const spinner = document.createElement(\"div\");\n spinner.style.cssText = [\n \"width:min(480px,100vw)\",\n \"height:min(700px,100vh)\",\n \"display:flex\",\n \"align-items:center\",\n \"justify-content:center\",\n \"border-radius:16px\",\n \"background:#fff\",\n ].join(\";\");\n spinner.innerHTML = `\n <style>@keyframes upay-modal-spin{to{transform:rotate(360deg)}}</style>\n <svg width=\"36\" height=\"36\" viewBox=\"0 0 36 36\" fill=\"none\"\n style=\"animation:upay-modal-spin 0.8s linear infinite\">\n <circle cx=\"18\" cy=\"18\" r=\"14\" stroke=\"#e5e7eb\" stroke-width=\"3\"/>\n <path d=\"M18 4a14 14 0 0 1 14 14\" stroke=\"#6366f1\"\n stroke-width=\"3\" stroke-linecap=\"round\"/>\n </svg>`;\n\n const iframe = document.createElement(\"iframe\");\n iframe.src = url;\n iframe.style.cssText = [\n \"display:none\",\n \"width:min(480px,100vw)\",\n \"height:0\",\n \"max-height:90vh\",\n \"border:none\",\n \"border-radius:16px\",\n \"box-shadow:0 25px 50px rgba(0,0,0,0.4)\",\n \"transition:height 0.2s ease\",\n \"overflow:hidden\",\n ].join(\";\");\n iframe.allow = \"payment; clipboard-write\";\n iframe.onload = () => {\n spinner.remove();\n iframe.style.display = \"block\";\n };\n\n const close = (): void => container.remove();\n\n container.addEventListener(\"click\", (e) => {\n if (e.target === container) close();\n });\n\n window.addEventListener(\n \"message\",\n (e) => {\n if (e.data?.type === \"upay:close\") close();\n if (e.data?.type === \"upay:height\") {\n const maxPx = window.innerHeight * 0.9;\n iframe.style.height = `${Math.min(e.data.height, maxPx)}px`;\n }\n if (e.data?.type === \"upay:success\") {\n close();\n window.dispatchEvent(\n new CustomEvent(\"upay:payment-success\", { detail: e.data.payment })\n );\n }\n },\n { once: false }\n );\n\n container.appendChild(spinner);\n container.appendChild(iframe);\n document.body.appendChild(container);\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alphadevs_labs/upay-sdk",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "UPay SDK — UPayButton React component and imperative client",
|
|
5
5
|
"license": "MIT",
|
|
6
|
+
"homepage": "https://tryupay.xyz",
|
|
6
7
|
"publishConfig": {
|
|
7
8
|
"access": "public"
|
|
8
9
|
},
|
|
@@ -10,6 +11,7 @@
|
|
|
10
11
|
"type": "git",
|
|
11
12
|
"url": "https://github.com/0xyshv/upay"
|
|
12
13
|
},
|
|
14
|
+
"keywords": ["crypto", "checkout", "payments", "web3", "stablecoin", "sdk"],
|
|
13
15
|
"main": "./dist/index.js",
|
|
14
16
|
"module": "./dist/index.mjs",
|
|
15
17
|
"types": "./dist/index.d.ts",
|