diff --git a/avaxSearchDB.js b/avaxSearchDB.js new file mode 100644 index 0000000..41d1d71 --- /dev/null +++ b/avaxSearchDB.js @@ -0,0 +1,105 @@ +class SearchedAddressDB { + constructor() { + this.dbName = "AvaxWalletDB"; + this.version = 1; + this.storeName = "searchedAddresses"; + this.db = null; + } + + async init() { + return new Promise((resolve, reject) => { + const request = indexedDB.open(this.dbName, this.version); + request.onerror = () => reject(request.error); + request.onsuccess = () => { + this.db = request.result; + resolve(); + }; + request.onupgradeneeded = (event) => { + const db = event.target.result; + if (!db.objectStoreNames.contains(this.storeName)) { + const store = db.createObjectStore(this.storeName, { + keyPath: "address", + }); + store.createIndex("timestamp", "timestamp", { unique: false }); + } + }; + }); + } + + async saveSearchedAddress( + avaxAddress, + balance, + timestamp = Date.now(), + sourceInfo = null + ) { + if (!this.db) await this.init(); + return new Promise((resolve, reject) => { + const transaction = this.db.transaction([this.storeName], "readwrite"); + const store = transaction.objectStore(this.storeName); + const getRequest = store.get(avaxAddress); + getRequest.onsuccess = () => { + const existingRecord = getRequest.result; + let finalSourceInfo = sourceInfo; + if (existingRecord && existingRecord.sourceInfo && !sourceInfo) { + finalSourceInfo = existingRecord.sourceInfo; + } else if ( + existingRecord && + existingRecord.sourceInfo && + sourceInfo === null + ) { + finalSourceInfo = existingRecord.sourceInfo; + } + const data = { + address: avaxAddress, + balance, + timestamp, + formattedBalance: `${balance} AVAX`, + sourceInfo: finalSourceInfo, + }; + const putRequest = store.put(data); + putRequest.onsuccess = () => resolve(); + putRequest.onerror = () => reject(putRequest.error); + }; + getRequest.onerror = () => reject(getRequest.error); + }); + } + + async getSearchedAddresses() { + if (!this.db) await this.init(); + return new Promise((resolve, reject) => { + const transaction = this.db.transaction([this.storeName], "readonly"); + const store = transaction.objectStore(this.storeName); + const index = store.index("timestamp"); + const request = index.getAll(); + request.onsuccess = () => { + const results = request.result.sort( + (a, b) => b.timestamp - a.timestamp + ); + resolve(results); + }; + request.onerror = () => reject(request.error); + }); + } + + async deleteSearchedAddress(avaxAddress) { + if (!this.db) await this.init(); + return new Promise((resolve, reject) => { + const transaction = this.db.transaction([this.storeName], "readwrite"); + const store = transaction.objectStore(this.storeName); + const request = store.delete(avaxAddress); + request.onsuccess = () => resolve(); + request.onerror = () => reject(request.error); + }); + } + + async clearAllSearchedAddresses() { + if (!this.db) await this.init(); + return new Promise((resolve, reject) => { + const transaction = this.db.transaction([this.storeName], "readwrite"); + const store = transaction.objectStore(this.storeName); + const request = store.clear(); + request.onsuccess = () => resolve(); + request.onerror = () => reject(request.error); + }); + } +} diff --git a/index.html b/index.html index 2ac1a39..a5e53f5 100644 --- a/index.html +++ b/index.html @@ -14,6 +14,7 @@ +