import { Checkout, IWidgetsFactory, IWidgetsFactoryCreate, Widget, WidgetConfiguration, WidgetConfigurations, WidgetProperties, WidgetType, WrappedBrowserProvider, } from '@imtbl/checkout-sdk'; import './i18n'; import { addProviderListenersForWidgetRoot, DEFAULT_THEME, sendProviderUpdatedEvent, } from './lib'; import { WalletConnectManager } from './lib/walletConnect'; import { AddTokens } from './widgets/add-tokens/AddTokensRoot'; import { Bridge } from './widgets/bridge/BridgeWidgetRoot'; import { Connect } from './widgets/connect/ConnectWidgetRoot'; import { CommerceWidgetRoot } from './widgets/immutable-commerce/CommerceWidgetRoot'; import { OnRamp } from './widgets/on-ramp/OnRampWidgetRoot'; import { Sale } from './widgets/sale/SaleWidgetRoot'; import { Swap } from './widgets/swap/SwapWidgetRoot'; import { Wallet } from './widgets/wallet/WalletWidgetRoot'; import { Purchase } from './widgets/purchase/PurchaseWidgetRoot'; export class WidgetsFactory implements IWidgetsFactory { private sdk: Checkout; private widgetConfig: WidgetConfiguration; constructor(sdk: Checkout, widgetConfig: WidgetConfiguration) { this.sdk = sdk; this.widgetConfig = widgetConfig; if (!this.widgetConfig.theme) this.widgetConfig.theme = DEFAULT_THEME; if (widgetConfig.walletConnect) { try { WalletConnectManager.getInstance().initialise( sdk.config.environment, widgetConfig.walletConnect, this.widgetConfig.theme, sdk.config.remote.getConfig('connect') as Promise, ); } catch (err) { // eslint-disable-next-line no-console console.warn('WalletConnect has not been set up correctly'); } } } updateProvider(provider: WrappedBrowserProvider) { addProviderListenersForWidgetRoot(provider); sendProviderUpdatedEvent({ provider }); } create: IWidgetsFactoryCreate = (type: T, props?: WidgetProperties) => { const { provider } = props ?? {}; const config = props?.config as WidgetConfigurations[WidgetType] || {}; switch (type) { case WidgetType.CONNECT: { return new Connect(this.sdk, { config: { ...this.widgetConfig, ...(config) }, provider, }) as Widget as Widget; } case WidgetType.BRIDGE: { return new Bridge(this.sdk, { config: { ...this.widgetConfig, ...(config) }, provider, }) as Widget as Widget; } case WidgetType.WALLET: { return new Wallet(this.sdk, { config: { ...this.widgetConfig, ...(config) }, provider, }) as Widget as Widget; } case WidgetType.SWAP: { return new Swap(this.sdk, { config: { ...this.widgetConfig, ...(config) }, provider, }) as Widget as Widget; } case WidgetType.ONRAMP: { return new OnRamp(this.sdk, { config: { ...this.widgetConfig, ...(config) }, provider, }) as Widget as Widget; } case WidgetType.SALE: { return new Sale(this.sdk, { config: { ...this.widgetConfig, ...(config) }, provider, }) as Widget as Widget; } case WidgetType.IMMUTABLE_COMMERCE: { return new CommerceWidgetRoot(this.sdk, { config: { ...this.widgetConfig, ...(config) }, provider, }) as Widget as Widget; } case WidgetType.ADD_TOKENS: { return new AddTokens(this.sdk, { config: { ...this.widgetConfig, ...(config) }, provider, }) as Widget as Widget; } case WidgetType.PURCHASE: { return new Purchase(this.sdk, { config: { ...this.widgetConfig, ...(config) }, provider, }) as Widget as Widget; } default: throw new Error('widget type not supported'); } }; }