@pybara/pybara-js 0.2.0 → 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.
@@ -0,0 +1,192 @@
1
+ /* Pybara.js - pybara.com */
2
+ //#region src/modal/config.ts
3
+ var e = {
4
+ Z_INDEX: 999999,
5
+ BACKGROUND: "rgba(0, 0, 0, 0.7)"
6
+ }, t = {
7
+ OVERLAY_FADE_IN_MS: 200,
8
+ PANEL_OPEN_MS: 300,
9
+ PANEL_CLOSE_MS: 200,
10
+ OVERLAY_FADE_OUT_DELAY_MS: 50,
11
+ OVERLAY_FADE_OUT_MS: 150
12
+ }, n = 0, r = 0, i = 0;
13
+ function a(e) {
14
+ e.preventDefault();
15
+ }
16
+ function o(e) {
17
+ e.preventDefault();
18
+ }
19
+ function s(e) {
20
+ e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement || [
21
+ "ArrowUp",
22
+ "ArrowDown",
23
+ "PageUp",
24
+ "PageDown",
25
+ "Home",
26
+ "End",
27
+ " "
28
+ ].includes(e.key) && e.preventDefault();
29
+ }
30
+ function c() {
31
+ window.scrollTo(r, i);
32
+ }
33
+ function l() {
34
+ n === 0 && (r = window.scrollX, i = window.scrollY, window.addEventListener("wheel", a, { passive: !1 }), window.addEventListener("touchmove", o, { passive: !1 }), window.addEventListener("keydown", s), window.addEventListener("scroll", c)), n += 1;
35
+ }
36
+ function u() {
37
+ n !== 0 && (--n, n === 0 && (window.removeEventListener("wheel", a), window.removeEventListener("touchmove", o), window.removeEventListener("keydown", s), window.removeEventListener("scroll", c)));
38
+ }
39
+ //#endregion
40
+ //#region src/modal/modal.ts
41
+ function d() {
42
+ return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
43
+ }
44
+ var f = [
45
+ "DESTINATION_REFUSED",
46
+ "INVALID_BENEFICIARY",
47
+ "INVALID_CHECKOUT",
48
+ "NO_WALLET_AVAILABLE",
49
+ "RATE_UNAVAILABLE",
50
+ "SITE_MISMATCH"
51
+ ];
52
+ function p(e) {
53
+ return f.includes(e) ? e : "UNKNOWN";
54
+ }
55
+ var m = class extends Error {
56
+ constructor(e, t) {
57
+ super(t), this.name = "EmbeddedError", this.code = e, Object.setPrototypeOf(this, new.target.prototype);
58
+ }
59
+ };
60
+ function h(e) {
61
+ return typeof e == "object" && !!e && typeof e.type == "string" && e.type.startsWith("pybara_embedded_");
62
+ }
63
+ var g = class {
64
+ constructor(e) {
65
+ this.overlay = null, this.iframe = null, this.spinner = null, this.handleMessage = null, this.handleEscapeKey = null, this.closable = !0, this.iframeLoaded = !1, this.pendingPaymentData = null, this.config = e, this.walletOrigin = new URL(e.walletUrl).origin, this.createIframe();
66
+ }
67
+ createIframe() {
68
+ let n = document.createElement("div");
69
+ n.className = "pybara-checkout-overlay", n.style.cssText = `
70
+ position: fixed;
71
+ top: 0;
72
+ left: 0;
73
+ right: 0;
74
+ bottom: 0;
75
+ background: ${e.BACKGROUND};
76
+ z-index: ${e.Z_INDEX};
77
+ display: none;
78
+ align-items: center;
79
+ justify-content: center;
80
+ overscroll-behavior: none;
81
+ user-select: none;
82
+ `;
83
+ let r = document.createElement("iframe");
84
+ r.src = `${this.config.walletUrl}/pay?mode=embedded`, r.title = "Pybara Wallet", r.style.cssText = "\n width: 100%;\n max-width: 500px;\n height: 0;\n max-height: 90vh;\n border: none;\n border-radius: 20px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5);\n overscroll-behavior: none;\n ";
85
+ let i = document.createElement("div");
86
+ i.setAttribute("aria-hidden", "true"), i.style.cssText = "\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n pointer-events: none;\n ", i.innerHTML = "\n <svg viewBox=\"0 0 50 50\" width=\"50\" height=\"50\">\n <circle cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke=\"white\" stroke-width=\"3\" stroke-linecap=\"round\" stroke-dasharray=\"80\" stroke-dashoffset=\"20\"/>\n </svg>\n ", i.querySelector("svg")?.animate([{ transform: "rotate(0deg)" }, { transform: "rotate(360deg)" }], {
87
+ duration: 1e3,
88
+ iterations: Infinity
89
+ }), r.addEventListener("load", () => {
90
+ this.iframeLoaded = !0, this.pendingPaymentData &&= (this.sendInitMessage(this.pendingPaymentData), null);
91
+ }, { once: !0 }), this.handleMessage = (e) => {
92
+ if (e.origin === this.walletOrigin && e.source === r.contentWindow && h(e.data)) switch (e.data.type) {
93
+ case "pybara_embedded_result":
94
+ this.config.onSuccess?.({
95
+ blockIndex: e.data.blockIndex,
96
+ reference: e.data.reference,
97
+ payerPrincipal: e.data.payerPrincipal,
98
+ token: e.data.token
99
+ });
100
+ break;
101
+ case "pybara_embedded_error":
102
+ this.close(), this.config.onError?.(new m(p(e.data.code), e.data.message));
103
+ break;
104
+ case "pybara_embedded_closed":
105
+ this.close(), this.config.onClose?.();
106
+ break;
107
+ case "pybara_embedded_resize":
108
+ r.style.height !== `${e.data.height}px` && (r.style.height = `${e.data.height}px`), this.spinner && (this.spinner.remove(), this.spinner = null, d() || r.animate([{
109
+ transform: "translateY(20px)",
110
+ opacity: 0
111
+ }, {
112
+ transform: "none",
113
+ opacity: 1
114
+ }], {
115
+ duration: t.PANEL_OPEN_MS,
116
+ easing: "ease"
117
+ }));
118
+ break;
119
+ case "pybara_embedded_closable": this.closable = e.data.closable;
120
+ }
121
+ }, window.addEventListener("message", this.handleMessage), this.handleEscapeKey = (e) => {
122
+ e.key === "Escape" && this.closable && (this.close(), this.config.onClose?.());
123
+ }, document.addEventListener("keydown", this.handleEscapeKey), n.appendChild(i), n.appendChild(r), document.body.appendChild(n), this.overlay = n, this.iframe = r, this.spinner = i;
124
+ }
125
+ sendInitMessage(e) {
126
+ let t = {
127
+ type: "pybara_embedded_init",
128
+ beneficiary: e.modalData.beneficiary,
129
+ salt: e.modalData.salt,
130
+ ...e.modalData.amountUSD === void 0 ? {} : { amountUSD: e.modalData.amountUSD },
131
+ reference: e.modalData.reference,
132
+ context: this.config.context,
133
+ ...e.recurring ? { recurring: e.recurring } : {},
134
+ ...e.sdkFields ? { sdkFields: e.sdkFields } : {},
135
+ ...e.checkout ? { checkout: e.checkout } : {},
136
+ ...this.config.thankYouMessage ? { thankYouMessage: this.config.thankYouMessage } : {}
137
+ };
138
+ this.iframe?.contentWindow?.postMessage(t, this.walletOrigin);
139
+ }
140
+ open() {
141
+ this.overlay && this.overlay.style.display !== "flex" && (l(), this.overlay.style.display = "flex", d() || this.overlay.animate([{ opacity: 0 }, { opacity: 1 }], {
142
+ duration: t.OVERLAY_FADE_IN_MS,
143
+ easing: "ease"
144
+ }));
145
+ }
146
+ show(e) {
147
+ this.open(), this.iframeLoaded ? this.sendInitMessage(e) : this.pendingPaymentData = e;
148
+ }
149
+ renderTerminalState(t) {
150
+ this.close(), l();
151
+ let n = document.createElement("div");
152
+ n.className = "pybara-checkout-overlay", n.style.cssText = `
153
+ position: fixed;
154
+ top: 0;
155
+ left: 0;
156
+ right: 0;
157
+ bottom: 0;
158
+ background: ${e.BACKGROUND};
159
+ z-index: ${e.Z_INDEX};
160
+ display: flex;
161
+ align-items: center;
162
+ justify-content: center;
163
+ user-select: none;
164
+ `;
165
+ let r = document.createElement("div");
166
+ r.style.cssText = "\n background: #fff;\n border-radius: 12px;\n color: #666;\n padding: 2rem;\n line-height: 1.4;\n max-width: 360px;\n text-align: center;\n font-family: system-ui, sans-serif;\n user-select: text;\n ", r.textContent = t, n.appendChild(r), n.addEventListener("click", (e) => {
167
+ e.target === n && (n.remove(), u(), this.config.onClose?.());
168
+ }), document.body.appendChild(n), this.overlay = n;
169
+ }
170
+ close() {
171
+ this.handleMessage &&= (window.removeEventListener("message", this.handleMessage), null), this.handleEscapeKey &&= (document.removeEventListener("keydown", this.handleEscapeKey), null), u();
172
+ let e = this.overlay, n = this.iframe;
173
+ this.overlay = null, this.iframe = null, this.spinner = null, this.iframeLoaded = !1, this.pendingPaymentData = null, this.closable = !0, e && (e.style.display === "none" || d() ? e.remove() : (e.style.pointerEvents = "none", n?.animate([{
174
+ transform: "scale(1)",
175
+ opacity: 1
176
+ }, {
177
+ transform: "scale(0.95)",
178
+ opacity: 0
179
+ }], {
180
+ duration: t.PANEL_CLOSE_MS,
181
+ easing: "ease-out",
182
+ fill: "forwards"
183
+ }), e.animate([{ opacity: 1 }, { opacity: 0 }], {
184
+ duration: t.OVERLAY_FADE_OUT_MS,
185
+ delay: t.OVERLAY_FADE_OUT_DELAY_MS,
186
+ easing: "ease-out",
187
+ fill: "forwards"
188
+ }).finished.then(() => e.remove(), () => e.remove())));
189
+ }
190
+ };
191
+ //#endregion
192
+ export { m as n, g as t };