@getruba/checkout 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +221 -0
- package/dist/chunk-FSZEYAE6.js +1 -0
- package/dist/chunk-GBQE5XCD.js +1 -0
- package/dist/chunk-TS7YIDY3.js +1 -0
- package/dist/chunk-ZWRDP37E.js +1 -0
- package/dist/components/index.cjs +113 -0
- package/dist/components/index.d.cts +95 -0
- package/dist/components/index.d.ts +95 -0
- package/dist/components/index.js +113 -0
- package/dist/embed.cjs +1 -0
- package/dist/embed.d.cts +55 -0
- package/dist/embed.d.ts +55 -0
- package/dist/embed.global.js +1 -0
- package/dist/embed.js +1 -0
- package/dist/guards.cjs +1 -0
- package/dist/guards.d.cts +19 -0
- package/dist/guards.d.ts +19 -0
- package/dist/guards.js +1 -0
- package/dist/hooks/index.cjs +1 -0
- package/dist/hooks/index.d.cts +6 -0
- package/dist/hooks/index.d.ts +6 -0
- package/dist/hooks/index.js +1 -0
- package/dist/index.d-DvLuMU7T.d.cts +29754 -0
- package/dist/index.d-DvLuMU7T.d.ts +29754 -0
- package/dist/payment-method.cjs +1 -0
- package/dist/payment-method.d.cts +86 -0
- package/dist/payment-method.d.ts +86 -0
- package/dist/payment-method.js +1 -0
- package/dist/providers/index.cjs +1 -0
- package/dist/providers/index.d.cts +89 -0
- package/dist/providers/index.d.ts +89 -0
- package/dist/providers/index.js +1 -0
- package/dist/react/payment-method.cjs +1 -0
- package/dist/react/payment-method.d.cts +25 -0
- package/dist/react/payment-method.d.ts +25 -0
- package/dist/react/payment-method.js +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as react from 'react';
|
|
3
|
+
import { s as schemas, o as operations, C as Client } from '../index.d-DvLuMU7T.cjs';
|
|
4
|
+
import { A } from './config-oYrbe6vX.js';
|
|
5
|
+
import { Stripe, StripeElements } from '@stripe/stripe-js';
|
|
6
|
+
import { UseFormReturn } from 'react-hook-form';
|
|
7
|
+
import 'openapi-fetch';
|
|
8
|
+
|
|
9
|
+
interface CheckoutFormContextProps {
|
|
10
|
+
checkout: schemas['CheckoutPublic'];
|
|
11
|
+
form: UseFormReturn<schemas['CheckoutUpdatePublic']>;
|
|
12
|
+
update: (data: schemas['CheckoutUpdatePublic']) => Promise<schemas['CheckoutPublic']>;
|
|
13
|
+
confirm: (data: schemas['CheckoutConfirmStripe'], stripe: Stripe | null, elements: StripeElements | null) => Promise<schemas['CheckoutPublicConfirmed']>;
|
|
14
|
+
loading: boolean;
|
|
15
|
+
loadingLabel: string | undefined;
|
|
16
|
+
isUpdatePending: boolean;
|
|
17
|
+
}
|
|
18
|
+
declare const CheckoutFormContext: react.Context<CheckoutFormContextProps>;
|
|
19
|
+
declare const CheckoutFormProvider: ({ children, locale, }: React.PropsWithChildren<{
|
|
20
|
+
locale?: A;
|
|
21
|
+
}>) => react_jsx_runtime.JSX.Element;
|
|
22
|
+
declare const useCheckoutForm: () => CheckoutFormContextProps;
|
|
23
|
+
|
|
24
|
+
type ResponseMap = Record<number, {
|
|
25
|
+
content?: Record<string, unknown>;
|
|
26
|
+
}>;
|
|
27
|
+
type ErrorCodes<T extends ResponseMap> = Exclude<keyof T, 200 | 201 | 202 | 204>;
|
|
28
|
+
type JsonErrorCodes<T extends ResponseMap> = {
|
|
29
|
+
[K in ErrorCodes<T>]: T[K] extends {
|
|
30
|
+
content: {
|
|
31
|
+
'application/json': unknown;
|
|
32
|
+
};
|
|
33
|
+
} ? K : never;
|
|
34
|
+
}[ErrorCodes<T>];
|
|
35
|
+
type ErrorTypes<T extends ResponseMap> = {
|
|
36
|
+
[K in JsonErrorCodes<T>]: T[K] extends {
|
|
37
|
+
content: {
|
|
38
|
+
'application/json': {
|
|
39
|
+
error: infer E;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
} ? E : never;
|
|
43
|
+
}[JsonErrorCodes<T>];
|
|
44
|
+
type SuccessBody<T extends ResponseMap> = T[200] extends {
|
|
45
|
+
content: {
|
|
46
|
+
'application/json': infer R;
|
|
47
|
+
};
|
|
48
|
+
} ? R : never;
|
|
49
|
+
type APIError<T extends keyof operations> = {
|
|
50
|
+
error: ErrorTypes<operations[T]['responses']>;
|
|
51
|
+
detail: string;
|
|
52
|
+
};
|
|
53
|
+
type ValidationError = {
|
|
54
|
+
error: 'RequestValidationError';
|
|
55
|
+
detail: {
|
|
56
|
+
input: unknown;
|
|
57
|
+
loc: string[];
|
|
58
|
+
msg: string;
|
|
59
|
+
type: string;
|
|
60
|
+
}[];
|
|
61
|
+
};
|
|
62
|
+
type ErrorResponse<T extends keyof operations> = APIError<T> | ValidationError;
|
|
63
|
+
type Result<T extends keyof operations> = {
|
|
64
|
+
ok: true;
|
|
65
|
+
error: never;
|
|
66
|
+
value: SuccessBody<operations[T]['responses']>;
|
|
67
|
+
} | {
|
|
68
|
+
ok: false;
|
|
69
|
+
error: ErrorResponse<T> | null;
|
|
70
|
+
value: never;
|
|
71
|
+
};
|
|
72
|
+
interface CheckoutContextProps {
|
|
73
|
+
checkout: schemas['CheckoutPublic'];
|
|
74
|
+
refresh: () => Promise<Result<'checkouts:client_get'>>;
|
|
75
|
+
update: (data: schemas['CheckoutUpdatePublic']) => Promise<Result<'checkouts:client_update'>>;
|
|
76
|
+
confirm: (data: schemas['CheckoutConfirmStripe']) => Promise<Result<'checkouts:client_confirm'>>;
|
|
77
|
+
client: Client;
|
|
78
|
+
}
|
|
79
|
+
declare const CheckoutContext: react.Context<CheckoutContextProps>;
|
|
80
|
+
interface CheckoutProviderProps {
|
|
81
|
+
clientSecret: string;
|
|
82
|
+
initialCheckout?: schemas['CheckoutPublic'];
|
|
83
|
+
server?: 'production' | 'sandbox';
|
|
84
|
+
serverURL?: string;
|
|
85
|
+
}
|
|
86
|
+
declare const CheckoutProvider: ({ clientSecret, initialCheckout, serverURL, server, children, }: React.PropsWithChildren<CheckoutProviderProps>) => react_jsx_runtime.JSX.Element | null;
|
|
87
|
+
declare const useCheckout: () => CheckoutContextProps;
|
|
88
|
+
|
|
89
|
+
export { CheckoutContext, CheckoutFormContext, CheckoutFormProvider, CheckoutProvider, type Result, useCheckout, useCheckoutForm };
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as react from 'react';
|
|
3
|
+
import { s as schemas, o as operations, C as Client } from '../index.d-DvLuMU7T.js';
|
|
4
|
+
import { A } from './config-oYrbe6vX.js';
|
|
5
|
+
import { Stripe, StripeElements } from '@stripe/stripe-js';
|
|
6
|
+
import { UseFormReturn } from 'react-hook-form';
|
|
7
|
+
import 'openapi-fetch';
|
|
8
|
+
|
|
9
|
+
interface CheckoutFormContextProps {
|
|
10
|
+
checkout: schemas['CheckoutPublic'];
|
|
11
|
+
form: UseFormReturn<schemas['CheckoutUpdatePublic']>;
|
|
12
|
+
update: (data: schemas['CheckoutUpdatePublic']) => Promise<schemas['CheckoutPublic']>;
|
|
13
|
+
confirm: (data: schemas['CheckoutConfirmStripe'], stripe: Stripe | null, elements: StripeElements | null) => Promise<schemas['CheckoutPublicConfirmed']>;
|
|
14
|
+
loading: boolean;
|
|
15
|
+
loadingLabel: string | undefined;
|
|
16
|
+
isUpdatePending: boolean;
|
|
17
|
+
}
|
|
18
|
+
declare const CheckoutFormContext: react.Context<CheckoutFormContextProps>;
|
|
19
|
+
declare const CheckoutFormProvider: ({ children, locale, }: React.PropsWithChildren<{
|
|
20
|
+
locale?: A;
|
|
21
|
+
}>) => react_jsx_runtime.JSX.Element;
|
|
22
|
+
declare const useCheckoutForm: () => CheckoutFormContextProps;
|
|
23
|
+
|
|
24
|
+
type ResponseMap = Record<number, {
|
|
25
|
+
content?: Record<string, unknown>;
|
|
26
|
+
}>;
|
|
27
|
+
type ErrorCodes<T extends ResponseMap> = Exclude<keyof T, 200 | 201 | 202 | 204>;
|
|
28
|
+
type JsonErrorCodes<T extends ResponseMap> = {
|
|
29
|
+
[K in ErrorCodes<T>]: T[K] extends {
|
|
30
|
+
content: {
|
|
31
|
+
'application/json': unknown;
|
|
32
|
+
};
|
|
33
|
+
} ? K : never;
|
|
34
|
+
}[ErrorCodes<T>];
|
|
35
|
+
type ErrorTypes<T extends ResponseMap> = {
|
|
36
|
+
[K in JsonErrorCodes<T>]: T[K] extends {
|
|
37
|
+
content: {
|
|
38
|
+
'application/json': {
|
|
39
|
+
error: infer E;
|
|
40
|
+
};
|
|
41
|
+
};
|
|
42
|
+
} ? E : never;
|
|
43
|
+
}[JsonErrorCodes<T>];
|
|
44
|
+
type SuccessBody<T extends ResponseMap> = T[200] extends {
|
|
45
|
+
content: {
|
|
46
|
+
'application/json': infer R;
|
|
47
|
+
};
|
|
48
|
+
} ? R : never;
|
|
49
|
+
type APIError<T extends keyof operations> = {
|
|
50
|
+
error: ErrorTypes<operations[T]['responses']>;
|
|
51
|
+
detail: string;
|
|
52
|
+
};
|
|
53
|
+
type ValidationError = {
|
|
54
|
+
error: 'RequestValidationError';
|
|
55
|
+
detail: {
|
|
56
|
+
input: unknown;
|
|
57
|
+
loc: string[];
|
|
58
|
+
msg: string;
|
|
59
|
+
type: string;
|
|
60
|
+
}[];
|
|
61
|
+
};
|
|
62
|
+
type ErrorResponse<T extends keyof operations> = APIError<T> | ValidationError;
|
|
63
|
+
type Result<T extends keyof operations> = {
|
|
64
|
+
ok: true;
|
|
65
|
+
error: never;
|
|
66
|
+
value: SuccessBody<operations[T]['responses']>;
|
|
67
|
+
} | {
|
|
68
|
+
ok: false;
|
|
69
|
+
error: ErrorResponse<T> | null;
|
|
70
|
+
value: never;
|
|
71
|
+
};
|
|
72
|
+
interface CheckoutContextProps {
|
|
73
|
+
checkout: schemas['CheckoutPublic'];
|
|
74
|
+
refresh: () => Promise<Result<'checkouts:client_get'>>;
|
|
75
|
+
update: (data: schemas['CheckoutUpdatePublic']) => Promise<Result<'checkouts:client_update'>>;
|
|
76
|
+
confirm: (data: schemas['CheckoutConfirmStripe']) => Promise<Result<'checkouts:client_confirm'>>;
|
|
77
|
+
client: Client;
|
|
78
|
+
}
|
|
79
|
+
declare const CheckoutContext: react.Context<CheckoutContextProps>;
|
|
80
|
+
interface CheckoutProviderProps {
|
|
81
|
+
clientSecret: string;
|
|
82
|
+
initialCheckout?: schemas['CheckoutPublic'];
|
|
83
|
+
server?: 'production' | 'sandbox';
|
|
84
|
+
serverURL?: string;
|
|
85
|
+
}
|
|
86
|
+
declare const CheckoutProvider: ({ clientSecret, initialCheckout, serverURL, server, children, }: React.PropsWithChildren<CheckoutProviderProps>) => react_jsx_runtime.JSX.Element | null;
|
|
87
|
+
declare const useCheckout: () => CheckoutContextProps;
|
|
88
|
+
|
|
89
|
+
export { CheckoutContext, CheckoutFormContext, CheckoutFormProvider, CheckoutProvider, type Result, useCheckout, useCheckoutForm };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use client";import{b as I,c as y,d as _,e as M,i as N,n as O}from"../chunk-TS7YIDY3.js";import"../chunk-ZWRDP37E.js";import{createContext as ee,useCallback as S,useContext as te,useState as A}from"react";var R=(r,u,e=1,s)=>{r.forEach(d=>{let o=d.loc.slice(e);s&&s.includes(o[0])&&(o=o.slice(1)),u(o.join("."),{type:d.type,message:d.msg})})};import{createContext as G,useCallback as v,useContext as W,useEffect as Y,useMemo as $,useState as D}from"react";import{jsx as Z}from"react/jsx-runtime";var j=async(r,u)=>{try{return{ok:!0,value:await _(r.GET("/v1/checkouts/client/{client_secret}",{params:{path:u}}))}}catch(e){return e instanceof y?{ok:!1,error:e.error}:{ok:!1,error:null}}},H=async(r,u,e)=>{try{return{ok:!0,value:await _(r.POST("/v1/checkouts/client/{client_secret}/confirm",{params:{path:u},body:e}))}}catch(s){return s instanceof y?{ok:!1,error:s.error}:{ok:!1,error:null}}},z=async(r,u,e)=>{try{return{ok:!0,value:await _(r.PATCH("/v1/checkouts/client/{client_secret}",{params:{path:u},body:e}))}}catch(s){return s instanceof y?{ok:!1,error:s.error}:{ok:!1,error:null}}},Q=()=>{throw new Error("You forgot to wrap your component in <CheckoutProvider>.")},T=G(Q),X=({clientSecret:r,initialCheckout:u,serverURL:e,server:s,children:d})=>{let o=$(()=>{let n=(()=>{if(e)return e.replace(/\/v1\/?$/,"");switch(s){case"sandbox":return"https://sandbox-api.getruba.com";case"production":case void 0:return"https://api.getruba.com";default:throw new Error(`Unknown server: '${s}'`)}})();return I(n)},[s,e]),[f,c]=D(u??null);Y(()=>{u||j(o,{client_secret:r}).then(n=>{n.ok&&c(n.value)}).catch(n=>{throw n})},[o,r,u]);let g=v(async()=>{let n=await j(o,{client_secret:r});return n.ok&&c(n.value),n},[o,r]),k=v(async n=>{let p=await z(o,{client_secret:r},n);return p.ok&&c(p.value),p},[o,r]),P=v(async n=>{let p=await H(o,{client_secret:r},n);return p.ok&&c(p.value),p},[o,r]);return f?Z(T.Provider,{value:{checkout:f,refresh:g,update:k,confirm:P,client:o},children:d}):null},F=()=>W(T);import{jsx as ne}from"react/jsx-runtime";var oe=()=>{throw new Error("You forgot to wrap your component in <CheckoutFormProvider>.")},U=ee(oe),re=({children:r,locale:u=M})=>{let{checkout:e,update:s,confirm:d}=F(),o=N(u),[f,c]=A(!1),[g,k]=A(),[P,n]=A(!1),p=O({defaultValues:{...e,customer_billing_address:e.customer_billing_address,discount_code:e.discount?e.discount.code:void 0,allow_trial:void 0},shouldUnregister:!0}),{setError:l}=p,E=S(async i=>{n(!0);let{ok:m,value:h,error:t}=await s(i).finally(()=>{n(!1)});if(m)return h;if(t){if(Array.isArray(t.detail))throw R(t.detail,l),t;switch(t.error){case"AlreadyActiveSubscriptionError":case"NotOpenCheckout":case"PaymentNotReady":l("root",{message:t.detail});break;case"ResourceNotFound":case"ExpiredCheckoutError":break}}throw t},[s,l]),b=S(async i=>{let{ok:m,value:h,error:t}=await d(i);if(m)return h;if(t){if(Array.isArray(t.detail))throw R(t.detail,l),t;switch(t.error){case"PaymentError":case"AlreadyActiveSubscriptionError":case"NotOpenCheckout":case"PaymentNotReady":l("root",{message:t.detail});break;case"TrialAlreadyRedeemed":l("root",{message:t.detail}),await E({allow_trial:!1});break;case"ResourceNotFound":case"ExpiredCheckoutError":break}}throw t},[d,l,E]),q=S(async(i,m,h)=>{if(c(!0),!e.is_payment_form_required){k(o("checkout.loading.processingOrder"));try{return await b(i)}finally{c(!1)}}if(!m||!h)throw c(!1),new Error("Stripe elements not provided");k(o("checkout.loading.processingPayment"));let{error:t}=await h.submit();if(t)throw t.type!=="validation_error"&&l("root",{message:t.message}),c(!1),new Error(t.message);let w,C;try{let a=await m.createConfirmationToken({elements:h,params:{payment_method_data:{billing_details:{name:i.customer_name||null,email:i.customer_email,address:{line1:i.customer_billing_address?.line1||null,line2:i.customer_billing_address?.line2||null,postal_code:i.customer_billing_address?.postal_code||null,city:i.customer_billing_address?.city||null,state:i.customer_billing_address?.state||null,country:i.customer_billing_address?.country||null},phone:null}}}});w=a.confirmationToken,C=a.error}catch(a){throw c(!1),a}if(!w||C){let a=o("checkout.loading.confirmationTokenFailed");throw l("root",{message:C?.message||a}),c(!1),new Error(C?.message||a)}let x;try{x=await b({...i,confirmation_token_id:w.id})}catch(a){throw c(!1),a}k(o("checkout.loading.paymentSuccessful"));let{intent_status:V,intent_client_secret:K}=x.payment_processor_metadata,L=V;for(;L==="requires_action";){let{error:a,paymentIntent:B,setupIntent:J}=await m.handleNextAction({clientSecret:K});if(a)throw c(!1),l("root",{message:a.message}),new Error(a.message);L=B?.status||J?.status||V}return c(!1),x},[e,l,b,o]);return ne(U.Provider,{value:{checkout:e,form:p,update:E,confirm:q,loading:f,loadingLabel:g,isUpdatePending:P},children:r})},se=()=>te(U);export{T as CheckoutContext,U as CheckoutFormContext,re as CheckoutFormProvider,X as CheckoutProvider,F as useCheckout,se as useCheckoutForm};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var e,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,s=Object.getOwnPropertyNames,a=Object.prototype.hasOwnProperty,r={};((e,n)=>{for(var s in n)t(e,s,{get:n[s],enumerable:!0})})(r,{RubaPaymentMethod:()=>f,usePaymentMethodRedirectResult:()=>b}),module.exports=(e=r,((e,r,o,i)=>{if(r&&"object"==typeof r||"function"==typeof r)for(let d of s(r))a.call(e,d)||d===o||t(e,d,{get:()=>r[d],enumerable:!(i=n(r,d))||i.enumerable});return e})(t({},"__esModule",{value:!0}),e));var o=require("react"),i="RUBA_PAYMENT_METHOD",d="/embed/payment-method",l="ruba_payment_method_status",c=()=>{const e="http://127.0.0.1:3000".split(",");return"undefined"!=typeof window&&e.includes(window.location.origin)?window.location.origin:e[0]},m=()=>{const e="http://127.0.0.1:3000".split(",").join(" ");return`payment 'self' ${e}; publickey-credentials-get 'self' ${e};`},u=class e{iframe;mode;loader;loaded;closable;eventTarget;windowMessageListener;constructor(e,t,n){this.iframe=e,this.mode=t,this.loader=n,this.loaded=!1,this.closable=!0,this.eventTarget=new EventTarget,this.windowMessageListener=this.handleWindowMessage.bind(this),window.addEventListener("message",this.windowMessageListener)}static postMessage(e,t){window.parent.postMessage({...e,type:i},t)}static create(t){const{sessionToken:n,theme:s,setAsDefault:a,returnUrl:r,locale:o,onLoaded:i}=t,l=document.createElement("style");l.innerText=`\n .ruba-loader-spinner {\n width: 20px;\n aspect-ratio: 1;\n border-radius: 50%;\n background: ${"dark"===s?"#000":"#fff"};\n box-shadow: 0 0 0 0 ${"dark"===s?"#fff":"#000"};\n animation: ruba-loader-spinner-animation 1s infinite;\n }\n @keyframes ruba-loader-spinner-animation {\n 100% {box-shadow: 0 0 0 30px #0000}\n }\n body.ruba-no-scroll {\n overflow: hidden;\n }\n `,document.head.appendChild(l);const u=document.createElement("div");u.style.position="absolute",u.style.top="50%",u.style.left="50%",u.style.transform="translate(-50%, -50%)",u.style.zIndex="2147483647",u.style.colorScheme="auto";const h=document.createElement("div");h.className="ruba-loader-spinner",u.appendChild(h),document.body.classList.add("ruba-no-scroll"),document.body.appendChild(u);const f=new URL(d,c());f.searchParams.set("session_token",n),f.searchParams.set("embed","true"),f.searchParams.set("embed_origin",window.location.origin),f.searchParams.set("mode","modal"),f.searchParams.set("embed_return_url",r??window.location.href),s&&f.searchParams.set("theme",s),!1===a&&f.searchParams.set("set_default","false"),o&&f.searchParams.set("locale",o);const b=document.createElement("iframe");b.src=f.toString(),b.style.position="fixed",b.style.top="0",b.style.left="0",b.style.width="100%",b.style.height="100%",b.style.border="none",b.style.zIndex="2147483647",b.style.backgroundColor="rgba(0, 0, 0, 0.5)",b.style.colorScheme="auto",b.allow=m(),document.body.appendChild(b);const p=new e(b,"modal",u);return i&&p.addEventListener("loaded",i,{once:!0}),new Promise(e=>{p.addEventListener("loaded",()=>e(p),{once:!0})})}static createInline(t){const{sessionToken:n,element:s,theme:a,setAsDefault:r,locale:o,onLoaded:i}=t,l=new URL(d,c());l.searchParams.set("session_token",n),l.searchParams.set("embed","true"),l.searchParams.set("embed_origin",window.location.origin),l.searchParams.set("mode","inline"),a&&l.searchParams.set("theme",a),!1===r&&l.searchParams.set("set_default","false"),o&&l.searchParams.set("locale",o);const u=document.createElement("iframe");u.src=l.toString(),u.style.display="block",u.style.width="100%",u.style.height="0",u.style.border="none",u.style.colorScheme="auto",u.allow=m(),s.replaceChildren(u);const h=new e(u,"inline",null);return i&&h.addEventListener("loaded",i,{once:!0}),h}static init(){document.querySelectorAll("[data-ruba-payment-method]").forEach(t=>{t.removeEventListener("click",e.elementClickHandler),t.addEventListener("click",e.elementClickHandler)})}static getRedirectResult(){if("undefined"==typeof window)return null;const e=new URLSearchParams(window.location.search),t=e.get(l);if("succeeded"!==t&&"failed"!==t)return null;e.delete(l);const n=e.toString();return window.history.replaceState({},"",`${window.location.pathname}${n?`?${n}`:""}${window.location.hash}`),{status:t}}close(){window.removeEventListener("message",this.windowMessageListener),this.iframe.remove(),"modal"===this.mode&&document.body.classList.remove("ruba-no-scroll")}addEventListener(e,t,n){this.eventTarget.addEventListener(e,t,n)}removeEventListener(e,t){this.eventTarget.removeEventListener(e,t)}static async elementClickHandler(t){t.preventDefault();let n=t.target;for(;!n.hasAttribute("data-ruba-payment-method");){if(!n.parentElement)return;n=n.parentElement}const s=n.getAttribute("data-ruba-payment-method");if(!s)return;const a=n.getAttribute("data-ruba-payment-method-theme"),r=n.getAttribute("data-ruba-payment-method-set-as-default"),o=n.getAttribute("data-ruba-payment-method-return-url"),i=n.getAttribute("data-ruba-payment-method-locale");e.create({sessionToken:s,theme:a??void 0,setAsDefault:null===r?void 0:"false"!==r,returnUrl:o??void 0,locale:i??void 0})}handleLoaded(){this.loaded||(this.loader&&document.body.contains(this.loader)&&document.body.removeChild(this.loader),this.loaded=!0)}handleClose(){this.closable&&this.close()}handleConfirmed(){this.closable=!1}handleSuccess(){"inline"!==this.mode&&(this.closable=!0,this.close())}handleError(){this.closable=!0}handleWindowMessage({data:e,origin:t}){if(!"http://127.0.0.1:3000".split(",").includes(t))return;if(e.type!==i)return;if("resize"===e.event)return void("inline"===this.mode&&(this.iframe.style.height=`${Math.max(0,Math.ceil(e.height))}px`));const n=new CustomEvent(e.event,{detail:e,cancelable:!0});if(this.eventTarget.dispatchEvent(n),!n.defaultPrevented)switch(e.event){case"loaded":this.handleLoaded();break;case"close":this.handleClose();break;case"confirmed":this.handleConfirmed();break;case"success":this.handleSuccess();break;case"error":this.handleError()}}};if("undefined"!=typeof window&&(window.Ruba={...window.Ruba??{},EmbedPaymentMethod:u}),"undefined"!=typeof document){const e=document.currentScript;e&&e.hasAttribute("data-auto-init")&&document.addEventListener("DOMContentLoaded",()=>{u.init()})}var h=require("react/jsx-runtime"),f=({sessionToken:e,theme:t,setAsDefault:n,locale:s,onLoaded:a,onConfirmed:r,onSuccess:i,onError:d,className:l,style:c})=>{const m=(0,o.useRef)(null),u=(0,o.useRef)({onLoaded:a,onConfirmed:r,onSuccess:i,onError:d});return(0,o.useEffect)(()=>{u.current={onLoaded:a,onConfirmed:r,onSuccess:i,onError:d}}),(0,o.useEffect)(()=>{const a=m.current;if(!a)return;const r=new URL("/embed/payment-method","http://127.0.0.1:3000".split(",")[0]);r.searchParams.set("session_token",e),r.searchParams.set("embed","true"),r.searchParams.set("embed_origin",window.location.origin),t&&r.searchParams.set("theme",t),!1===n&&r.searchParams.set("set_default","false"),s&&r.searchParams.set("locale",s);const o=document.createElement("iframe");o.src=r.toString(),o.style.display="block",o.style.width="100%",o.style.height="0",o.style.border="none",o.style.colorScheme="auto",o.allow=(()=>{const e="http://127.0.0.1:3000".split(",").join(" ");return`payment 'self' ${e}; publickey-credentials-get 'self' ${e};`})(),a.replaceChildren(o);const i=({data:e,origin:t})=>{var n;if((e=>"http://127.0.0.1:3000".split(",").includes(e))(t)&&((n=e)&&"object"==typeof n&&"RUBA_PAYMENT_METHOD"===n.type))switch(e.event){case"loaded":u.current.onLoaded?.();break;case"confirmed":u.current.onConfirmed?.();break;case"success":u.current.onSuccess?.(e.paymentMethodId);break;case"error":u.current.onError?.(e.code);break;case"resize":o.style.height=`${Math.max(0,Math.ceil(e.height))}px`}};return window.addEventListener("message",i),()=>{window.removeEventListener("message",i),o.remove()}},[e,t,n,s]),(0,h.jsx)("div",{ref:m,className:l,style:c})},b=({onSuccess:e,onError:t,onResult:n})=>{const s=(0,o.useRef)(!1);(0,o.useEffect)(()=>{if(s.current)return;s.current=!0;const a=u.getRedirectResult();a&&(n?.(a),"succeeded"===a.status?e?.():t?.())},[e,t,n])};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { EmbedPaymentMethodErrorCode, EmbedPaymentMethodRedirectResult } from '../payment-method.cjs';
|
|
3
|
+
|
|
4
|
+
interface RubaPaymentMethodBaseProps {
|
|
5
|
+
sessionToken: string;
|
|
6
|
+
theme?: 'light' | 'dark';
|
|
7
|
+
setAsDefault?: boolean;
|
|
8
|
+
locale?: string;
|
|
9
|
+
onLoaded?: () => void;
|
|
10
|
+
onConfirmed?: () => void;
|
|
11
|
+
onSuccess?: (paymentMethodId: string) => void;
|
|
12
|
+
onError?: (code: EmbedPaymentMethodErrorCode) => void;
|
|
13
|
+
className?: string;
|
|
14
|
+
style?: React.CSSProperties;
|
|
15
|
+
}
|
|
16
|
+
type RubaPaymentMethodProps = RubaPaymentMethodBaseProps;
|
|
17
|
+
declare const RubaPaymentMethod: ({ sessionToken, theme, setAsDefault, locale, onLoaded, onConfirmed, onSuccess, onError, className, style, }: RubaPaymentMethodProps) => react_jsx_runtime.JSX.Element;
|
|
18
|
+
interface UsePaymentMethodRedirectResultOptions {
|
|
19
|
+
onSuccess?: () => void;
|
|
20
|
+
onError?: () => void;
|
|
21
|
+
onResult?: (result: EmbedPaymentMethodRedirectResult) => void;
|
|
22
|
+
}
|
|
23
|
+
declare const usePaymentMethodRedirectResult: ({ onSuccess, onError, onResult, }: UsePaymentMethodRedirectResultOptions) => void;
|
|
24
|
+
|
|
25
|
+
export { RubaPaymentMethod, type RubaPaymentMethodProps, type UsePaymentMethodRedirectResultOptions, usePaymentMethodRedirectResult };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { EmbedPaymentMethodErrorCode, EmbedPaymentMethodRedirectResult } from '../payment-method.js';
|
|
3
|
+
|
|
4
|
+
interface RubaPaymentMethodBaseProps {
|
|
5
|
+
sessionToken: string;
|
|
6
|
+
theme?: 'light' | 'dark';
|
|
7
|
+
setAsDefault?: boolean;
|
|
8
|
+
locale?: string;
|
|
9
|
+
onLoaded?: () => void;
|
|
10
|
+
onConfirmed?: () => void;
|
|
11
|
+
onSuccess?: (paymentMethodId: string) => void;
|
|
12
|
+
onError?: (code: EmbedPaymentMethodErrorCode) => void;
|
|
13
|
+
className?: string;
|
|
14
|
+
style?: React.CSSProperties;
|
|
15
|
+
}
|
|
16
|
+
type RubaPaymentMethodProps = RubaPaymentMethodBaseProps;
|
|
17
|
+
declare const RubaPaymentMethod: ({ sessionToken, theme, setAsDefault, locale, onLoaded, onConfirmed, onSuccess, onError, className, style, }: RubaPaymentMethodProps) => react_jsx_runtime.JSX.Element;
|
|
18
|
+
interface UsePaymentMethodRedirectResultOptions {
|
|
19
|
+
onSuccess?: () => void;
|
|
20
|
+
onError?: () => void;
|
|
21
|
+
onResult?: (result: EmbedPaymentMethodRedirectResult) => void;
|
|
22
|
+
}
|
|
23
|
+
declare const usePaymentMethodRedirectResult: ({ onSuccess, onError, onResult, }: UsePaymentMethodRedirectResultOptions) => void;
|
|
24
|
+
|
|
25
|
+
export { RubaPaymentMethod, type RubaPaymentMethodProps, type UsePaymentMethodRedirectResultOptions, usePaymentMethodRedirectResult };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{EmbedPaymentMethod as e}from"../chunk-FSZEYAE6.js";import{useEffect as r,useRef as t}from"react";import{jsx as s}from"react/jsx-runtime";var o=({sessionToken:e,theme:o,setAsDefault:n,locale:a,onLoaded:c,onConfirmed:i,onSuccess:d,onError:l,className:m,style:u})=>{const h=t(null),f=t({onLoaded:c,onConfirmed:i,onSuccess:d,onError:l});return r(()=>{f.current={onLoaded:c,onConfirmed:i,onSuccess:d,onError:l}}),r(()=>{const r=h.current;if(!r)return;const t=new URL("/embed/payment-method","http://127.0.0.1:3000".split(",")[0]);t.searchParams.set("session_token",e),t.searchParams.set("embed","true"),t.searchParams.set("embed_origin",window.location.origin),o&&t.searchParams.set("theme",o),!1===n&&t.searchParams.set("set_default","false"),a&&t.searchParams.set("locale",a);const s=document.createElement("iframe");s.src=t.toString(),s.style.display="block",s.style.width="100%",s.style.height="0",s.style.border="none",s.style.colorScheme="auto",s.allow=(()=>{const e="http://127.0.0.1:3000".split(",").join(" ");return`payment 'self' ${e}; publickey-credentials-get 'self' ${e};`})(),r.replaceChildren(s);const c=({data:e,origin:r})=>{var t;if((e=>"http://127.0.0.1:3000".split(",").includes(e))(r)&&((t=e)&&"object"==typeof t&&"RUBA_PAYMENT_METHOD"===t.type))switch(e.event){case"loaded":f.current.onLoaded?.();break;case"confirmed":f.current.onConfirmed?.();break;case"success":f.current.onSuccess?.(e.paymentMethodId);break;case"error":f.current.onError?.(e.code);break;case"resize":s.style.height=`${Math.max(0,Math.ceil(e.height))}px`}};return window.addEventListener("message",c),()=>{window.removeEventListener("message",c),s.remove()}},[e,o,n,a]),s("div",{ref:h,className:m,style:u})},n=({onSuccess:s,onError:o,onResult:n})=>{const a=t(!1);r(()=>{if(a.current)return;a.current=!0;const r=e.getRedirectResult();r&&(n?.(r),"succeeded"===r.status?s?.():o?.())},[s,o,n])};export{o as RubaPaymentMethod,n as usePaymentMethodRedirectResult};
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@getruba/checkout",
|
|
3
|
+
"description": "Ruba Checkout SDK",
|
|
4
|
+
"author": "Ruba",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"version": "0.3.0",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist"
|
|
10
|
+
],
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "https://github.com/Rubadot/ruba.git",
|
|
14
|
+
"directory": "clients/packages/checkout"
|
|
15
|
+
},
|
|
16
|
+
"exports": {
|
|
17
|
+
"./guards": {
|
|
18
|
+
"types": "./dist/guards.d.ts",
|
|
19
|
+
"default": "./dist/guards.js"
|
|
20
|
+
},
|
|
21
|
+
"./embed": {
|
|
22
|
+
"types": "./dist/embed.d.ts",
|
|
23
|
+
"default": "./dist/embed.js"
|
|
24
|
+
},
|
|
25
|
+
"./payment-method": {
|
|
26
|
+
"types": "./dist/payment-method.d.ts",
|
|
27
|
+
"default": "./dist/payment-method.js"
|
|
28
|
+
},
|
|
29
|
+
"./react/payment-method": {
|
|
30
|
+
"types": "./dist/react/payment-method.d.ts",
|
|
31
|
+
"default": "./dist/react/payment-method.js"
|
|
32
|
+
},
|
|
33
|
+
"./components": {
|
|
34
|
+
"types": "./dist/components/index.d.ts",
|
|
35
|
+
"default": "./dist/components/index.js"
|
|
36
|
+
},
|
|
37
|
+
"./hooks": {
|
|
38
|
+
"types": "./dist/hooks/index.d.ts",
|
|
39
|
+
"default": "./dist/hooks/index.js"
|
|
40
|
+
},
|
|
41
|
+
"./providers": {
|
|
42
|
+
"types": "./dist/providers/index.d.ts",
|
|
43
|
+
"default": "./dist/providers/index.js"
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"publishConfig": {
|
|
47
|
+
"access": "public"
|
|
48
|
+
},
|
|
49
|
+
"dependencies": {
|
|
50
|
+
"date-fns": "^4.1.0",
|
|
51
|
+
"event-source-plus": "^0.1.15"
|
|
52
|
+
},
|
|
53
|
+
"peerDependencies": {
|
|
54
|
+
"@stripe/react-stripe-js": "^3.6.0 || ^4.0.2 || ^5.6.1",
|
|
55
|
+
"@stripe/stripe-js": "^7.1.0 || ^8.11.0",
|
|
56
|
+
"react": "^18 || ^19"
|
|
57
|
+
},
|
|
58
|
+
"scripts": {
|
|
59
|
+
"build": "rm -rf dist/ && tsup && node scripts/sanitize-public-build.mjs",
|
|
60
|
+
"lint": "oxfmt --check . && eslint --max-warnings 0 .",
|
|
61
|
+
"test": "vitest run",
|
|
62
|
+
"typecheck": "tsc --noEmit"
|
|
63
|
+
}
|
|
64
|
+
}
|