feat: add cache size retrieval functionality and integrate with UI (#5689)

* feat: add cache size retrieval functionality and integrate with UI

* chore: clean

* update

* update
This commit is contained in:
Konv Suu 2025-05-13 15:55:38 +08:00 committed by kangfenmao
parent f8603d0c24
commit 9a8e17908a
7 changed files with 53 additions and 3 deletions

View File

@ -86,6 +86,7 @@
"fast-xml-parser": "^5.2.0", "fast-xml-parser": "^5.2.0",
"fetch-socks": "^1.3.2", "fetch-socks": "^1.3.2",
"fs-extra": "^11.2.0", "fs-extra": "^11.2.0",
"go-get-folder-size": "^0.5.5",
"got-scraping": "^4.1.1", "got-scraping": "^4.1.1",
"jsdom": "^26.0.0", "jsdom": "^26.0.0",
"markdown-it": "^14.1.0", "markdown-it": "^14.1.0",

View File

@ -1,4 +1,5 @@
export enum IpcChannel { export enum IpcChannel {
App_GetCacheSize = 'app:get-cache-size',
App_ClearCache = 'app:clear-cache', App_ClearCache = 'app:clear-cache',
App_SetLaunchOnBoot = 'app:set-launch-on-boot', App_SetLaunchOnBoot = 'app:set-launch-on-boot',
App_SetLanguage = 'app:set-language', App_SetLanguage = 'app:set-language',

View File

@ -8,6 +8,7 @@ import { IpcChannel } from '@shared/IpcChannel'
import { Shortcut, ThemeMode } from '@types' import { Shortcut, ThemeMode } from '@types'
import { BrowserWindow, ipcMain, nativeTheme, session, shell } from 'electron' import { BrowserWindow, ipcMain, nativeTheme, session, shell } from 'electron'
import log from 'electron-log' import log from 'electron-log'
import { getFolderSizeBin } from 'go-get-folder-size'
import { titleBarOverlayDark, titleBarOverlayLight } from './config' import { titleBarOverlayDark, titleBarOverlayLight } from './config'
import AppUpdater from './services/AppUpdater' import AppUpdater from './services/AppUpdater'
@ -31,8 +32,9 @@ import { setOpenLinkExternal } from './services/WebviewService'
import { windowService } from './services/WindowService' import { windowService } from './services/WindowService'
import { getResourcePath } from './utils' import { getResourcePath } from './utils'
import { decrypt, encrypt } from './utils/aes' import { decrypt, encrypt } from './utils/aes'
import { getConfigDir, getFilesDir } from './utils/file' import { getCacheDir, getConfigDir, getFilesDir } from './utils/file'
import { compress, decompress } from './utils/zip' import { compress, decompress } from './utils/zip'
const fileManager = new FileStorage() const fileManager = new FileStorage()
const backupManager = new BackupManager() const backupManager = new BackupManager()
const exportService = new ExportService(fileManager) const exportService = new ExportService(fileManager)
@ -179,6 +181,19 @@ export function registerIpc(mainWindow: BrowserWindow, app: Electron.App) {
} }
}) })
// get cache size
ipcMain.handle(IpcChannel.App_GetCacheSize, async () => {
const cachePath = getCacheDir()
const size = await getFolderSizeBin(cachePath, true, {
// ignore files that we can't access
loose: true
}).catch((err) => {
log.error('Failed to get cache size:', err)
})
return size || '0MB'
})
// check for update // check for update
ipcMain.handle(IpcChannel.App_CheckForUpdate, async () => { ipcMain.handle(IpcChannel.App_CheckForUpdate, async () => {
await appUpdater.checkForUpdates() await appUpdater.checkForUpdates()

View File

@ -81,6 +81,10 @@ export function getConfigDir() {
return path.join(os.homedir(), '.cherrystudio', 'config') return path.join(os.homedir(), '.cherrystudio', 'config')
} }
export function getCacheDir() {
return path.join(app.getPath('userData'), 'Cache')
}
export function getAppConfigDir(name: string) { export function getAppConfigDir(name: string) {
return path.join(getConfigDir(), name) return path.join(getConfigDir(), name)
} }

View File

@ -23,6 +23,7 @@ const api = {
ipcRenderer.invoke(IpcChannel.App_HandleZoomFactor, delta, reset), ipcRenderer.invoke(IpcChannel.App_HandleZoomFactor, delta, reset),
setAutoUpdate: (isActive: boolean) => ipcRenderer.invoke(IpcChannel.App_SetAutoUpdate, isActive), setAutoUpdate: (isActive: boolean) => ipcRenderer.invoke(IpcChannel.App_SetAutoUpdate, isActive),
openWebsite: (url: string) => ipcRenderer.invoke(IpcChannel.Open_Website, url), openWebsite: (url: string) => ipcRenderer.invoke(IpcChannel.Open_Website, url),
getCacheSize: () => ipcRenderer.invoke(IpcChannel.App_GetCacheSize),
clearCache: () => ipcRenderer.invoke(IpcChannel.App_ClearCache), clearCache: () => ipcRenderer.invoke(IpcChannel.App_ClearCache),
system: { system: {
getDeviceType: () => ipcRenderer.invoke(IpcChannel.System_GetDeviceType), getDeviceType: () => ipcRenderer.invoke(IpcChannel.System_GetDeviceType),

View File

@ -36,6 +36,7 @@ import YuqueSettings from './YuqueSettings'
const DataSettings: FC = () => { const DataSettings: FC = () => {
const { t } = useTranslation() const { t } = useTranslation()
const [appInfo, setAppInfo] = useState<AppInfo>() const [appInfo, setAppInfo] = useState<AppInfo>()
const [cacheSize, setCacheSize] = useState<string>('')
const { size, removeAllFiles } = useKnowledgeFiles() const { size, removeAllFiles } = useKnowledgeFiles()
const { theme } = useTheme() const { theme } = useTheme()
const [menu, setMenu] = useState<string>('data') const [menu, setMenu] = useState<string>('data')
@ -106,6 +107,7 @@ const DataSettings: FC = () => {
useEffect(() => { useEffect(() => {
window.api.getAppInfo().then(setAppInfo) window.api.getAppInfo().then(setAppInfo)
window.api.getCacheSize().then(setCacheSize)
}, []) }, [])
const handleOpenPath = (path?: string) => { const handleOpenPath = (path?: string) => {
@ -130,6 +132,7 @@ const DataSettings: FC = () => {
onOk: async () => { onOk: async () => {
try { try {
await window.api.clearCache() await window.api.clearCache()
await window.api.getCacheSize().then(setCacheSize)
window.message.success(t('settings.data.clear_cache.success')) window.message.success(t('settings.data.clear_cache.success'))
} catch (error) { } catch (error) {
window.message.error(t('settings.data.clear_cache.error')) window.message.error(t('settings.data.clear_cache.error'))
@ -228,7 +231,10 @@ const DataSettings: FC = () => {
</SettingRow> </SettingRow>
<SettingDivider /> <SettingDivider />
<SettingRow> <SettingRow>
<SettingRowTitle>{t('settings.data.clear_cache.title')}</SettingRowTitle> <SettingRowTitle>
{t('settings.data.clear_cache.title')}
<CacheText>({cacheSize})</CacheText>
</SettingRowTitle>
<HStack gap="5px"> <HStack gap="5px">
<Button onClick={handleClearCache} danger> <Button onClick={handleClearCache} danger>
{t('settings.data.clear_cache.button')} {t('settings.data.clear_cache.button')}
@ -280,6 +286,16 @@ const MenuList = styled.div`
} }
` `
const CacheText = styled(Typography.Text)`
color: var(--color-text-3);
font-size: 12px;
margin-left: 5px;
line-height: 16px;
display: inline-block;
vertical-align: middle;
text-align: left;
`
const PathText = styled(Typography.Text)` const PathText = styled(Typography.Text)`
flex: 1; flex: 1;
min-width: 0; min-width: 0;

View File

@ -4425,6 +4425,7 @@ __metadata:
fast-xml-parser: "npm:^5.2.0" fast-xml-parser: "npm:^5.2.0"
fetch-socks: "npm:^1.3.2" fetch-socks: "npm:^1.3.2"
fs-extra: "npm:^11.2.0" fs-extra: "npm:^11.2.0"
go-get-folder-size: "npm:^0.5.5"
got-scraping: "npm:^4.1.1" got-scraping: "npm:^4.1.1"
html-to-image: "npm:^1.11.13" html-to-image: "npm:^1.11.13"
husky: "npm:^9.1.7" husky: "npm:^9.1.7"
@ -8963,6 +8964,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"go-get-folder-size@npm:^0.5.5":
version: 0.5.5
resolution: "go-get-folder-size@npm:0.5.5"
dependencies:
std-env: "npm:^3.7.0"
bin:
go-get-folder-size: bin/cli.js
checksum: 10c0/eb69b686952218cc114dccf65763e0dff5056050fa3e9b2afa6161b933c3978500455503b104f9f28d96aab2fedd64ccb0255d6ea16d699fe020795f431ed7b8
languageName: node
linkType: hard
"google-auth-library@npm:^9.14.2": "google-auth-library@npm:^9.14.2":
version: 9.15.1 version: 9.15.1
resolution: "google-auth-library@npm:9.15.1" resolution: "google-auth-library@npm:9.15.1"
@ -16013,7 +16025,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"std-env@npm:^3.8.1": "std-env@npm:^3.7.0, std-env@npm:^3.8.1":
version: 3.9.0 version: 3.9.0
resolution: "std-env@npm:3.9.0" resolution: "std-env@npm:3.9.0"
checksum: 10c0/4a6f9218aef3f41046c3c7ecf1f98df00b30a07f4f35c6d47b28329bc2531eef820828951c7d7b39a1c5eb19ad8a46e3ddfc7deb28f0a2f3ceebee11bab7ba50 checksum: 10c0/4a6f9218aef3f41046c3c7ecf1f98df00b30a07f4f35c6d47b28329bc2531eef820828951c7d7b39a1c5eb19ad8a46e3ddfc7deb28f0a2f3ceebee11bab7ba50