diff --git a/src/main/mainWindow.ts b/src/main/mainWindow.ts index 5d6e0c6c..ab62066b 100644 --- a/src/main/mainWindow.ts +++ b/src/main/mainWindow.ts @@ -4,7 +4,16 @@ * Copyright (c) 2023 Vendicated and Vencord contributors */ -import { app, BrowserWindow, BrowserWindowConstructorOptions, Menu, MenuItemConstructorOptions, Tray } from "electron"; +import { + app, + BrowserWindow, + BrowserWindowConstructorOptions, + dialog, + Menu, + MenuItemConstructorOptions, + Tray +} from "electron"; +import { rm } from "fs/promises"; import { join } from "path"; import { IpcEvents } from "shared/IpcEvents"; import { isTruthy } from "shared/utils/guards"; @@ -14,7 +23,7 @@ import type { SettingsStore } from "shared/utils/SettingsStore"; import { ICON_PATH } from "../shared/paths"; import { createAboutWindow } from "./about"; import { initArRPC } from "./arrpc"; -import { DEFAULT_HEIGHT, DEFAULT_WIDTH, MIN_HEIGHT, MIN_WIDTH, VENCORD_FILES_DIR } from "./constants"; +import { DATA_DIR, DEFAULT_HEIGHT, DEFAULT_WIDTH, MIN_HEIGHT, MIN_WIDTH, VENCORD_FILES_DIR } from "./constants"; import { Settings, VencordSettings } from "./settings"; import { createSplashWindow } from "./splash"; import { makeLinksOpenExternally } from "./utils/makeLinksOpenExternally"; @@ -71,6 +80,12 @@ function initTray(win: BrowserWindow) { app.quit(); } }, + { + label: "Reset Vesktop", + async click() { + await clearData(win); + } + }, { type: "separator" }, @@ -104,6 +119,34 @@ function initTray(win: BrowserWindow) { }); } +const enum MessageBoxChoice { + Default, + Cancel +} + +async function clearData(win: BrowserWindow) { + const { response } = await dialog.showMessageBox(win, { + message: "Are you sure you want to reset Vesktop?", + detail: "This will log you out, clear caches and reset all your settings!\n\nVesktop will automatically restart after this operation.", + buttons: ["Yes", "No"], + cancelId: MessageBoxChoice.Cancel, + defaultId: MessageBoxChoice.Default, + type: "warning" + }); + + if (response === MessageBoxChoice.Cancel) return; + + win.close(); + + await win.webContents.session.clearStorageData(); + await win.webContents.session.clearCache(); + await win.webContents.session.clearCodeCaches({}); + await rm(DATA_DIR, { force: true, recursive: true }); + + app.relaunch(); + app.quit(); +} + function initMenuBar(win: BrowserWindow) { const isWindows = process.platform === "win32"; const isDarwin = process.platform === "darwin"; @@ -123,6 +166,13 @@ function initMenuBar(win: BrowserWindow) { }, toolTip: "Vesktop will automatically restart after this operation" }, + { + label: "Reset Vesktop", + async click() { + await clearData(win); + }, + toolTip: "Vesktop will automatically restart after this operation" + }, { label: "Relaunch", accelerator: "CmdOrCtrl+Shift+R",