UNPKG

@creit.tech/stellar-wallets-kit

Version:
1 lines 18.6 kB
{"version":3,"file":"stellar-wallets-kit.mjs","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":[],"mappings":"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"}