diff --git a/src/lib/StringPay.d.ts b/src/lib/StringPay.d.ts index 3c2e969..1ccbf3b 100644 --- a/src/lib/StringPay.d.ts +++ b/src/lib/StringPay.d.ts @@ -23,13 +23,20 @@ export interface StringOptions { bypassDeviceCheck?: boolean; } +export interface TransactionResponse { + txID: string; + txUrl: string; +} + export declare class StringPay { isLoaded: boolean; payload?: StringPayload; frame?: HTMLIFrameElement; container?: Element; - onFrameLoad: () => void; - onFrameClose: () => void; + onFrameLoad: () => void; + onFrameClose: () => void; + onTxSuccess: (req: StringPayload, tx: TransactionResponse) => void; + onTxError: (req: StringPayload, txErr: any) => void; init(options: StringOptions): void; loadFrame(payload: StringPayload): void; } diff --git a/src/lib/StringPay.ts b/src/lib/StringPay.ts index b26d10d..cbefd0c 100644 --- a/src/lib/StringPay.ts +++ b/src/lib/StringPay.ts @@ -1,4 +1,5 @@ import { createServices, type Services } from "./services"; +import type { TransactionResponse } from "./services/apiClient.service"; export interface StringPayload { assetName: string; @@ -61,8 +62,10 @@ export class StringPay { #services: Services; private _IFRAME_URL: string; - onFrameLoad = () => {}; - onFrameClose = () => {}; + onFrameLoad: () => void; + onFrameClose: () => void; + onTxSuccess: (req: StringPayload, tx: TransactionResponse) => void; + onTxError: (req: StringPayload, txErr: any) => void; init(options: StringOptions) { const envDetails = ENV_TABLE[options.env]; diff --git a/src/lib/services/events.service.ts b/src/lib/services/events.service.ts index 294e887..7ea73f9 100644 --- a/src/lib/services/events.service.ts +++ b/src/lib/services/events.service.ts @@ -45,16 +45,14 @@ export function createEventsService(iframeUrl: string, authService: AuthService, const _handleEvent = async (e: any) => { if (e.origin !== iframeUrl) return; - - const stringPay: StringPay = (window).StringPay; - + try { const payload = JSON.parse(e.data); const channel = payload.channel; const event = payload.event; if (channel === CHANNEL) { const handler = eventHandlers[event.eventName]; - if (handler) await handler(event, stringPay); + if (handler) await handler(event, window.StringPay); else console.debug("SDK :: Unhandled event: ", event); } } catch (error) { @@ -74,12 +72,13 @@ export function createEventsService(iframeUrl: string, authService: AuthService, function cleanup() { unregisterEvents(); - - if ((window).StringPay) { - (window).StringPay.frame?.remove(); - (window).StringPay.frame = undefined; - (window).StringPay.isLoaded = false; - (window).StringPay.onFrameClose(); + const stringPay = window.StringPay; + + if (stringPay) { + stringPay.frame?.remove(); + stringPay.frame = undefined; + stringPay.isLoaded = false; + if (stringPay.onFrameClose) stringPay.onFrameClose(); } } @@ -116,7 +115,8 @@ export function createEventsService(iframeUrl: string, authService: AuthService, const iframePayload = createIframePayload(stringPay.payload, user); sendEvent(stringPay.frame, Events.LOAD_PAYLOAD, iframePayload); stringPay.isLoaded = true; - stringPay.onFrameLoad(); + + if (stringPay.onFrameLoad) stringPay.onFrameLoad(); } async function onIframeClose() { @@ -198,8 +198,8 @@ export function createEventsService(iframeUrl: string, authService: AuthService, quoteService.stopQuote(); } - async function onConfirmTransaction(event: StringEvent, { frame }: StringPay) { - if (!frame) throw new Error("Iframe not ready"); + async function onConfirmTransaction(event: StringEvent, stringPay: StringPay) { + if (!stringPay.frame) throw new Error("Iframe not ready"); try { const paymentInfo = {}; @@ -208,10 +208,17 @@ export function createEventsService(iframeUrl: string, authService: AuthService, const data = event.data; data.paymentInfo = paymentInfo; - const txHash = await apiClient.transact(data); - sendEvent(frame, Events.RECEIVE_CONFIRM_TRANSACTION, txHash); + const txRes = await apiClient.transact(data); + sendEvent(stringPay.frame, Events.RECEIVE_CONFIRM_TRANSACTION, txRes); + + if (stringPay.onTxSuccess && stringPay.payload) { + stringPay.onTxSuccess(stringPay.payload, txRes); + } } catch (error: any) { - sendEvent(frame, Events.RECEIVE_CONFIRM_TRANSACTION, {}, error); + sendEvent(stringPay.frame, Events.RECEIVE_CONFIRM_TRANSACTION, {}, error); + if (stringPay.onTxError && stringPay.payload) { + stringPay.onTxError(stringPay.payload, error); + } } } diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index e8b28ce..a571cad 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,8 +1,9 @@