From 294b1e7e25ebc92a220079c2c5082d855789b8d7 Mon Sep 17 00:00:00 2001 From: ruisantiago Date: Wed, 10 Sep 2025 15:47:57 +0100 Subject: [PATCH] Enhance wallet support and documentation - Added support for Intear Wallet and OKX Wallet in package.json and pnpm-lock.yaml. - Updated README.md to include wallet selection feature and list of available wallets. - Modified BitteWalletContext to support enabledWallets prop for customizable wallet selection. - Improved type definitions and added helper functions for wallet module management. --- README.md | 180 +++++++++++++++++++++++++++++++++---- package.json | 2 + pnpm-lock.yaml | 39 ++++++++ src/BitteWalletContext.tsx | 13 ++- src/index.ts | 1 + src/wallet/bitte-wallet.ts | 166 ++++++++++++++++++++++++---------- 6 files changed, 336 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index cbf6c87..8c7f555 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # @bitte-ai/react -This package contains React helpers for interacting with Bitte Wallet. +This package contains React helpers for interacting with Bitte Wallet and other NEAR wallets.

@@ -8,60 +8,210 @@ This package contains React helpers for interacting with Bitte Wallet.

- ## Summary -- [Installing](#Installing) - -- [BitteWalletContextProvider (default)](#bittewalletcontextprovider) : The default Bitte Wallet provider - +- [Installing](#installing) +- [Wallet Selection](#wallet-selection) +- [BitteWalletContextProvider](#bittewalletcontextprovider) +- [Available Wallets](#available-wallets) +- [Usage Examples](#usage-examples) +- [Legacy API](#legacy-api) +- [Troubleshooting](#troubleshooting) # Installing ### NPM: -``` +```bash npm install @bitte-ai/react npm install @near-wallet-selector/modal-ui ``` ### Yarn: -``` +```bash yarn add @bitte-ai/react yarn add @near-wallet-selector/modal-ui ``` ### PNPM: -``` +```bash pnpm install @bitte-ai/react pnpm install @near-wallet-selector/modal-ui ``` +# Wallet Selection + +You can now easily choose which wallets to display by using the `enabledWallets` prop. This gives developers full control over the wallet selection experience. + +## Available Wallets + +The following wallets are supported: + +- `"intear"` - Intear Wallet +- `"hot"` - Here Wallet (formerly HOT Wallet) +- `"okx"` - OKX Wallet +- `"bitte"` - Bitte Wallet +- `"meteor"` - Meteor Wallet +- `"mynear"` - MyNEAR Wallet + # BitteWalletContextProvider -the default way of interacting with Bitte Wallet is using the BitteWalletContextProvider +The default way of interacting with Bitte Wallet is using the BitteWalletContextProvider. + +## Properties: + +**network**: `"mainnet" | "testnet"` - The NEAR network to connect to + +**enabledWallets**: `WalletName[]` - Array of wallet names to display (recommended) + +**additionalWallets**: `WalletModuleFactory[]` - Extra wallets setup + +**contractAddress**: `string` - Contract address for wallet connection +**onlyBitteWallet**: `boolean` - Legacy prop to show only Bitte Wallet -## properties: +**walletUrl**: `string` - Custom Bitte Wallet URL -**network** : ` mainnet | testnet` +# Usage Examples -**additionalWallets** : `WalletModuleFactory[] extra wallets setup` +## Basic Wallet Selection (Recommended) ```typescript import "@near-wallet-selector/modal-ui/styles.css"; -import { BitteWalletContextProvider } from '@bitte-ai/react' +import { BitteWalletContextProvider, useBitteWallet, WalletName } from '@bitte-ai/react'; + +// Select only the wallets you want to show +const enabledWallets: WalletName[] = ['intear', 'hot', 'okx', 'bitte']; + +function MyApp() { + return ( + + + + ); +} + +function WalletConnector() { + const { connect, disconnect, isConnected, accounts } = useBitteWallet(); + + return ( +
+ {!isConnected ? ( + + ) : ( +
+

Connected: {accounts[0]?.accountId}

+ +
+ )} +
+ ); +} +``` + +## All Available Wallets + +```typescript +const allWallets: WalletName[] = ['intear', 'hot', 'okx', 'bitte', 'meteor', 'mynear']; + + + + +``` + +## Only Specific Wallets + +```typescript +// Only show Bitte and Intear wallets +const selectedWallets: WalletName[] = ['bitte', 'intear']; + + + + +``` + +## Combining with Additional Wallets + +```typescript +import { setupCustomWallet } from 'custom-wallet'; + +const myWallets: WalletName[] = ['bitte', 'intear', 'meteor']; + + +``` + +## TypeScript Support + +The `WalletName` type ensures you only use supported wallet names: + +```typescript +import { WalletName } from '@bitte-ai/react'; + +// ✅ This works +const validWallets: WalletName[] = ['intear', 'bitte', 'meteor']; + +// ❌ TypeScript error - 'invalid' is not a valid wallet name +const invalidWallets: WalletName[] = ['intear', 'invalid']; +``` + +# Legacy API + +The previous API is still supported for backwards compatibility: + +## Using onlyBitteWallet + +```typescript + - + +``` + +## Using additionalWallets Only +```typescript +import { setupSomeCustomWallet } from 'some-custom-wallet'; + + + + ``` +## Important Notes + +- If you don't specify `enabledWallets`, the default wallets (`meteor`, `mynear`, `hot`) plus `bitte` will be used +- If you specify an empty `enabledWallets` array, no wallets will be shown +- The `enabledWallets` option takes precedence over `onlyBitteWallet` when both are provided +- Additional wallets from `additionalWallets` will always be included regardless of the `enabledWallets` setting + # Troubleshooting The wallet runs only on client-side. diff --git a/package.json b/package.json index ccee694..5ce716c 100644 --- a/package.json +++ b/package.json @@ -49,9 +49,11 @@ "@bitte-ai/wallet": "0.8.2", "@near-wallet-selector/core": "^9.5.1", "@near-wallet-selector/here-wallet": "^9.5.1", + "@near-wallet-selector/intear-wallet": "^9.5.1", "@near-wallet-selector/meteor-wallet": "^9.5.1", "@near-wallet-selector/modal-ui": "^9.5.1", "@near-wallet-selector/my-near-wallet": "^9.5.1", + "@near-wallet-selector/okx-wallet": "^9.5.1", "buffer": "^6.0.3", "react": "^19.1.1", "react-dom": "^19.1.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c28cfe8..c890217 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,6 +21,9 @@ importers: '@near-wallet-selector/here-wallet': specifier: ^9.5.1 version: 9.5.1(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/keystores@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5))(@near-js/transactions@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(bn.js@4.12.2)(borsh@2.0.0)(near-api-js@5.1.1) + '@near-wallet-selector/intear-wallet': + specifier: ^9.5.1 + version: 9.5.1(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/keystores@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5))(@near-js/transactions@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5)(@near-js/utils@1.1.0)) '@near-wallet-selector/meteor-wallet': specifier: ^9.5.1 version: 9.5.1(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/keystores@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5))(@near-js/tokens@2.3.0)(@near-js/transactions@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/utils@1.1.0) @@ -30,6 +33,9 @@ importers: '@near-wallet-selector/my-near-wallet': specifier: ^9.5.1 version: 9.5.1(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/keystores@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5))(@near-js/transactions@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5)(@near-js/utils@1.1.0)) + '@near-wallet-selector/okx-wallet': + specifier: ^9.5.1 + version: 9.5.1(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/keystores@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5))(@near-js/transactions@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5)(@near-js/utils@1.1.0)) buffer: specifier: ^6.0.3 version: 6.0.3 @@ -419,6 +425,9 @@ packages: '@near-wallet-selector/here-wallet@9.5.1': resolution: {integrity: sha512-DCb4Mrkdd3NF4wLDuRJkE7SBa+r3JXVIKFECpgGaaqmYZQLr0k7bxDJMPsgaFLRe5ag8uqqFR2StWl8Ok1YEtg==} + '@near-wallet-selector/intear-wallet@9.5.1': + resolution: {integrity: sha512-ODfH1gH75qTFQ3SJlEuPzToBZCNyC4vyFATb3J10Xo2fuv0tQEVprQFzHV99849XJYqk3Z7Yu3R6xma+FoMcZw==} + '@near-wallet-selector/meteor-wallet@9.5.1': resolution: {integrity: sha512-38LOWbyrrBLxPf8CrK09RXESCXv+nhS3yQb/z8fFHdOFJrSumyKIq+p+zOhXcM16tYOcGX+ydM0BSXUkj+keJA==} @@ -431,6 +440,9 @@ packages: '@near-wallet-selector/my-near-wallet@9.5.1': resolution: {integrity: sha512-AdhIX9zSYHJveTAN05dgARwVFtJWhkALQItYz551duSruusVyWjP2rLA10xYBipm/kK0BSyOId6rQxjAY2TsBQ==} + '@near-wallet-selector/okx-wallet@9.5.1': + resolution: {integrity: sha512-3kgn1lWIQyuYgqhGSFVCAfsV7hZh/HcQCA3ENMwyQupACFdRmDlCLb3mOeOYpDrmGcjSYUSvVA63KIoA6lnyoA==} + '@near-wallet-selector/wallet-utils@8.10.2': resolution: {integrity: sha512-B+mQBpkQ0PwDsxLw+tiju3u5cDFxKCQntTl9G1oTkKpDUiUmOZfzlKYM0s549WicNUqIVvCLQyicMhgIfLunQw==} peerDependencies: @@ -855,6 +867,9 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-mobile@4.0.0: + resolution: {integrity: sha512-mlcHZA84t1qLSuWkt2v0I2l61PYdyQDt4aG1mLIXF5FDMm4+haBCxCPYSr/uwqQNRk1MiTizn0ypEuRAOLRAew==} + is-my-ip-valid@1.0.1: resolution: {integrity: sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==} @@ -1775,6 +1790,17 @@ snapshots: - encoding - near-api-js + '@near-wallet-selector/intear-wallet@9.5.1(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/keystores@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5))(@near-js/transactions@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5)(@near-js/utils@1.1.0))': + dependencies: + '@near-wallet-selector/core': 9.5.1(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/keystores@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5))(@near-js/transactions@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(near-api-js@5.0.0) + '@near-wallet-selector/wallet-utils': 9.5.1(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/keystores@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5))(@near-js/transactions@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(near-api-js@5.0.0) + near-api-js: 5.0.0 + transitivePeerDependencies: + - '@near-js/crypto' + - '@near-js/keystores' + - '@near-js/transactions' + - encoding + '@near-wallet-selector/meteor-wallet@9.5.1(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/keystores@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5))(@near-js/tokens@2.3.0)(@near-js/transactions@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/utils@1.1.0)': dependencies: '@meteorwallet/sdk': 1.0.24(@near-js/tokens@2.3.0)(@near-js/utils@1.1.0)(near-api-js@5.0.0) @@ -1813,6 +1839,17 @@ snapshots: - '@near-js/transactions' - encoding + '@near-wallet-selector/okx-wallet@9.5.1(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/keystores@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5))(@near-js/transactions@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5)(@near-js/utils@1.1.0))': + dependencies: + '@near-wallet-selector/core': 9.5.1(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/keystores@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5))(@near-js/transactions@2.2.5(@near-js/crypto@2.2.5(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(@near-js/types@2.2.5)(@near-js/utils@1.1.0))(near-api-js@5.0.0) + is-mobile: 4.0.0 + near-api-js: 5.0.0 + transitivePeerDependencies: + - '@near-js/crypto' + - '@near-js/keystores' + - '@near-js/transactions' + - encoding + '@near-wallet-selector/wallet-utils@8.10.2(near-api-js@5.1.1)': dependencies: '@near-wallet-selector/core': 8.10.2(near-api-js@5.1.1) @@ -2182,6 +2219,8 @@ snapshots: is-fullwidth-code-point@3.0.0: {} + is-mobile@4.0.0: {} + is-my-ip-valid@1.0.1: {} is-my-json-valid@2.20.6: diff --git a/src/BitteWalletContext.tsx b/src/BitteWalletContext.tsx index f9d340e..26c1e8e 100644 --- a/src/BitteWalletContext.tsx +++ b/src/BitteWalletContext.tsx @@ -8,7 +8,10 @@ import React, { useState, } from "react"; import { BitteWalletAuth } from "./wallet/bitte-wallet"; -import type { WalletSelectorComponents } from "./wallet/bitte-wallet"; +import type { + WalletSelectorComponents, + WalletName, +} from "./wallet/bitte-wallet"; import type { WalletSelector, @@ -41,6 +44,7 @@ interface ContextProviderType { additionalWallets?: Array; onlyBitteWallet?: boolean; walletUrl?: string; + enabledWallets?: WalletName[]; } export const BitteWalletContext = createContext( @@ -54,6 +58,7 @@ export const BitteWalletContextProvider: React.FC = ({ additionalWallets, onlyBitteWallet, walletUrl, + enabledWallets, }): JSX.Element => { const [errorMessage, setErrorMessage] = useState(null); const [components, setComponents] = useState( @@ -85,7 +90,11 @@ export const BitteWalletContextProvider: React.FC = ({ return await setupBitteWalletSelector( isOnlyBitteWallet, selectedNetwork, - { additionalWallets: additionalWallets }, + { + additionalWallets: additionalWallets, + enabledWallets: enabledWallets, + }, + selectedContract, walletUrl, ); }; diff --git a/src/index.ts b/src/index.ts index 48dbd15..99a8153 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,6 @@ export * from "./BitteWalletContext"; export * from "./hooks/useNearPrice"; +export type { WalletName } from "./wallet/bitte-wallet"; export type { Wallet, WalletModuleFactory, diff --git a/src/wallet/bitte-wallet.ts b/src/wallet/bitte-wallet.ts index c018b97..192fcb1 100644 --- a/src/wallet/bitte-wallet.ts +++ b/src/wallet/bitte-wallet.ts @@ -24,6 +24,8 @@ import { setupBitteWallet } from "@bitte-ai/wallet"; import { setupMeteorWallet } from "@near-wallet-selector/meteor-wallet"; import { setupHereWallet } from "@near-wallet-selector/here-wallet"; import { setupMyNearWallet } from "@near-wallet-selector/my-near-wallet"; +import { setupIntearWallet } from "@near-wallet-selector/intear-wallet"; +import { setupOKXWallet } from "@near-wallet-selector/okx-wallet"; const SUPPORT = "- further help available on our telegram channel: https://t.me/mintdev"; @@ -33,12 +35,44 @@ export const ERROR_MESSAGES = { WALLET_CONNECTION_NOT_FOUND: `Wallet connection not received after ${WALLET_CONNECTION_TIMEOUT}ms - ${SUPPORT}`, }; +// Supported wallet configurations +export type WalletName = + | "intear" + | "hot" + | "okx" + | "bitte" + | "meteor" + | "mynear"; + +export const WALLET_MODULES: Record WalletModuleFactory> = { + intear: () => setupIntearWallet(), + hot: () => setupHereWallet(), // "hot" maps to HereWallet + okx: () => setupOKXWallet(), + bitte: () => setupBitteWallet() as WalletModuleFactory, + meteor: () => setupMeteorWallet(), + mynear: () => setupMyNearWallet(), +}; + +// Default supported wallets (backwards compatibility) export const SUPPORTED_NEAR_WALLETS: Array = [ setupMeteorWallet(), setupMyNearWallet(), setupHereWallet(), ]; +// Helper function to get wallet modules from names +export const getWalletModulesFromNames = ( + walletNames: WalletName[], +): Array => { + return walletNames.map((name) => { + const moduleFactory = WALLET_MODULES[name]; + if (!moduleFactory) { + throw new Error(`Unsupported wallet: ${name}`); + } + return moduleFactory(); + }); +}; + export type WalletSelectorComponents = { selector: WalletSelector; modal: WalletSelectorModal; @@ -55,40 +89,51 @@ const walletUrls = { export const BitteWalletAuth = { walletSelectorComponents: { - selector: null, - modal: null, + selector: null as WalletSelector | null, + modal: null as WalletSelectorModal | null, }, setupBitteWalletSelector: async ( onlyBitteWallet = false, network?: "testnet" | "mainnet", - options?: { additionalWallets?: Array }, + options?: { + additionalWallets?: Array; + enabledWallets?: WalletName[]; + }, contractAddress?: string, walletUrl?: string, ): Promise => { - if (onlyBitteWallet === false) { - BitteWalletAuth.walletSelectorComponents.selector = - await setupWalletSelector({ - network: network || "mainnet", - modules: [ - setupBitteWallet() as WalletModuleFactory, - ...(options?.additionalWallets || []), - ...SUPPORTED_NEAR_WALLETS, - ], - }); + // Determine which wallets to include + const walletModules: Array = []; + + if (options?.enabledWallets && options.enabledWallets.length > 0) { + // Use enabledWallets if specified + walletModules.push(...getWalletModulesFromNames(options.enabledWallets)); + } else if (onlyBitteWallet === false) { + // Legacy behavior: include Bitte + default wallets + walletModules.push( + setupBitteWallet() as WalletModuleFactory, + ...SUPPORTED_NEAR_WALLETS, + ); } else { - BitteWalletAuth.walletSelectorComponents.selector = - await setupWalletSelector({ - network: network || "mainnet", - modules: [ - setupBitteWallet({ - walletUrl: - walletUrl || walletUrls[network as "mainnet" | "testnet"], - }) as WalletModuleFactory, - ...(options?.additionalWallets || []), - ], - }); + // Only Bitte wallet + walletModules.push( + setupBitteWallet({ + walletUrl: walletUrl || walletUrls[network as "mainnet" | "testnet"], + }) as WalletModuleFactory, + ); } + // Add any additional wallets + if (options?.additionalWallets) { + walletModules.push(...options.additionalWallets); + } + + BitteWalletAuth.walletSelectorComponents.selector = + await setupWalletSelector({ + network: network || "mainnet", + modules: walletModules, + }); + BitteWalletAuth.walletSelectorComponents.modal = setupModal( BitteWalletAuth.walletSelectorComponents.selector, { @@ -96,19 +141,35 @@ export const BitteWalletAuth = { }, ); - return BitteWalletAuth.walletSelectorComponents; + return BitteWalletAuth.walletSelectorComponents as WalletSelectorComponents; }, setupWalletSelectorComponents: async ( - network?, - contractAddress?, - options?: { additionalWallets?: Array }, + network?: "testnet" | "mainnet", + contractAddress?: string, + options?: { + additionalWallets?: Array; + enabledWallets?: WalletName[]; + }, ): Promise => { + // Determine which wallets to include + const walletModules: Array = []; + + if (options?.enabledWallets && options.enabledWallets.length > 0) { + // Use enabledWallets if specified + walletModules.push(...getWalletModulesFromNames(options.enabledWallets)); + } else { + // Default behavior: use SUPPORTED_NEAR_WALLETS + walletModules.push(...SUPPORTED_NEAR_WALLETS); + } + + // Add any additional wallets + if (options?.additionalWallets) { + walletModules.push(...options.additionalWallets); + } + const selector = await setupWalletSelector({ - network: network, - modules: [ - ...SUPPORTED_NEAR_WALLETS, - ...(options?.additionalWallets || []), - ], + network: network || "mainnet", + modules: walletModules, }); const modal = setupModal(selector, { @@ -119,7 +180,7 @@ export const BitteWalletAuth = { selector, modal, }; - return BitteWalletAuth.walletSelectorComponents; + return BitteWalletAuth.walletSelectorComponents as WalletSelectorComponents; }, SetupNotCalledError: class extends Error { constructor(message?: string) { @@ -129,6 +190,11 @@ export const BitteWalletAuth = { }, ConnectionTimeoutError: class extends Error { message: string; + constructor(message?: string) { + super(message); + this.message = message || ""; + this.name = "ConnectionTimeoutError"; + } }, validateWalletComponentsAreSetup: (): void => { if (!BitteWalletAuth.walletSelectorComponents.selector) { @@ -139,17 +205,19 @@ export const BitteWalletAuth = { }, registerWalletAccountsSubscriber: ( callback: (accounts: AccountState[]) => void, - ): Subscription => { + ): any => { BitteWalletAuth.validateWalletComponentsAreSetup(); - return BitteWalletAuth.walletSelectorComponents.selector.store.observable + return ( + BitteWalletAuth.walletSelectorComponents.selector!.store.observable as any + ) .pipe( - map((state: any) => state.accounts), - distinctUntilChanged(), + (map as any)((state: any) => state.accounts), + (distinctUntilChanged as any)(), ) .subscribe(callback); }, - timerReference: null, + timerReference: null as any, pollForWalletConnection: async (): Promise => { BitteWalletAuth.validateWalletComponentsAreSetup(); // clear any existing timer @@ -157,11 +225,13 @@ export const BitteWalletAuth = { const tryToResolveAccountsFromState = ( resolve: (value: AccountState[]) => void, - reject: (err: ConnectionTimeoutError) => void, + reject: ( + err: InstanceType, + ) => void, elapsed = 0, ): void => { const { accounts } = - BitteWalletAuth.walletSelectorComponents.selector.store.getState() || + BitteWalletAuth.walletSelectorComponents.selector!.store.getState() || {}; // accounts present in state @@ -172,7 +242,7 @@ export const BitteWalletAuth = { // timed out if (elapsed > WALLET_CONNECTION_TIMEOUT) { reject( - new ConnectionTimeoutError( + new BitteWalletAuth.ConnectionTimeoutError( ERROR_MESSAGES.WALLET_CONNECTION_NOT_FOUND, ), ); @@ -198,18 +268,18 @@ export const BitteWalletAuth = { getWallet: async (): Promise => { BitteWalletAuth.validateWalletComponentsAreSetup(); - return await BitteWalletAuth.walletSelectorComponents.selector.wallet(); + return await BitteWalletAuth.walletSelectorComponents.selector!.wallet(); }, connectWalletSelector: (): void => { BitteWalletAuth.validateWalletComponentsAreSetup(); - BitteWalletAuth.walletSelectorComponents.modal.show(); + BitteWalletAuth.walletSelectorComponents.modal!.show(); }, disconnectFromWalletSelector: async (): Promise => { BitteWalletAuth.validateWalletComponentsAreSetup(); const wallet = - await BitteWalletAuth.walletSelectorComponents.selector.wallet(); + await BitteWalletAuth.walletSelectorComponents.selector!.wallet(); wallet.signOut(); }, getVerifiedOwner: async ( @@ -220,7 +290,7 @@ export const BitteWalletAuth = { const { message, callbackUrl, meta } = params; const wallet = - await BitteWalletAuth.walletSelectorComponents.selector.wallet(); + await BitteWalletAuth.walletSelectorComponents.selector!.wallet(); const owner = (await wallet.verifyOwner({ message: message, @@ -228,11 +298,11 @@ export const BitteWalletAuth = { meta: meta, })) as VerifiedOwner; - return owner; + return owner!; }, signMessage: async (params: VerifyOwnerParams): Promise => { const owner = await BitteWalletAuth.getVerifiedOwner(params); - return owner; + return owner!; }, };