diff --git a/src/actions/EmailActions.js b/src/actions/EmailActions.js index cd55d6f..2635b85 100644 --- a/src/actions/EmailActions.js +++ b/src/actions/EmailActions.js @@ -336,7 +336,7 @@ const updateEmailKeyFun = { const readCache = await readIndexDB(params.mai_sn_list, 'listrow', 'mailbox') const updateField = Object.keys(params.set).reduce((a, c) => ({ ...a, [updateEmailKeyMap[c]]: params.set[c] }), {}) writeIndexDB( - params.mai_sn_list.map((ele) => ({ data: { ...(readCache.get(ele).data || {}), ...updateField }, key: ele })), + params.mai_sn_list.map((ele) => ({ data: { ...(readCache.get(ele)?.data || {}), ...updateField }, key: ele })), 'listrow', 'mailbox', ) @@ -350,6 +350,26 @@ const updateEmailKeyFun = { // console.log(`[EmailDetail] Emitted internal`, EMAIL_CHANNEL_NAME, notificationPayload); internalEventEmitter.emit(EMAIL_CHANNEL_NAME, notificationPayload); }, + processed: async (params) => { + const readRow0 = await readIndexDB(params.mai_sn_list[0], 'listrow', 'mailbox') + console.log('first000', readRow0); + const listKey = readRow0?.data?.listKey || ''; + if (listKey) { + console.log('first', listKey); + const readCache = await readIndexDB(listKey, 'maillist', 'mailbox') + console.log('222', readCache); + const updatedMailList = readCache.data.filter(mai_sn => !params.mai_sn_list.includes(mai_sn)); + writeIndexDB([{ key: listKey, data: updatedMailList }], 'maillist', 'mailbox') + // 通知邮件列表数据更新 + const notificationPayload = { type: 'listrow', listKey, affectKeys: params.mai_sn_list } + // - 多个tab + const channel = getEmailChangesChannel() + channel.postMessage(notificationPayload) + // - 当前tab + // console.log(`[EmailDetail] Emitted internal`, EMAIL_CHANNEL_NAME, notificationPayload); + internalEventEmitter.emit(EMAIL_CHANNEL_NAME, notificationPayload); + } + } } /** * 更新邮件属性 diff --git a/src/utils/indexedDB.js b/src/utils/indexedDB.js index 38e2a5c..0d3c9ad 100644 --- a/src/utils/indexedDB.js +++ b/src/utils/indexedDB.js @@ -274,24 +274,77 @@ export const readIndexDB = (keys=null, table, database) => { } }) }; -export const deleteIndexDBbyKey = (key, table, database) => { - var open = indexedDB.open(database, INDEXED_DB_VERSION) - open.onupgradeneeded = function () { - // var db = open.result - // // 数据库是否存在 - // if (!db.objectStoreNames.contains(table)) { - // var store = db.createObjectStore(table, { keyPath: 'id', autoIncrement: true }) - // } - } - open.onsuccess = function () { - var db = open.result - var tx = db.transaction(table, 'readwrite') - var store = tx.objectStore(table) - store.delete(key) - tx.oncomplete = function () { - db.close() +export const deleteIndexDBbyKey = (keys=null, table, database) => { + return new Promise((resolve, reject) => { + var open = indexedDB.open(database, INDEXED_DB_VERSION) + open.onupgradeneeded = function () { + // var db = open.result + // // 数据库是否存在 + // if (!db.objectStoreNames.contains(table)) { + // var store = db.createObjectStore(table, { keyPath: 'id', autoIncrement: true }) + // } } - } + open.onsuccess = function (e) { + let db = e.target.result + // 数据库是否存在 + if (!db.objectStoreNames.contains(table)) { + resolve('Database does not exist.') + return + } + var tx = db.transaction(table, 'readwrite') + var store = tx.objectStore(table) + if (Array.isArray(keys) && keys.length > 0) { + const promises = keys.map((key) => { + return new Promise((innerResolve) => { + const delRequest = store.delete(key) + delRequest.onsuccess = (event) => { + const result = event.target.result + if (result) { + innerResolve() + } else { + innerResolve(void 0) // Resolve with undefined for non-existent keys + } + } + delRequest.onerror = (event) => { + innerResolve(undefined) + } + }) + }) + Promise.allSettled(promises) + .then((results) => { + resolve(results) + }) + .catch((error) => { + reject(error) + }) + } else if (!isEmpty(keys)) { // Handle single key + const delRequest = store.delete(keys); + delRequest.onsuccess = (event) => { + const result = event.target.result; + if (result) { + resolve(result); + } else { + resolve(); + } + }; + delRequest.onerror = (event) => { + reject(event.target.error); + }; + } else { + // 删除所有 + let clearRequest = store.clear() + clearRequest.onsuccess = function (e) { + resolve(e.target.result) + } + clearRequest.onerror = function (e) { + reject(e.target.error) + } + } + tx.oncomplete = function () { + db.close() + } + } + }) }; function cleanOldData(database, storeNames=[], dateKey = 'timestamp') {