feat: clear app cache

This commit is contained in:
kangfenmao 2024-11-25 11:16:24 +08:00
parent 383e8255a0
commit 33d5da7325
10 changed files with 152 additions and 57 deletions

View File

@ -1,3 +1,4 @@
import fs from 'node:fs'
import path from 'node:path' import path from 'node:path'
import { ThemeMode } from '@types' import { ThemeMode } from '@types'
@ -56,6 +57,28 @@ export function registerIpc(mainWindow: BrowserWindow, app: Electron.App) {
mainWindow.setTitleBarOverlay(theme === 'dark' ? titleBarOverlayDark : titleBarOverlayLight) mainWindow.setTitleBarOverlay(theme === 'dark' ? titleBarOverlayDark : titleBarOverlayLight)
}) })
// clear cache
ipcMain.handle('app:clear-cache', async () => {
const sessions = [session.defaultSession, session.fromPartition('persist:webview')]
try {
await Promise.all(
sessions.map(async (session) => {
await session.clearCache()
await session.clearStorageData({
storages: ['cookies', 'filesystem', 'shadercache', 'websql', 'serviceworkers', 'cachestorage']
})
})
)
await fileManager.clearTemp()
await fs.writeFileSync(log.transports.file.getFile().path, '')
return { success: true }
} catch (error: any) {
log.error('Failed to clear cache:', error)
return { success: false, error: error.message }
}
})
// check for update // check for update
ipcMain.handle('app:check-for-update', async () => { ipcMain.handle('app:check-for-update', async () => {
return { return {

View File

@ -267,6 +267,11 @@ class FileStorage {
await this.initStorageDir() await this.initStorageDir()
} }
public clearTemp = async (): Promise<void> => {
await fs.promises.rmdir(this.tempDir, { recursive: true })
await fs.promises.mkdir(this.tempDir, { recursive: true })
}
public open = async ( public open = async (
_: Electron.IpcMainInvokeEvent, _: Electron.IpcMainInvokeEvent,
options: OpenDialogOptions options: OpenDialogOptions

View File

@ -18,6 +18,7 @@ declare global {
setTheme: (theme: 'light' | 'dark') => void setTheme: (theme: 'light' | 'dark') => void
minApp: (options: { url: string; windowOptions?: Electron.BrowserWindowConstructorOptions }) => void minApp: (options: { url: string; windowOptions?: Electron.BrowserWindowConstructorOptions }) => void
reload: () => void reload: () => void
clearCache: () => Promise<{ success: boolean; error?: string }>
zip: { zip: {
compress: (text: string) => Promise<Buffer> compress: (text: string) => Promise<Buffer>
decompress: (text: Buffer) => Promise<string> decompress: (text: Buffer) => Promise<string>

View File

@ -13,6 +13,7 @@ const api = {
setTheme: (theme: 'light' | 'dark') => ipcRenderer.invoke('app:set-theme', theme), setTheme: (theme: 'light' | 'dark') => ipcRenderer.invoke('app:set-theme', theme),
openWebsite: (url: string) => ipcRenderer.invoke('open:website', url), openWebsite: (url: string) => ipcRenderer.invoke('open:website', url),
minApp: (url: string) => ipcRenderer.invoke('minapp', url), minApp: (url: string) => ipcRenderer.invoke('minapp', url),
clearCache: () => ipcRenderer.invoke('app:clear-cache'),
zip: { zip: {
compress: (text: string) => ipcRenderer.invoke('zip:compress', text), compress: (text: string) => ipcRenderer.invoke('zip:compress', text),
decompress: (text: Buffer) => ipcRenderer.invoke('zip:decompress', text) decompress: (text: Buffer) => ipcRenderer.invoke('zip:decompress', text)

View File

@ -259,7 +259,6 @@
"settings": { "settings": {
"title": "Settings", "title": "Settings",
"general": "General Settings", "general": "General Settings",
"data": "Data Settings",
"model": "Default Model", "model": "Default Model",
"assistant": "Default Assistant", "assistant": "Default Assistant",
"about": "About & Feedback", "about": "About & Feedback",
@ -283,15 +282,6 @@
"general.reset.title": "Data Reset", "general.reset.title": "Data Reset",
"general.reset.button": "Reset", "general.reset.button": "Reset",
"general.manually_check_update.title": "Turn off update checking", "general.manually_check_update.title": "Turn off update checking",
"data.webdav.title": "WebDAV",
"data.webdav.host": "WebDAV Host",
"data.webdav.host.placeholder": "http://localhost:8080",
"data.webdav.user": "WebDAV User",
"data.webdav.password": "WebDAV Password",
"data.webdav.path": "WebDAV Path",
"data.webdav.path.placeholder": "/backup",
"data.webdav.backup.button": "Backup to WebDAV",
"data.webdav.restore.button": "Restore from WebDAV",
"advanced.title": "Advanced Settings", "advanced.title": "Advanced Settings",
"advanced.auto_switch_to_topics": "Auto switch to topic", "advanced.auto_switch_to_topics": "Auto switch to topic",
"provider.api_key": "API Key", "provider.api_key": "API Key",
@ -356,9 +346,6 @@
"topic.position.right": "Right", "topic.position.right": "Right",
"topic.show.time": "Show Topic Time", "topic.show.time": "Show Topic Time",
"display.title": "Display Settings", "display.title": "Display Settings",
"data.title": "Data Directory",
"data.app_data": "App Data",
"data.app_logs": "App Logs",
"shortcuts": { "shortcuts": {
"title": "Keyboard Shortcuts", "title": "Keyboard Shortcuts",
"action": "Action", "action": "Action",
@ -403,6 +390,28 @@
"custom": "Custom Proxy", "custom": "Custom Proxy",
"none": "No Proxy" "none": "No Proxy"
} }
},
"data": {
"title": "Data Settings",
"webdav.title": "WebDAV",
"webdav.host": "WebDAV Host",
"webdav.host.placeholder": "http://localhost:8080",
"webdav.user": "WebDAV User",
"webdav.password": "WebDAV Password",
"webdav.path": "WebDAV Path",
"webdav.path.placeholder": "/backup",
"webdav.backup.button": "Backup to WebDAV",
"webdav.restore.button": "Restore from WebDAV",
"data.title": "Data Directory",
"app_data": "App Data",
"app_logs": "App Logs",
"clear_cache": {
"title": "Clear Cache",
"button": "Clear Cache",
"confirm": "Clearing the cache will delete application cache data, including minapp data. This action is irreversible, continue?",
"success": "Cache cleared",
"error": "Error clearing cache"
}
} }
}, },
"translate": { "translate": {

View File

@ -259,7 +259,6 @@
"settings": { "settings": {
"title": "Настройки", "title": "Настройки",
"general": "Общие настройки", "general": "Общие настройки",
"data": "Настройки данных",
"model": "Модель по умолчанию", "model": "Модель по умолчанию",
"assistant": "Ассистент по умолчанию", "assistant": "Ассистент по умолчанию",
"about": "О программе и обратная связь", "about": "О программе и обратная связь",
@ -283,15 +282,6 @@
"general.reset.title": "Сброс данных", "general.reset.title": "Сброс данных",
"general.reset.button": "Сброс", "general.reset.button": "Сброс",
"general.manually_check_update.title": "Отключить проверку обновлений", "general.manually_check_update.title": "Отключить проверку обновлений",
"data.webdav.title": "WebDAV",
"data.webdav.host": "Хост WebDAV",
"data.webdav.host.placeholder": "http://localhost:8080",
"data.webdav.user": "Пользователь WebDAV",
"data.webdav.password": "Пароль WebDAV",
"data.webdav.path": "Путь WebDAV",
"data.webdav.path.placeholder": "/backup",
"data.webdav.backup.button": "Резервное копирование на WebDAV",
"data.webdav.restore.button": "Восстановление с WebDAV",
"advanced.title": "Расширенные настройки", "advanced.title": "Расширенные настройки",
"advanced.auto_switch_to_topics": "Автоматически переключаться на топик", "advanced.auto_switch_to_topics": "Автоматически переключаться на топик",
"provider.api_key": "Ключ API", "provider.api_key": "Ключ API",
@ -356,9 +346,6 @@
"topic.position.right": "Справа", "topic.position.right": "Справа",
"topic.show.time": "Показывать время топика", "topic.show.time": "Показывать время топика",
"display.title": "Настройки отображения", "display.title": "Настройки отображения",
"data.title": "Каталог данных",
"data.app_data": "Данные приложения",
"data.app_logs": "Логи приложения",
"shortcuts": { "shortcuts": {
"title": "Горячие клавиши", "title": "Горячие клавиши",
"action": "Действие", "action": "Действие",
@ -403,6 +390,28 @@
"custom": "Пользовательский прокси", "custom": "Пользовательский прокси",
"none": "Не использовать прокси" "none": "Не использовать прокси"
} }
},
"data": {
"title": "Настройки данных",
"webdav.title": "WebDAV",
"webdav.host": "Хост WebDAV",
"webdav.host.placeholder": "http://localhost:8080",
"webdav.user": "Пользователь WebDAV",
"webdav.password": "Пароль WebDAV",
"webdav.path": "Путь WebDAV",
"webdav.path.placeholder": "/backup",
"webdav.backup.button": "Резервное копирование на WebDAV",
"webdav.restore.button": "Восстановление с WebDAV",
"data.title": "Каталог данных",
"app_data": "Данные приложения",
"app_logs": "Логи приложения",
"clear_cache": {
"title": "Очистка кэша",
"button": "Очистка кэша",
"confirm": "Очистка кэша удалит данные приложения. Это действие необратимо, продолжить?",
"success": "Кэш очищен",
"error": "Ошибка при очистке кэша"
}
} }
}, },
"translate": { "translate": {

View File

@ -259,7 +259,6 @@
"settings": { "settings": {
"title": "设置", "title": "设置",
"general": "常规设置", "general": "常规设置",
"data": "数据设置",
"model": "默认模型", "model": "默认模型",
"assistant": "默认助手", "assistant": "默认助手",
"about": "关于我们", "about": "关于我们",
@ -283,15 +282,6 @@
"general.reset.button": "重置", "general.reset.button": "重置",
"general.view_webdav_settings": "查看 WebDAV 设置", "general.view_webdav_settings": "查看 WebDAV 设置",
"general.manually_check_update.title": "关闭更新检测", "general.manually_check_update.title": "关闭更新检测",
"data.webdav.title": "WebDAV",
"data.webdav.host": "WebDAV 地址",
"data.webdav.host.placeholder": "http://localhost:8080",
"data.webdav.user": "WebDAV 用户名",
"data.webdav.password": "WebDAV 密码",
"data.webdav.path": "WebDAV 路径",
"data.webdav.path.placeholder": "/backup",
"data.webdav.backup.button": "备份到 WebDAV",
"data.webdav.restore.button": "从 WebDAV 恢复",
"advanced.title": "高级设置", "advanced.title": "高级设置",
"advanced.auto_switch_to_topics": "自动切换到话题", "advanced.auto_switch_to_topics": "自动切换到话题",
"models.default_assistant_model": "默认助手模型", "models.default_assistant_model": "默认助手模型",
@ -321,7 +311,7 @@
"about.title": "关于我们", "about.title": "关于我们",
"about.releases.title": "更新日志", "about.releases.title": "更新日志",
"about.releases.button": "查看", "about.releases.button": "查看",
"about.website.title": "官方网<EFBFBD><EFBFBD><EFBFBD>", "about.website.title": "官方网",
"about.website.button": "查看", "about.website.button": "查看",
"about.feedback.title": "意见反馈", "about.feedback.title": "意见反馈",
"about.feedback.button": "反馈", "about.feedback.button": "反馈",
@ -344,9 +334,6 @@
"topic.position.right": "右侧", "topic.position.right": "右侧",
"topic.show.time": "显示话题时间", "topic.show.time": "显示话题时间",
"display.title": "显示设置", "display.title": "显示设置",
"data.title": "数据目录",
"data.app_data": "应用数据",
"data.app_logs": "应用日志",
"shortcuts": { "shortcuts": {
"title": "快捷方式", "title": "快捷方式",
"action": "操作", "action": "操作",
@ -391,6 +378,28 @@
"custom": "自定义代理", "custom": "自定义代理",
"none": "不使用代理" "none": "不使用代理"
} }
},
"data": {
"title": "数据设置",
"webdav.title": "WebDAV",
"webdav.host": "WebDAV 地址",
"webdav.host.placeholder": "http://localhost:8080",
"webdav.user": "WebDAV 用户名",
"webdav.password": "WebDAV 密码",
"webdav.path": "WebDAV 路径",
"webdav.path.placeholder": "/backup",
"webdav.backup.button": "备份到 WebDAV",
"webdav.restore.button": "从 WebDAV 恢复",
"data.title": "数据目录",
"app_data": "应用数据",
"app_logs": "应用日志",
"clear_cache": {
"title": "清除缓存",
"button": "清除缓存",
"confirm": "清除缓存将删除应用缓存的数据,包括小程序数据。此操作不可恢复,是否继续?",
"success": "缓存清除成功",
"error": "清除缓存失败"
}
} }
}, },
"translate": { "translate": {

View File

@ -259,7 +259,6 @@
"settings": { "settings": {
"title": "設定", "title": "設定",
"general": "一般設定", "general": "一般設定",
"data": "數據設定",
"model": "預設模型", "model": "預設模型",
"assistant": "預設助手", "assistant": "預設助手",
"about": "關於與回饋", "about": "關於與回饋",
@ -283,15 +282,6 @@
"general.reset.title": "資料重置", "general.reset.title": "資料重置",
"general.reset.button": "重置", "general.reset.button": "重置",
"general.manually_check_update.title": "關閉更新檢查", "general.manually_check_update.title": "關閉更新檢查",
"data.webdav.title": "WebDAV",
"data.webdav.host": "WebDAV 主機位址",
"data.webdav.host.placeholder": "http://localhost:8080",
"data.webdav.user": "WebDAV 使用者名稱",
"data.webdav.password": "WebDAV 密碼",
"data.webdav.path": "WebDAV Path",
"data.webdav.path.placeholder": "/backup",
"data.webdav.backup.button": "從 WebDAV 備份",
"data.webdav.restore.button": "從 WebDAV 恢復",
"advanced.title": "進階設定", "advanced.title": "進階設定",
"advanced.auto_switch_to_topics": "自動切換到話題", "advanced.auto_switch_to_topics": "自動切換到話題",
"models.default_assistant_model": "預設助手模型", "models.default_assistant_model": "預設助手模型",
@ -344,9 +334,6 @@
"topic.position.right": "右側", "topic.position.right": "右側",
"topic.show.time": "顯示話題時間", "topic.show.time": "顯示話題時間",
"display.title": "顯示設定", "display.title": "顯示設定",
"data.title": "數據目錄",
"data.app_data": "應用數據",
"data.app_logs": "應用日誌",
"shortcuts": { "shortcuts": {
"title": "快速方式", "title": "快速方式",
"action": "操作", "action": "操作",
@ -391,6 +378,28 @@
"custom": "自定義代理", "custom": "自定義代理",
"none": "不使用代理" "none": "不使用代理"
} }
},
"data": {
"title": "數據設定",
"webdav.title": "WebDAV",
"webdav.host": "WebDAV 主機位址",
"webdav.host.placeholder": "http://localhost:8080",
"webdav.user": "WebDAV 使用者名稱",
"webdav.password": "WebDAV 密碼",
"webdav.path": "WebDAV Path",
"webdav.path.placeholder": "/backup",
"webdav.backup.button": "從 WebDAV 備份",
"webdav.restore.button": "從 WebDAV 恢復",
"data.title": "數據目錄",
"data.app_data": "應用數據",
"data.app_logs": "應用日誌",
"clear_cache": {
"title": "清除緩存",
"button": "清除緩存",
"confirm": "清除緩存將刪除應用緩存數據,包括小程序數據。此操作不可恢復,是否繼續?",
"success": "緩存清除成功",
"error": "清除緩存失敗"
}
} }
}, },
"translate": { "translate": {

View File

@ -3,7 +3,7 @@ import { HStack } from '@renderer/components/Layout'
import { useTheme } from '@renderer/context/ThemeProvider' import { useTheme } from '@renderer/context/ThemeProvider'
import { backup, reset, restore } from '@renderer/services/BackupService' import { backup, reset, restore } from '@renderer/services/BackupService'
import { AppInfo } from '@renderer/types' import { AppInfo } from '@renderer/types'
import { Button, Typography } from 'antd' import { Button, message, Modal, Typography } from 'antd'
import { FC, useEffect, useState } from 'react' import { FC, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import styled from 'styled-components' import styled from 'styled-components'
@ -30,10 +30,30 @@ const DataSettings: FC = () => {
} }
} }
const handleClearCache = () => {
Modal.confirm({
title: t('settings.data.clear_cache.title'),
content: t('settings.data.clear_cache.confirm'),
okText: t('settings.data.clear_cache.button'),
centered: true,
okButtonProps: {
danger: true
},
onOk: async () => {
try {
await window.api.clearCache()
message.success(t('settings.data.clear_cache.success'))
} catch (error) {
message.error(t('settings.data.clear_cache.error'))
}
}
})
}
return ( return (
<SettingContainer theme={theme}> <SettingContainer theme={theme}>
<SettingGroup theme={theme}> <SettingGroup theme={theme}>
<SettingTitle>{t('settings.data')}</SettingTitle> <SettingTitle>{t('settings.data.title')}</SettingTitle>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitle>{t('settings.general.backup.title')}</SettingRowTitle> <SettingRowTitle>{t('settings.general.backup.title')}</SettingRowTitle>
@ -60,7 +80,7 @@ const DataSettings: FC = () => {
<WebDavSettings /> <WebDavSettings />
</SettingGroup> </SettingGroup>
<SettingGroup theme={theme}> <SettingGroup theme={theme}>
<SettingTitle>{t('settings.data.title')}</SettingTitle> <SettingTitle>{t('settings.data.data.title')}</SettingTitle>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitle>{t('settings.data.app_data')}</SettingRowTitle> <SettingRowTitle>{t('settings.data.app_data')}</SettingRowTitle>
@ -77,6 +97,15 @@ const DataSettings: FC = () => {
<StyledIcon onClick={() => handleOpenPath(appInfo?.logsPath)} /> <StyledIcon onClick={() => handleOpenPath(appInfo?.logsPath)} />
</HStack> </HStack>
</SettingRow> </SettingRow>
<SettingDivider />
<SettingRow>
<SettingRowTitle>{t('settings.data.clear_cache.title')}</SettingRowTitle>
<HStack gap="5px">
<Button onClick={handleClearCache} danger>
{t('settings.data.clear_cache.button')}
</Button>
</HStack>
</SettingRow>
</SettingGroup> </SettingGroup>
</SettingContainer> </SettingContainer>
) )

View File

@ -57,7 +57,7 @@ const SettingsPage: FC = () => {
<MenuItemLink to="/settings/data"> <MenuItemLink to="/settings/data">
<MenuItem className={isRoute('/settings/data')}> <MenuItem className={isRoute('/settings/data')}>
<SaveOutlined /> <SaveOutlined />
{t('settings.data')} {t('settings.data.title')}
</MenuItem> </MenuItem>
</MenuItemLink> </MenuItemLink>
<MenuItemLink to="/settings/about"> <MenuItemLink to="/settings/about">