From da22cafbd5ea1ea26bea9e2fb96f6769ebe7d7f7 Mon Sep 17 00:00:00 2001 From: Pranshul Date: Fri, 13 Dec 2024 21:04:39 +0530 Subject: [PATCH] added indexed data base and BroadcastChannel --- .../main/assets/database/dataBaseIndexed.js | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 app/src/main/assets/database/dataBaseIndexed.js diff --git a/app/src/main/assets/database/dataBaseIndexed.js b/app/src/main/assets/database/dataBaseIndexed.js new file mode 100644 index 000000000..5403ec9f0 --- /dev/null +++ b/app/src/main/assets/database/dataBaseIndexed.js @@ -0,0 +1,117 @@ +// Finally no more storage issue + +class StorageDB { + constructor(dbName = 'WeatherDB', storeName = 'WeatherMasterDataStore') { + this.dbName = dbName; + this.storeName = storeName; + } + + async init() { + return new Promise((resolve, reject) => { + const request = indexedDB.open(this.dbName, 1); + + request.onupgradeneeded = (event) => { + const db = event.target.result; + if (!db.objectStoreNames.contains(this.storeName)) { + db.createObjectStore(this.storeName); + } + }; + + request.onsuccess = (event) => resolve(event.target.result); + request.onerror = (event) => reject(event.target.error); + }); + } + + async setItem(key, value) { + const db = await this.init(); + return new Promise((resolve, reject) => { + const transaction = db.transaction([this.storeName], 'readwrite'); + const store = transaction.objectStore(this.storeName); + const request = store.put(value, key); + request.onsuccess = () => { + this.triggerStorageChangeEvent(key); + this.broadcastChange(key); // Custom event triggered with key + resolve(true); + }; + request.onerror = (event) => reject(event.target.error); + }); + } + + async getItem(key) { + const db = await this.init(); + return new Promise((resolve, reject) => { + const transaction = db.transaction([this.storeName], 'readonly'); + const store = transaction.objectStore(this.storeName); + const request = store.get(key); + request.onsuccess = () => resolve(request.result); + request.onerror = (event) => reject(event.target.error); + }); + } + + async removeItem(key) { + const db = await this.init(); + return new Promise((resolve, reject) => { + const transaction = db.transaction([this.storeName], 'readwrite'); + const store = transaction.objectStore(this.storeName); + const request = store.delete(key); + request.onsuccess = () => { + this.triggerStorageChangeEvent(key); + this.broadcastChange(key); // Custom event triggered with key + resolve(true); + }; + request.onerror = (event) => reject(event.target.error); + }); + } + + async clear() { + const db = await this.init(); + return new Promise((resolve, reject) => { + const transaction = db.transaction([this.storeName], 'readwrite'); + const store = transaction.objectStore(this.storeName); + const request = store.clear(); + request.onsuccess = () => { + this.triggerStorageChangeEvent(null); + this.broadcastChange(null); + resolve(true); + }; + request.onerror = (event) => reject(event.target.error); + }); + } + + triggerStorageChangeEvent(key) { + const eventDetail = key ? { key } : { message: 'store cleared' }; + const event = new CustomEvent('indexedDBChange', { detail: eventDetail }); + window.dispatchEvent(event); // Dispatch event globally + } + broadcastChange(key) { + const channel = new BroadcastChannel('indexedDB_channel'); + channel.postMessage({ key }); + } +} + + + +const storage = new StorageDB(); + +const customStorage = { + async setItem(key, value) { + return await storage.setItem(key, value); + }, + async getItem(key) { + return await storage.getItem(key); + }, + async removeItem(key) { + return await storage.removeItem(key); + }, + async clear() { + return await storage.clear(); + }, +}; + +const channel = new BroadcastChannel('indexedDB_channel'); +channel.addEventListener('message', (event) => { + if (event.data && event.data.key) { + const customEvent = new CustomEvent('indexedDBChange', { detail: event.data }); + window.dispatchEvent(customEvent); + } +}); \ No newline at end of file