UNPKG

@creit.tech/stellar-wallets-kit

Version:
1 lines 18.5 kB
{"version":3,"file":"stellar-wallets-kit.cjs","sources":["../src/stellar-wallets-kit.ts"],"sourcesContent":["import { StellarWalletsButton } from './components/button/stellar-wallets-button';\nimport { StellarWalletsModal } from './components/modal/stellar-wallets-modal';\nimport {\n removeAddress,\n seButtonTheme,\n setAddress,\n setAllowedWallets,\n setHorizonUrl,\n setModalTheme,\n setNetwork,\n setSelectedModuleId,\n store,\n} from './state/store';\nimport { IButtonTheme, ISupportedWallet, IModalTheme, KitActions, ModuleInterface, WalletNetwork } from './types';\n\nexport interface StellarWalletsKitParams {\n selectedWalletId: string;\n network: WalletNetwork;\n modules: ModuleInterface[];\n /**\n * @deprecated - This parameter will be removed in a future release, use `modalTheme` instead\n */\n theme?: IModalTheme;\n modalTheme?: IModalTheme;\n buttonTheme?: IButtonTheme;\n}\n\nexport class StellarWalletsKit implements KitActions {\n private buttonElement?: StellarWalletsButton;\n private modalElement?: StellarWalletsModal;\n private readonly modules: ModuleInterface[];\n\n private get selectedModule(): ModuleInterface {\n const target: ModuleInterface | undefined = this.modules.find(\n (mod: ModuleInterface): boolean => mod.productId === store.getValue().selectedModuleId\n );\n\n if (!target) {\n throw { code: -3, message: 'Please set the wallet first' };\n }\n\n return target;\n }\n\n constructor(params: StellarWalletsKitParams) {\n this.modules = params.modules;\n this.setWallet(params.selectedWalletId);\n setNetwork(params.network);\n\n const modalTheme: IModalTheme | undefined = params.theme || params.modalTheme;\n if (modalTheme) {\n setModalTheme(modalTheme);\n }\n\n if (params.buttonTheme) {\n seButtonTheme(params.buttonTheme);\n }\n\n this.getSupportedWallets().then((value: ISupportedWallet[]): void => {\n setAllowedWallets(value);\n });\n }\n\n /**\n * This method will return an array with all wallets supported by this kit but will let you know those the user have already installed/has access to\n * There are wallets that are by default available since they either don't need to be installed or have a fallback\n */\n public async getSupportedWallets(): Promise<ISupportedWallet[]> {\n return Promise.all(\n this.modules.map(async (mod: ModuleInterface): Promise<ISupportedWallet> => {\n const timer: Promise<false> = new Promise(r => setTimeout(() => r(false), 500));\n return {\n id: mod.productId,\n name: mod.productName,\n type: mod.moduleType,\n icon: mod.productIcon,\n isAvailable: await Promise.race([timer, mod.isAvailable()]),\n url: mod.productUrl,\n };\n })\n );\n }\n\n public setWallet(id: string): void {\n const target: ModuleInterface | undefined = this.modules.find(\n (mod: ModuleInterface): boolean => mod.productId === id\n );\n\n if (!target) {\n throw new Error(`Wallet id \"${id}\" is not supported`);\n }\n\n setSelectedModuleId(target.productId);\n }\n\n public async getAddress(params?: { path?: string }): Promise<{ address: string }> {\n const { address } = await this.selectedModule.getAddress(params);\n setAddress(address);\n return { address };\n }\n\n public async signTransaction(\n xdr: string,\n opts?: {\n networkPassphrase?: string;\n address?: string;\n path?: string;\n submit?: boolean;\n submitUrl?: string;\n }\n ): Promise<{ signedTxXdr: string; signerAddress?: string }> {\n return this.selectedModule.signTransaction(xdr, {\n ...opts,\n networkPassphrase: opts?.networkPassphrase || store.getValue().selectedNetwork,\n });\n }\n\n public async signAuthEntry(\n authEntry: string,\n opts?: {\n networkPassphrase?: string;\n address?: string;\n path?: string;\n }\n ): Promise<{ signedAuthEntry: string; signerAddress?: string }> {\n return this.selectedModule.signAuthEntry(authEntry, {\n ...opts,\n networkPassphrase: opts?.networkPassphrase || store.getValue().selectedNetwork,\n });\n }\n\n public async signMessage(\n message: string,\n opts?: {\n networkPassphrase?: string;\n address?: string;\n path?: string;\n }\n ): Promise<{ signedMessage: string; signerAddress?: string }> {\n return this.selectedModule.signMessage(message, {\n ...opts,\n networkPassphrase: opts?.networkPassphrase || store.getValue().selectedNetwork,\n });\n }\n\n async getNetwork(): Promise<{ network: string; networkPassphrase: string }> {\n return this.selectedModule.getNetwork();\n }\n\n async disconnect(): Promise<void> {\n removeAddress();\n }\n\n // ---- Button methods\n public isButtonCreated(): boolean {\n return !!this.buttonElement;\n }\n\n /**\n * This method allows developers to set their own buttons (for connection and disconnection) on their website\n * while letting the kit handle the logic behind opening the modal, setting and removing the address from the storage, etc\n */\n public assignButtons(params: {\n connectEl: HTMLElement | string;\n disconnectEl?: HTMLElement | string;\n onConnect: (response: { address: string }) => void;\n onDisconnect: () => void;\n }): void {\n const connectEl: HTMLElement =\n typeof params.connectEl === 'string'\n ? (document.querySelector(params.connectEl) as HTMLElement)\n : params.connectEl;\n\n if (!connectEl) throw new Error('connectEl is not available');\n\n connectEl.addEventListener(\n 'click',\n () => {\n this.openModal({\n onWalletSelected: option => {\n setSelectedModuleId(option.id);\n this.getAddress().then((r: { address: string }) => params.onConnect(r));\n },\n }).then();\n },\n false\n );\n\n if (!params.disconnectEl) return;\n\n const disconnectEl: HTMLElement =\n typeof params.disconnectEl === 'string'\n ? (document.querySelector(params.disconnectEl) as HTMLElement)\n : params.disconnectEl;\n\n if (!disconnectEl) throw new Error('disconnectEl is not available');\n\n disconnectEl.addEventListener(\n 'click',\n () => {\n params.onDisconnect();\n removeAddress();\n\n if (this.selectedModule.disconnect) {\n this.selectedModule.disconnect().then();\n }\n },\n false\n );\n }\n\n /**\n *\n * @param params {Object}\n * @param params.container {HTMLElement} - The container where the button should be rendered.\n * @param params.onConnect {Function} - This callback is called after the user has clicked the button and selected a wallet\n * @param params.onClosed {Function} - This callback is called if the user closes the modal without selecting any wallet.\n * @param params.onError {Function} - This callback is called if there is an error while trying to get the address once the user has selected the wallet from the modal.\n * @param params.onDisconnect {Function} - This callback is called once the user disconnects from the dropdown modal\n * @param params.horizonUrl {String} - If this url is set, the dropdown modal will show the current XLM balance of the address fetched from the wallet\n * @param params.buttonText {String} - A custom text to set inside the button.\n */\n public async createButton(params: {\n container: HTMLElement;\n onConnect: (response: { address: string }) => void;\n onClosed?: (err: Error) => void;\n onError?: (err: Error) => void;\n onDisconnect: () => void;\n horizonUrl?: string;\n buttonText?: string;\n }): Promise<void> {\n if (this.buttonElement) {\n throw new Error(`Stellar Wallets Kit button is already created`);\n }\n\n this.buttonElement = document.createElement('stellar-wallets-button') as StellarWalletsButton;\n\n if (params.buttonText) {\n this.buttonElement.setAttribute('buttonText', params.buttonText);\n }\n\n if (params.horizonUrl) {\n setHorizonUrl(params.horizonUrl);\n }\n\n params.container.appendChild(this.buttonElement);\n\n this.buttonElement.addEventListener(\n 'button-clicked',\n () => {\n this.openModal({\n onWalletSelected: option => {\n setSelectedModuleId(option.id);\n this.getAddress()\n .then((r: { address: string }) => params.onConnect(r))\n .catch(err => {\n if (params.onError) params.onError(err);\n });\n },\n onClosed: (err: Error): void => {\n if (params.onClosed) params.onClosed(err);\n },\n });\n },\n false\n );\n\n this.buttonElement.addEventListener(\n 'disconnect-wallet',\n () => {\n params.onDisconnect();\n\n if (this.selectedModule.disconnect) {\n this.selectedModule.disconnect();\n }\n },\n false\n );\n }\n\n /**\n * Removes the button elements from the HTML and from the kit's instance.\n *\n * @param params.skipDisconnect - Set this to `true` if you want to prevent that we disconnect (for example, disconnecting WalletConnect or removing the address)\n */\n public async removeButton(params?: { skipDisconnect?: boolean }): Promise<void> {\n if (!this.buttonElement) {\n throw new Error(`Stellar Wallets Kit button hasn't been created yet`);\n }\n\n if (params?.skipDisconnect !== true) {\n this.buttonElement.disconnect();\n }\n\n this.buttonElement.remove();\n delete this.buttonElement;\n }\n // ---- END Button methods\n\n // ---- Modal methods\n public async openModal(params: {\n onWalletSelected: (option: ISupportedWallet) => void;\n onClosed?: (err: Error) => void;\n modalTitle?: string;\n notAvailableText?: string;\n }): Promise<void> {\n if (this.modalElement && !this.buttonElement) {\n throw new Error(`Stellar Wallets Kit modal is already open`);\n } else {\n this.modalElement = document.createElement('stellar-wallets-modal') as StellarWalletsModal;\n }\n\n this.modalElement.setAttribute('showModal', '');\n\n if (params.modalTitle) {\n this.modalElement.setAttribute('modalTitle', params.modalTitle);\n }\n\n if (params.notAvailableText) {\n this.modalElement.setAttribute('notAvailableText', params.notAvailableText);\n }\n\n document.body.appendChild(this.modalElement);\n\n const listener = (event: CustomEvent) => {\n params.onWalletSelected(event.detail);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.modalElement.removeEventListener('wallet-selected', listener, false);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n document.body.removeChild(this.modalElement);\n this.modalElement = undefined;\n };\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.modalElement.addEventListener('wallet-selected', listener, false);\n\n const errorListener = (event: CustomEvent) => {\n if (params.onClosed) {\n params.onClosed(event.detail);\n }\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.modalElement.removeEventListener('wallet-selected', listener, false);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.modalElement.removeEventListener('modal-closed', errorListener, false);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n document.body.removeChild(this.modalElement);\n this.modalElement = undefined;\n };\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.modalElement.addEventListener('modal-closed', errorListener, false);\n }\n // ---- END Modal methods\n}\n"],"names":["store","setNetwork","setModalTheme","seButtonTheme","setAllowedWallets","setSelectedModuleId","setAddress","removeAddress","setHorizonUrl"],"mappings":"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"}