diff --git a/src/equicordplugins/messageLoggerEnhanced/components/ClearLogsButton.tsx b/src/equicordplugins/messageLoggerEnhanced/components/ClearLogsButton.tsx new file mode 100644 index 000000000..d130d0d6f --- /dev/null +++ b/src/equicordplugins/messageLoggerEnhanced/components/ClearLogsButton.tsx @@ -0,0 +1,57 @@ +/* + * Vencord, a Discord client mod + * Copyright (c) 2024 Vendicated and contributors + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +import { Button } from "@components/Button"; +import { Alerts, Toasts, useState } from "@webpack/common"; + +import { clearMessagesIDB } from "../db"; +import { Flogger } from "../index"; + +interface ClearLogsButtonProps { + label?: string; + onCleared?: () => void; +} + +export function ClearLogsButton({ label = "Clear Logs", onCleared }: ClearLogsButtonProps) { + const [loading, setLoading] = useState(false); + return ( + + ); +} diff --git a/src/equicordplugins/messageLoggerEnhanced/db.ts b/src/equicordplugins/messageLoggerEnhanced/db.ts index a9824e3dc..12aeac511 100644 --- a/src/equicordplugins/messageLoggerEnhanced/db.ts +++ b/src/equicordplugins/messageLoggerEnhanced/db.ts @@ -258,7 +258,19 @@ export async function deleteMessagesBulkIDB(message_ids: string[]) { export async function clearMessagesIDB(showToast = true) { cachedMessages.clear(); - await db.clear("messages"); + + const deleted = await new Promise(resolve => { + db.close(); + const req = indexedDB.deleteDatabase(DB_NAME); + req.onsuccess = () => resolve(true); + req.onerror = () => resolve(false); + }); + + await initIDB(); + if (!deleted) await clearMessagesChunkedIDB(); + + cachedMessages.clear(); + if (!showToast) return; Toasts.show({ @@ -267,3 +279,20 @@ export async function clearMessagesIDB(showToast = true) { id: Toasts.genId() }); } + +// faster than db.clear on large dbs +async function clearMessagesChunkedIDB() { + const CLEAR_BATCH_SIZE = 5000; + while (true) { + const tx = db.transaction("messages", "readwrite", { durability: "relaxed" }); + const { store } = tx; + const keys = (await store.getAllKeys(undefined, CLEAR_BATCH_SIZE)) as string[]; + if (keys.length === 0) { + await tx.done; + break; + } + + const range = IDBKeyRange.bound(keys[0], keys[keys.length - 1]); + await Promise.all([store.delete(range), tx.done]); + } +} diff --git a/src/equicordplugins/messageLoggerEnhanced/settings.tsx b/src/equicordplugins/messageLoggerEnhanced/settings.tsx index 6ff1309f0..8ca461649 100644 --- a/src/equicordplugins/messageLoggerEnhanced/settings.tsx +++ b/src/equicordplugins/messageLoggerEnhanced/settings.tsx @@ -8,9 +8,10 @@ import { definePluginSettings, Settings } from "@api/Settings"; import { Button } from "@components/Button"; import ErrorBoundary from "@components/ErrorBoundary"; import { OptionType } from "@utils/types"; -import { Alerts, useState } from "@webpack/common"; +import { useState } from "@webpack/common"; -import { clearLogs, Native } from "."; +import { Native } from "."; +import { ClearLogsButton } from "./components/ClearLogsButton"; import { ImageCacheDir, LogsDir } from "./components/FolderSelectInput"; import { openLogModal } from "./components/LogsModal"; import { blockedExts } from "./list"; @@ -300,22 +301,7 @@ export const settings = definePluginSettings({ clearLogs: { type: OptionType.COMPONENT, description: "Clear Logs", - component: () => - + component: () => }, });