UNPKG

@uphold/topper-web-sdk

Version:

Seamless integration of Topper on Web applications

1 lines 8.55 kB
{"version":3,"sources":["../src/enums/environments.ts","../src/enums/events.ts","../src/enums/initial-screens.ts","../src/enums/locales.ts","../src/enums/themes.ts","../src/enums/urls.ts","../src/enums/variants.ts","../src/topper-web-sdk.ts"],"names":["Environments","Events","InitialScreens","Locales","Themes","Urls","Variants","queryString","TOPPER_WEB_SDK_EVENT_SOURCE","TopperWebSdk","config","eventName","data","mainWindow","name","payload","handler","event","bootstrapToken","bootstrapTokens","iframeElement","baseUrl","bt","isTopperSelfEmbed","queryParams","url"],"mappings":"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","sourcesContent":["export enum Environments {\n PRODUCTION = 'production',\n SANDBOX = 'sandbox'\n}\n","export enum Events {\n ALL = '*',\n ORDER_CONTINUE_BUTTON_CLICKED = 'orderContinueButtonClicked',\n ORDER_PLACED = 'orderPlaced',\n ORDER_WALLET_SEND_BUTTON_CLICKED = 'orderWalletSendButtonClicked',\n WIDGET_CONTINUE_BUTTON_CLICKED = 'widgetContinueButtonClicked'\n}\n","export enum InitialScreens {\n AUTHENTICATION = 'authentication'\n}\n","export enum Locales {\n EN = 'en',\n EN_US = 'en-US',\n PT = 'pt',\n PT_BR = 'pt-BR',\n ES = 'es',\n ES_ES = 'es-ES'\n}\n","export enum Themes {\n DARK = 'dark',\n LIGHT = 'light'\n}\n","export enum Urls {\n PRODUCTION = 'https://app.topperpay.com',\n SANDBOX = 'https://app.sandbox.topperpay.com',\n WEBSITE = 'https://www.topperpay.com/'\n}\n","export enum Variants {\n IFRAME = 'iframe',\n NEW_TAB = 'new-tab',\n SAME_TAB = 'same-tab'\n}\n","import { Config } from './interfaces';\nimport { Environments, Events, Urls, Variants } from './enums';\nimport { EventHandler } from 'types';\nimport queryString from 'query-string';\n\nconst TOPPER_WEB_SDK_EVENT_SOURCE = '@topper-web-sdk';\n\nclass TopperWebSdk {\n private eventHandlers: { [key in Events]?: EventHandler[] } = {};\n private handleMessage: ((event: MessageEvent) => void) | null = null;\n private isInitialized: boolean = false;\n private targetWindow: Window | null = null;\n\n public config: Config;\n\n constructor(config: Config = {}) {\n this.config = {\n active_flow: null,\n environment: Environments.PRODUCTION,\n initial_screen: null,\n is_android_app: false,\n is_ios_app: false,\n variant: Variants.NEW_TAB,\n ...config\n };\n }\n\n static triggerEvent(eventName: Events, data?: any): void {\n const mainWindow = window.self !== window.top ? window.parent : window.opener;\n\n if (!mainWindow) {\n return;\n }\n\n mainWindow.postMessage(\n {\n name: eventName,\n payload: data,\n source: TOPPER_WEB_SDK_EVENT_SOURCE\n },\n '*'\n );\n }\n\n private triggerEvent(name: Events, payload?: any): void {\n this.eventHandlers[Events.ALL]?.forEach(handler => handler({ data: payload, name }));\n\n this.eventHandlers[name]?.forEach(handler => handler({ data: payload }));\n }\n\n private setConfig(config: Config): void {\n this.config = { ...this.config, ...config };\n }\n\n private initializeMessageListener(): void {\n this.handleMessage = (event: MessageEvent) => {\n const allowedOrigins = [Urls.PRODUCTION, Urls.SANDBOX];\n\n if (!allowedOrigins.includes(event.origin as Urls) || event.source !== this.targetWindow) {\n return;\n }\n\n if (event.data.name && event.data.source === TOPPER_WEB_SDK_EVENT_SOURCE) {\n this.triggerEvent(event.data.name as Events, event.data.payload);\n }\n };\n\n window.addEventListener('message', this.handleMessage);\n }\n\n dispose(): void {\n window.removeEventListener('message', this.handleMessage as EventListener, false);\n this.eventHandlers = {};\n }\n\n initialize({\n bootstrapToken,\n bootstrapTokens,\n config,\n iframeElement\n }: {\n bootstrapToken?: string;\n bootstrapTokens?: string[];\n iframeElement?: HTMLIFrameElement;\n config?: Config;\n }): void {\n if (this.isInitialized) {\n throw new Error('This TopperWebSdk instance was already initialized.');\n }\n\n this.isInitialized = true;\n\n if (config) {\n this.setConfig(config);\n }\n\n const baseUrl = this.config.environment === Environments.SANDBOX ? Urls.SANDBOX : Urls.PRODUCTION;\n const bt = bootstrapTokens ? bootstrapTokens.join(';') : bootstrapToken;\n const isTopperSelfEmbed = window.location.href.includes(Urls.WEBSITE);\n\n const queryParams = {\n bt,\n ...(this.config.active_flow && { active_flow: this.config.active_flow }),\n ...(isTopperSelfEmbed && { embed: 1 }),\n ...(this.eventHandlers &&\n Object.keys(this.eventHandlers).length && { events: Object.keys(this.eventHandlers).join(',') }),\n ...(this.config.is_android_app && { is_android_app: 1 }),\n ...(this.config.is_ios_app && { is_ios_app: 1 }),\n ...(this.config.initial_screen && { initial_screen: this.config.initial_screen }),\n ...(this.config.locale && { locale: this.config.locale }),\n ...(this.config.theme && { theme: this.config.theme })\n };\n\n const url = queryString.stringifyUrl({ query: queryParams, url: `${baseUrl}/` });\n\n if (this.config.variant === Variants.IFRAME) {\n if (!iframeElement) {\n throw new Error('iframeElement is required for iframe variant');\n }\n\n iframeElement.src = url;\n this.targetWindow = iframeElement.contentWindow;\n } else if (this.config.variant === Variants.NEW_TAB) {\n this.targetWindow = window.open(url, '_blank');\n } else if (this.config.variant === Variants.SAME_TAB) {\n window.location.href = url;\n\n return;\n }\n\n this.initializeMessageListener();\n }\n\n on(eventName: Events, handler: EventHandler): void {\n if (!this.eventHandlers[eventName]) {\n this.eventHandlers[eventName] = [];\n }\n\n this.eventHandlers[eventName]?.push(handler);\n }\n}\n\nexport { TopperWebSdk };\n"]}