UNPKG

@ledgerhq/live-common

Version:
79 lines 3.43 kB
import { RecentAddressesArraySchema } from "./entities/recentAddresses"; export const RECENT_ADDRESSES_COUNT_LIMIT = 12; let recentAddressesStore = null; export function getRecentAddressesStore() { if (recentAddressesStore === null) { throw new Error("Recent addresses store instance is null, please call function setupRecentAddressesStore in application initialization"); } return recentAddressesStore; } export function setupRecentAddressesStore(addressesByCurrency, onAddAddressComplete) { recentAddressesStore = new RecentAddressesStoreImpl(addressesByCurrency, onAddAddressComplete); } class RecentAddressesStoreImpl { addressesByCurrency = {}; onAddAddressComplete; constructor(addressesByCurrency, onAddAddressComplete) { this.addressesByCurrency = this.sanitizeCache(addressesByCurrency); this.onAddAddressComplete = onAddAddressComplete; } sanitizeCache(cache) { const sanitized = {}; for (const currency in cache) { const entries = cache[currency]; const result = RecentAddressesArraySchema.safeParse(entries); sanitized[currency] = result.success ? result.data : []; } return sanitized; } addAddress(currency, address, ensName) { this.addAddressToCache(currency, address, Date.now(), true, ensName); } removeAddress(currency, address) { if (!this.addressesByCurrency[currency]) return; const addresses = this.addressesByCurrency[currency]; const index = addresses.findIndex(entry => entry.address === address); if (index !== -1) { addresses.splice(index, 1); this.addressesByCurrency[currency] = [...addresses]; this.onAddAddressComplete(this.addressesByCurrency); } } syncAddresses(cache) { const previousAddresses = { ...this.addressesByCurrency }; this.addressesByCurrency = this.sanitizeCache(cache); for (const currency in previousAddresses) { const entries = previousAddresses[currency]; for (const entry of entries) { this.addAddressToCache(currency, entry.address, entry.lastUsed, false, entry.ensName); } } this.onAddAddressComplete(this.addressesByCurrency); } getAddresses(currency) { const addresses = this.addressesByCurrency[currency]; if (!addresses) return []; return addresses.filter((entry) => !!entry && typeof entry.address === "string" && entry.address.length > 0); } addAddressToCache(currency, address, timestamp, shouldTriggerCallback, ensName) { if (!this.addressesByCurrency[currency]) { this.addressesByCurrency[currency] = []; } const addresses = this.addressesByCurrency[currency]; const addressIndex = addresses.findIndex(entry => entry.address === address); if (addressIndex !== -1) { addresses.splice(addressIndex, 1); } else if (addresses.length >= RECENT_ADDRESSES_COUNT_LIMIT) { addresses.pop(); } addresses.unshift({ address, lastUsed: timestamp, ensName }); this.addressesByCurrency[currency] = [...addresses]; if (shouldTriggerCallback) { this.onAddAddressComplete(this.addressesByCurrency); } } } //# sourceMappingURL=recentAddresses.js.map