diff --git a/packages/lasereyes-core/src/client/index.ts b/packages/lasereyes-core/src/client/index.ts index dbf70c3..40d5e53 100644 --- a/packages/lasereyes-core/src/client/index.ts +++ b/packages/lasereyes-core/src/client/index.ts @@ -1,4 +1,4 @@ -import { MapStore, WritableAtom, listenKeys } from 'nanostores' +import { MapStore, WritableAtom, keepMount, listenKeys } from 'nanostores' import { Config, ContentType, NetworkType, ProviderType } from '../types' import { @@ -40,8 +40,6 @@ export class LaserEyesClient { dispose() { this.disposed = true - this.$store.off() - this.$network.off() Object.values(this.$providerMap).forEach((provider) => provider?.dispose()) } @@ -54,6 +52,7 @@ export class LaserEyesClient { ) { this.$store = stores.$store this.$network = stores.$network + keepMount(this.$store) this.$providerMap = { [LEATHER]: new LeatherProvider(stores, this, config), [MAGIC_EDEN]: new MagicEdenProvider(stores, this, config), @@ -111,7 +110,6 @@ export class LaserEyesClient { LOCAL_STORAGE_DEFAULT_WALLET ) as ProviderType | undefined if (defaultWallet) { - this.$store.setKey('provider', defaultWallet) this.connect(defaultWallet) } } @@ -120,6 +118,7 @@ export class LaserEyesClient { async connect(defaultWallet: ProviderType) { if (this.disposed) { + console.warn('Client disposed, cannot connect') return } diff --git a/packages/lasereyes-core/src/client/providers/magic-eden.ts b/packages/lasereyes-core/src/client/providers/magic-eden.ts index 6cf4deb..d0f8065 100644 --- a/packages/lasereyes-core/src/client/providers/magic-eden.ts +++ b/packages/lasereyes-core/src/client/providers/magic-eden.ts @@ -59,8 +59,16 @@ export default class MagicEdenProvider extends WalletProvider { restorePersistedValues() { const vals = this.$valueStore.get() for (const key of keysToPersist) { + if (key === 'balance') { + this.$store.setKey(key, BigInt(vals[key])) + continue + } this.$store.setKey(key, vals[key]) } + this.$store.setKey( + 'accounts', + [vals.address, vals.paymentAddress].filter(Boolean) + ) } watchStateChange( @@ -68,14 +76,24 @@ export default class MagicEdenProvider extends WalletProvider { _: LaserEyesStoreType | undefined, changedKey: keyof LaserEyesStoreType | undefined ) { - if (changedKey && newState.provider === MAGIC_EDEN) { - if (changedKey === 'balance') { - this.$valueStore.setKey('balance', newState.balance?.toString() ?? '') - } else if ((keysToPersist as readonly string[]).includes(changedKey)) { - this.$valueStore.setKey( - changedKey as PersistedKey, - newState[changedKey]?.toString() ?? '' - ) + if (newState.provider === MAGIC_EDEN) { + if (changedKey) { + if (changedKey === 'balance') { + this.$valueStore.setKey('balance', newState.balance?.toString() ?? '') + } else if ((keysToPersist as readonly string[]).includes(changedKey)) { + this.$valueStore.setKey( + changedKey as PersistedKey, + newState[changedKey]?.toString() ?? '' + ) + } + } else { + this.$valueStore.set({ + address: newState.address, + paymentAddress: newState.paymentAddress, + paymentPublicKey: newState.paymentPublicKey, + publicKey: newState.publicKey, + balance: newState.balance?.toString() ?? '', + }) } } } @@ -128,10 +146,10 @@ export default class MagicEdenProvider extends WalletProvider { if (address.startsWith('tb1') && isMainnetNetwork(this.network)) { this.disconnect() } else { - this.restorePersistedValues() getBTCBalance(paymentAddress, this.network).then((totalBalance) => { this.$store.setKey('balance', totalBalance) }) + this.restorePersistedValues() return } } @@ -156,9 +174,12 @@ export default class MagicEdenProvider extends WalletProvider { if (!foundAddress || !foundPaymentAddress) throw new Error('No address found') if (foundAddress && foundPaymentAddress) { - this.$store.setKey('provider', MAGIC_EDEN) this.$store.setKey('address', foundAddress.address) this.$store.setKey('paymentAddress', foundPaymentAddress.address) + this.$store.setKey('accounts', [ + foundAddress.address, + foundPaymentAddress.address, + ]) } this.$store.setKey( 'publicKey', @@ -177,7 +198,6 @@ export default class MagicEdenProvider extends WalletProvider { }, } await getAddress(getAddressOptions as GetAddressOptions) - this.$store.setKey('connected', true) } catch (e) { throw e } diff --git a/packages/lasereyes-core/src/client/providers/xverse.ts b/packages/lasereyes-core/src/client/providers/xverse.ts index 3beb859..3699e30 100644 --- a/packages/lasereyes-core/src/client/providers/xverse.ts +++ b/packages/lasereyes-core/src/client/providers/xverse.ts @@ -57,8 +57,15 @@ export default class XVerseProvider extends WalletProvider { restorePersistedValues() { const vals = this.$valueStore.get() for (const key of keysToPersist) { + if (key === 'balance') { + this.$store.setKey(key, BigInt(vals[key])) + } this.$store.setKey(key, vals[key]) } + this.$store.setKey( + 'accounts', + [vals.address, vals.paymentAddress].filter(Boolean) + ) } watchStateChange( @@ -151,6 +158,10 @@ export default class XVerseProvider extends WalletProvider { if (foundAddress && foundPaymentAddress) { this.$store.setKey('address', foundAddress.address) this.$store.setKey('paymentAddress', foundPaymentAddress.address) + this.$store.setKey('accounts', [ + foundAddress.address, + foundPaymentAddress.address, + ]) } this.$store.setKey( 'publicKey', diff --git a/packages/lasereyes-react/lib/providers/hooks.ts b/packages/lasereyes-react/lib/providers/hooks.ts index 1abe225..b7b7cbc 100644 --- a/packages/lasereyes-react/lib/providers/hooks.ts +++ b/packages/lasereyes-react/lib/providers/hooks.ts @@ -1,7 +1,7 @@ import { useContext, useMemo } from 'react' import { LaserEyesStoreContext } from './context' import { LaserEyesContextType } from './types' -import { computed, keepMount, onNotify } from 'nanostores' +import { batched, keepMount, onNotify } from 'nanostores' import { useStore } from '@nanostores/react' import { compareValues } from '../utils/comparison' @@ -13,7 +13,7 @@ export function useLaserEyes( const { $network, $store, methods } = useContext(LaserEyesStoreContext) const $computedStore = useMemo(() => { - const computedStore = computed([$store, $network], (store, network) => { + const computedStore = batched([$store, $network], (store, network) => { const value = { paymentAddress: store.paymentAddress, address: store.address,