@ledgerhq/live-common
Version:
Common ground for the Ledger Live apps
79 lines • 3.43 kB
JavaScript
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