@alphadevs_labs/upay-sdk 0.0.2 → 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 CHANGED
@@ -106,18 +106,6 @@ The script scans the page for `[data-upay-button]` elements on load and mounts a
106
106
 
107
107
  **`upay.openCheckout(sessionId)`** — mounts an embedded checkout modal (iframe) for the given session and handles close/resize/success messaging automatically.
108
108
 
109
- ## Types
110
-
111
- ```ts
112
- import type {
113
- UPayButtonProps,
114
- UPayPayment,
115
- UPayCheckoutSession,
116
- UPayClientOptions,
117
- CreateCheckoutOptions,
118
- } from "@alphadevs_labs/upay-sdk";
119
- ```
120
-
121
109
  ## Getting API keys
122
110
 
123
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.
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,mBAA6C;;;ACI7C,IAAM,mBACJ,OAAO,WAAW,cACd,OAAO,SAAS,SAChB;AAEC,IAAM,OAAN,MAAW;AAAA,EACR;AAAA,EACA;AAAA,EAER,YAAY,SAA4B;AACtC,SAAK,SAAS,QAAQ;AACtB,SAAK,UAAU,QAAQ,WAAW;AAAA,EACpC;AAAA,EAEA,MAAM,eACJ,SAC8B;AAC9B,UAAM,MAAM,MAAM,MAAM,GAAG,KAAK,OAAO,oBAAoB;AAAA,MACzD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,eAAe,UAAU,KAAK,MAAM;AAAA,MACtC;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,QAAQ,QAAQ;AAAA,QAChB,OAAO,QAAQ;AAAA,QACf,OAAO,QAAQ;AAAA,QACf,UAAU,QAAQ;AAAA,QAClB,aAAa,QAAQ;AAAA,QACrB,YAAY,QAAQ;AAAA,MACtB,CAAC;AAAA,IACH,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,MAAM,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,EAAE,OAAO,gBAAgB,EAAE;AACrE,YAAM,IAAI,MAAM,IAAI,SAAS,QAAQ,IAAI,MAAM,EAAE;AAAA,IACnD;AAEA,WAAO,IAAI,KAAK;AAAA,EAClB;AAAA,EAEA,aAAa,WAAyB;AACpC,UAAM,MAAM,GAAG,KAAK,OAAO,aAAa,SAAS;AAEjD,QAAI,OAAO,WAAW,YAAa;AAEnC,UAAM,gBAAgB,SAAS,eAAe,sBAAsB;AACpE,QAAI,cAAe,eAAc,OAAO;AAExC,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,KAAK;AACf,cAAU,MAAM,UAAU;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,GAAG;AAGV,UAAM,UAAU,SAAS,cAAc,KAAK;AAC5C,YAAQ,MAAM,UAAU;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,GAAG;AACV,YAAQ,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASpB,UAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,WAAO,MAAM;AACb,WAAO,MAAM,UAAU;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,GAAG;AACV,WAAO,QAAQ;AACf,WAAO,SAAS,MAAM;AACpB,cAAQ,OAAO;AACf,aAAO,MAAM,UAAU;AAAA,IACzB;AAEA,UAAM,QAAQ,MAAY,UAAU,OAAO;AAE3C,cAAU,iBAAiB,SAAS,CAAC,MAAM;AACzC,UAAI,EAAE,WAAW,UAAW,OAAM;AAAA,IACpC,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,CAAC,MAAM;AACL,YAAI,EAAE,MAAM,SAAS,aAAc,OAAM;AACzC,YAAI,EAAE,MAAM,SAAS,eAAe;AAClC,gBAAM,QAAQ,OAAO,cAAc;AACnC,iBAAO,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE,KAAK,QAAQ,KAAK,CAAC;AAAA,QACzD;AACA,YAAI,EAAE,MAAM,SAAS,gBAAgB;AACnC,gBAAM;AACN,iBAAO;AAAA,YACL,IAAI,YAAY,wBAAwB,EAAE,QAAQ,EAAE,KAAK,QAAQ,CAAC;AAAA,UACpE;AAAA,QACF;AAAA,MACF;AAAA,MACA,EAAE,MAAM,MAAM;AAAA,IAChB;AAEA,cAAU,YAAY,OAAO;AAC7B,cAAU,YAAY,MAAM;AAC5B,aAAS,KAAK,YAAY,SAAS;AAAA,EACrC;AACF;;;ADjIA,IAAM,gBAAgB;AAAA,EACpB,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,eAAe;AAAA,EACjB;AAAA,EACA,SAAS;AAAA,IACP,SAAS;AAAA,IACT,QAAQ;AAAA,EACV;AACF;AAEA,IAAM,WAAW,MACf,6BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IACN,eAAY;AAAA;AAAA,EAEZ,6BAAAA,QAAA,cAAC,YAAO,IAAG,KAAI,IAAG,KAAI,GAAE,OAAM,QAAO,yBAAwB;AAAA,EAC7D,6BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA,MACd,gBAAe;AAAA;AAAA,EACjB;AACF;AAGF,IAAM,UAAU,MACd,6BAAAA,QAAA;AAAA,EAAC;AAAA;AAAA,IACC,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,eAAY;AAAA,IACZ,OAAO,EAAE,WAAW,iCAAiC;AAAA;AAAA,EAErD,6BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,IAAG;AAAA,MACH,IAAG;AAAA,MACH,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA;AAAA,EACd;AAAA,EACA,6BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,GAAE;AAAA,MACF,QAAO;AAAA,MACP,aAAY;AAAA,MACZ,eAAc;AAAA;AAAA,EAChB;AAAA,EACA,6BAAAA,QAAA,cAAC,eAAO,oDAAqD;AAC/D;AAGK,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AACF,GAAoB;AAClB,QAAM,CAAC,SAAS,UAAU,QAAI,uBAAS,KAAK;AAE5C,QAAM,kBAAc,0BAAY,YAAY;AAC1C,QAAI,QAAS;AACb,eAAW,IAAI;AAEf,QAAI;AACF,YAAM,SAAS,IAAI,KAAK,EAAE,QAAQ,QAAQ,CAAC;AAC3C,YAAM,UAAU,MAAM,OAAO,eAAe;AAAA,QAC1C;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,aAAO,aAAa,QAAQ,EAAE;AAE9B,YAAM,gBAAgB,CAAC,MAAa;AAClC,cAAM,UAAW,EAA+B;AAChD,oBAAY,OAAO;AACnB,eAAO,oBAAoB,wBAAwB,aAAa;AAAA,MAClE;AACA,aAAO,iBAAiB,wBAAwB,aAAa;AAAA,IAC/D,SAAS,KAAK;AACZ,YAAM,QAAQ,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AAChE,gBAAU,KAAK;AAAA,IACjB,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,SAAS,QAAQ,QAAQ,OAAO,OAAO,UAAU,WAAW,OAAO,CAAC;AAExE,SACE,6BAAAA,QAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAS;AAAA,MACT,UAAU;AAAA,MACV;AAAA,MACA,OACE,YACI,SACA;AAAA,QACE,GAAG,cAAc;AAAA,QACjB,GAAI,UAAU,cAAc,UAAU,CAAC;AAAA,MACzC;AAAA,MAEN,cAAY,UAAU,6BAAwB;AAAA,MAC9C,aAAW;AAAA;AAAA,IAEV,UAAU,6BAAAA,QAAA,cAAC,aAAQ,IAAK,6BAAAA,QAAA,cAAC,cAAS;AAAA,IACnC,6BAAAA,QAAA,cAAC,cAAM,UAAU,2BAAsB,KAAM;AAAA,EAC/C;AAEJ;","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
@@ -80,7 +80,7 @@ var UPay = class {
80
80
  "transition:height 0.2s ease",
81
81
  "overflow:hidden"
82
82
  ].join(";");
83
- iframe.allow = "payment";
83
+ iframe.allow = "payment; clipboard-write";
84
84
  iframe.onload = () => {
85
85
  spinner.remove();
86
86
  iframe.style.display = "block";
@@ -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,6 +1,6 @@
1
1
  {
2
2
  "name": "@alphadevs_labs/upay-sdk",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "UPay SDK — UPayButton React component and imperative client",
5
5
  "license": "MIT",
6
6
  "homepage": "https://tryupay.xyz",