From 5d55fdcf567425cd4c01e49c8883ddc447867d43 Mon Sep 17 00:00:00 2001 From: neriousy Date: Thu, 12 Mar 2026 21:40:24 +0100 Subject: [PATCH 1/4] feat: clear cache --- packages/app/src/app.tsx | 12 + packages/app/src/context/platform.tsx | 3 + packages/app/src/entry.tsx | 17 ++ packages/app/src/i18n/ar.ts | 1 + packages/app/src/i18n/br.ts | 1 + packages/app/src/i18n/bs.ts | 1 + packages/app/src/i18n/da.ts | 1 + packages/app/src/i18n/de.ts | 1 + packages/app/src/i18n/en.ts | 1 + packages/app/src/i18n/es.ts | 1 + packages/app/src/i18n/fr.ts | 1 + packages/app/src/i18n/ja.ts | 1 + packages/app/src/i18n/ko.ts | 1 + packages/app/src/i18n/no.ts | 1 + packages/app/src/i18n/pl.ts | 1 + packages/app/src/i18n/ru.ts | 1 + packages/app/src/i18n/th.ts | 1 + packages/app/src/i18n/tr.ts | 1 + packages/app/src/i18n/zh.ts | 1 + packages/app/src/i18n/zht.ts | 1 + packages/app/src/pages/error.tsx | 27 +- packages/desktop/src/bindings.ts | 1 - packages/desktop/src/index.tsx | 342 ++++++++++++++------------ 23 files changed, 262 insertions(+), 157 deletions(-) diff --git a/packages/app/src/app.tsx b/packages/app/src/app.tsx index 1b7ffde46a1..94f4bc05146 100644 --- a/packages/app/src/app.tsx +++ b/packages/app/src/app.tsx @@ -43,6 +43,17 @@ import { TerminalProvider } from "@/context/terminal" import DirectoryLayout from "@/pages/directory-layout" import Layout from "@/pages/layout" import { ErrorPage } from "./pages/error" + +// Test error trigger - renders error page when ?error=test is in URL +function TestErrorTrigger() { + if (typeof location !== "undefined") { + const params = new URLSearchParams(location.search) + if (params.get("error") === "test") { + throw new Error("Test error triggered via URL parameter") + } + } + return null +} import { useCheckServerHealth } from "./utils/server-health" const Home = lazy(() => import("@/pages/home")) @@ -141,6 +152,7 @@ export function AppBaseProviders(props: ParentProps) { }> + {props.children} diff --git a/packages/app/src/context/platform.tsx b/packages/app/src/context/platform.tsx index b8ed58e343a..79cb737e63a 100644 --- a/packages/app/src/context/platform.tsx +++ b/packages/app/src/context/platform.tsx @@ -28,6 +28,9 @@ export type Platform = { /** Restart the app */ restart(): Promise + /** Clear persisted client cache/state */ + clearCache?(): Promise + /** Navigate back in history */ back(): void diff --git a/packages/app/src/entry.tsx b/packages/app/src/entry.tsx index c62baccba50..942877b9317 100644 --- a/packages/app/src/entry.tsx +++ b/packages/app/src/entry.tsx @@ -93,6 +93,22 @@ const restart: Platform["restart"] = async () => { window.location.reload() } +const clearCache: Platform["clearCache"] = async () => { + if (typeof localStorage !== "undefined") { + try { + localStorage.clear() + } catch {} + } + + if ("caches" in window) { + const keys = await caches.keys().catch(() => []) + await Promise.all(keys.map((key) => caches.delete(key).catch(() => false))) + } + + document.cookie = "oc_locale=; Path=/; Max-Age=0; SameSite=Lax" + window.location.reload() +} + const root = document.getElementById("root") if (!(root instanceof HTMLElement) && import.meta.env.DEV) { throw new Error(getRootNotFoundError()) @@ -118,6 +134,7 @@ const platform: Platform = { back, forward, restart, + clearCache, notify, getDefaultServer: async () => { const stored = readDefaultServerUrl() diff --git a/packages/app/src/i18n/ar.ts b/packages/app/src/i18n/ar.ts index c9b92db501d..1440472f621 100644 --- a/packages/app/src/i18n/ar.ts +++ b/packages/app/src/i18n/ar.ts @@ -394,6 +394,7 @@ export const dict = { "error.page.description": "حدث خطأ أثناء تحميل التطبيق.", "error.page.details.label": "تفاصيل الخطأ", "error.page.action.restart": "إعادة تشغيل", + "error.page.action.clearCache": "مسح ذاكرة التخزين المؤقت", "error.page.action.checking": "جارٍ التحقق...", "error.page.action.checkUpdates": "التحقق من وجود تحديثات", "error.page.action.updateTo": "تحديث إلى {{version}}", diff --git a/packages/app/src/i18n/br.ts b/packages/app/src/i18n/br.ts index 951edf0a5c0..c5521ad85ed 100644 --- a/packages/app/src/i18n/br.ts +++ b/packages/app/src/i18n/br.ts @@ -395,6 +395,7 @@ export const dict = { "error.page.description": "Ocorreu um erro ao carregar a aplicação.", "error.page.details.label": "Detalhes do Erro", "error.page.action.restart": "Reiniciar", + "error.page.action.clearCache": "Limpar cache", "error.page.action.checking": "Verificando...", "error.page.action.checkUpdates": "Verificar atualizações", "error.page.action.updateTo": "Atualizar para {{version}}", diff --git a/packages/app/src/i18n/bs.ts b/packages/app/src/i18n/bs.ts index e8bdcde596e..05fd57fb394 100644 --- a/packages/app/src/i18n/bs.ts +++ b/packages/app/src/i18n/bs.ts @@ -441,6 +441,7 @@ export const dict = { "error.page.description": "Došlo je do greške prilikom učitavanja aplikacije.", "error.page.details.label": "Detalji greške", "error.page.action.restart": "Restartuj", + "error.page.action.clearCache": "Očisti keš", "error.page.action.checking": "Provjera...", "error.page.action.checkUpdates": "Provjeri ažuriranja", "error.page.action.updateTo": "Ažuriraj na {{version}}", diff --git a/packages/app/src/i18n/da.ts b/packages/app/src/i18n/da.ts index 5ea52a5c92c..750c9a0519b 100644 --- a/packages/app/src/i18n/da.ts +++ b/packages/app/src/i18n/da.ts @@ -438,6 +438,7 @@ export const dict = { "error.page.description": "Der opstod en fejl under indlæsning af applikationen.", "error.page.details.label": "Fejldetaljer", "error.page.action.restart": "Genstart", + "error.page.action.clearCache": "Ryd cache", "error.page.action.checking": "Tjekker...", "error.page.action.checkUpdates": "Tjek for opdateringer", "error.page.action.updateTo": "Opdater til {{version}}", diff --git a/packages/app/src/i18n/de.ts b/packages/app/src/i18n/de.ts index a6cf8045c09..15878aa7d1b 100644 --- a/packages/app/src/i18n/de.ts +++ b/packages/app/src/i18n/de.ts @@ -402,6 +402,7 @@ export const dict = { "error.page.description": "Beim Laden der Anwendung ist ein Fehler aufgetreten.", "error.page.details.label": "Fehlerdetails", "error.page.action.restart": "Neustart", + "error.page.action.clearCache": "Cache leeren", "error.page.action.checking": "Prüfen...", "error.page.action.checkUpdates": "Nach Updates suchen", "error.page.action.updateTo": "Auf {{version}} aktualisieren", diff --git a/packages/app/src/i18n/en.ts b/packages/app/src/i18n/en.ts index c87e7cb9dbb..dc087ebb4ce 100644 --- a/packages/app/src/i18n/en.ts +++ b/packages/app/src/i18n/en.ts @@ -453,6 +453,7 @@ export const dict = { "error.page.description": "An error occurred while loading the application.", "error.page.details.label": "Error Details", "error.page.action.restart": "Restart", + "error.page.action.clearCache": "Clear cache", "error.page.action.checking": "Checking...", "error.page.action.checkUpdates": "Check for updates", "error.page.action.updateTo": "Update to {{version}}", diff --git a/packages/app/src/i18n/es.ts b/packages/app/src/i18n/es.ts index 77ef7970c43..cdfe4226bf0 100644 --- a/packages/app/src/i18n/es.ts +++ b/packages/app/src/i18n/es.ts @@ -441,6 +441,7 @@ export const dict = { "error.page.description": "Ocurrió un error al cargar la aplicación.", "error.page.details.label": "Detalles del error", "error.page.action.restart": "Reiniciar", + "error.page.action.clearCache": "Borrar caché", "error.page.action.checking": "Comprobando...", "error.page.action.checkUpdates": "Buscar actualizaciones", "error.page.action.updateTo": "Actualizar a {{version}}", diff --git a/packages/app/src/i18n/fr.ts b/packages/app/src/i18n/fr.ts index c887f9ee8b2..c4d063c4c24 100644 --- a/packages/app/src/i18n/fr.ts +++ b/packages/app/src/i18n/fr.ts @@ -397,6 +397,7 @@ export const dict = { "error.page.description": "Une erreur s'est produite lors du chargement de l'application.", "error.page.details.label": "Détails de l'erreur", "error.page.action.restart": "Redémarrer", + "error.page.action.clearCache": "Vider le cache", "error.page.action.checking": "Vérification...", "error.page.action.checkUpdates": "Vérifier les mises à jour", "error.page.action.updateTo": "Mettre à jour vers {{version}}", diff --git a/packages/app/src/i18n/ja.ts b/packages/app/src/i18n/ja.ts index 9ddb6baf4a7..40a02b1f94e 100644 --- a/packages/app/src/i18n/ja.ts +++ b/packages/app/src/i18n/ja.ts @@ -394,6 +394,7 @@ export const dict = { "error.page.description": "アプリケーションの読み込み中にエラーが発生しました。", "error.page.details.label": "エラー詳細", "error.page.action.restart": "再起動", + "error.page.action.clearCache": "キャッシュを削除", "error.page.action.checking": "確認中...", "error.page.action.checkUpdates": "アップデートを確認", "error.page.action.updateTo": "{{version}}にアップデート", diff --git a/packages/app/src/i18n/ko.ts b/packages/app/src/i18n/ko.ts index 1e35106d1bc..be00932eb4b 100644 --- a/packages/app/src/i18n/ko.ts +++ b/packages/app/src/i18n/ko.ts @@ -397,6 +397,7 @@ export const dict = { "error.page.description": "애플리케이션을 로드하는 동안 오류가 발생했습니다.", "error.page.details.label": "오류 세부 정보", "error.page.action.restart": "다시 시작", + "error.page.action.clearCache": "캐시 지우기", "error.page.action.checking": "확인 중...", "error.page.action.checkUpdates": "업데이트 확인", "error.page.action.updateTo": "{{version}} 버전으로 업데이트", diff --git a/packages/app/src/i18n/no.ts b/packages/app/src/i18n/no.ts index d9dac8ee550..9d84bd3c0cd 100644 --- a/packages/app/src/i18n/no.ts +++ b/packages/app/src/i18n/no.ts @@ -442,6 +442,7 @@ export const dict = { "error.page.description": "Det oppstod en feil under lasting av applikasjonen.", "error.page.details.label": "Feildetaljer", "error.page.action.restart": "Start på nytt", + "error.page.action.clearCache": "Tøm hurtigbuffer", "error.page.action.checking": "Sjekker...", "error.page.action.checkUpdates": "Se etter oppdateringer", "error.page.action.updateTo": "Oppdater til {{version}}", diff --git a/packages/app/src/i18n/pl.ts b/packages/app/src/i18n/pl.ts index b63fe5ee409..43d2ff80369 100644 --- a/packages/app/src/i18n/pl.ts +++ b/packages/app/src/i18n/pl.ts @@ -395,6 +395,7 @@ export const dict = { "error.page.description": "Wystąpił błąd podczas ładowania aplikacji.", "error.page.details.label": "Szczegóły błędu", "error.page.action.restart": "Restartuj", + "error.page.action.clearCache": "Wyczyść pamięć podręczną", "error.page.action.checking": "Sprawdzanie...", "error.page.action.checkUpdates": "Sprawdź aktualizacje", "error.page.action.updateTo": "Zaktualizuj do {{version}}", diff --git a/packages/app/src/i18n/ru.ts b/packages/app/src/i18n/ru.ts index aadb926d270..7769665d366 100644 --- a/packages/app/src/i18n/ru.ts +++ b/packages/app/src/i18n/ru.ts @@ -440,6 +440,7 @@ export const dict = { "error.page.description": "Произошла ошибка при загрузке приложения.", "error.page.details.label": "Детали ошибки", "error.page.action.restart": "Перезапустить", + "error.page.action.clearCache": "Очистить кэш", "error.page.action.checking": "Проверка...", "error.page.action.checkUpdates": "Проверить обновления", "error.page.action.updateTo": "Обновить до {{version}}", diff --git a/packages/app/src/i18n/th.ts b/packages/app/src/i18n/th.ts index 6a25a356a96..c56884085a3 100644 --- a/packages/app/src/i18n/th.ts +++ b/packages/app/src/i18n/th.ts @@ -439,6 +439,7 @@ export const dict = { "error.page.description": "เกิดข้อผิดพลาดระหว่างการโหลดแอปพลิเคชัน", "error.page.details.label": "รายละเอียดข้อผิดพลาด", "error.page.action.restart": "รีสตาร์ท", + "error.page.action.clearCache": "ล้างแคช", "error.page.action.checking": "กำลังตรวจสอบ...", "error.page.action.checkUpdates": "ตรวจสอบการอัปเดต", "error.page.action.updateTo": "อัปเดตเป็น {{version}}", diff --git a/packages/app/src/i18n/tr.ts b/packages/app/src/i18n/tr.ts index 50e55983247..d70877f441c 100644 --- a/packages/app/src/i18n/tr.ts +++ b/packages/app/src/i18n/tr.ts @@ -446,6 +446,7 @@ export const dict = { "error.page.description": "Uygulama yüklenirken bir hata oluştu.", "error.page.details.label": "Hata Detayları", "error.page.action.restart": "Yeniden Başlat", + "error.page.action.clearCache": "Önbelleği temizle", "error.page.action.checking": "Kontrol ediliyor...", "error.page.action.checkUpdates": "Güncellemeleri kontrol et", "error.page.action.updateTo": "{{version}} sürümüne güncelle", diff --git a/packages/app/src/i18n/zh.ts b/packages/app/src/i18n/zh.ts index 1f88a822235..fda4850889a 100644 --- a/packages/app/src/i18n/zh.ts +++ b/packages/app/src/i18n/zh.ts @@ -444,6 +444,7 @@ export const dict = { "error.page.description": "加载应用程序时发生错误。", "error.page.details.label": "错误详情", "error.page.action.restart": "重启", + "error.page.action.clearCache": "清除缓存", "error.page.action.checking": "检查中...", "error.page.action.checkUpdates": "检查更新", "error.page.action.updateTo": "更新到 {{version}}", diff --git a/packages/app/src/i18n/zht.ts b/packages/app/src/i18n/zht.ts index a75e8ef47a6..f6fc1c4c74e 100644 --- a/packages/app/src/i18n/zht.ts +++ b/packages/app/src/i18n/zht.ts @@ -437,6 +437,7 @@ export const dict = { "error.page.description": "載入應用程式時發生錯誤。", "error.page.details.label": "錯誤詳情", "error.page.action.restart": "重新啟動", + "error.page.action.clearCache": "清除快取", "error.page.action.checking": "檢查中...", "error.page.action.checkUpdates": "檢查更新", "error.page.action.updateTo": "更新到 {{version}}", diff --git a/packages/app/src/pages/error.tsx b/packages/app/src/pages/error.tsx index a30d86d1809..94b41616dc8 100644 --- a/packages/app/src/pages/error.tsx +++ b/packages/app/src/pages/error.tsx @@ -220,6 +220,7 @@ export const ErrorPage: Component = (props) => { const language = useLanguage() const [store, setStore] = createStore({ checking: false, + clearing: false, version: undefined as string | undefined, actionError: undefined as string | undefined, }) @@ -252,6 +253,20 @@ export const ErrorPage: Component = (props) => { }) } + async function clearCache() { + if (!platform.clearCache) return + setStore("clearing", true) + await platform + .clearCache() + .then(() => setStore("actionError", undefined)) + .catch((err) => { + setStore("actionError", formatError(err, language.t)) + }) + .finally(() => { + setStore("clearing", false) + }) + } + return (
@@ -273,11 +288,21 @@ export const ErrorPage: Component = (props) => { + + + + diff --git a/packages/desktop/src/index.tsx b/packages/desktop/src/index.tsx index 218f0ef70d4..7124e224a9e 100644 --- a/packages/desktop/src/index.tsx +++ b/packages/desktop/src/index.tsx @@ -247,9 +247,15 @@ const createPlatform = (): Platform => { if (api) await api.clear().catch(() => undefined) const store = await Store.load(name).catch(() => null) - if (!store) return - await store.clear().catch(() => undefined) - await store.save().catch(() => undefined) + if (store) { + await store.clear().catch(() => undefined) + await store.save().catch(() => undefined) + return + } + + const fresh = await Store.load(name, { defaults: {}, createNew: true }).catch(() => null) + if (!fresh) return + await fresh.save().catch(() => undefined) }), ) } @@ -330,7 +336,9 @@ const createPlatform = (): Platform => { clearCache: async () => { await disk.clear() - await getCurrentWebview().clearAllBrowsingData() + await getCurrentWebview() + .clearAllBrowsingData() + .catch(() => undefined) await reboot() }, From 87440c39e6c1f25239e41dcab6f1455a07cdd10f Mon Sep 17 00:00:00 2001 From: neriousy Date: Thu, 12 Mar 2026 21:59:48 +0100 Subject: [PATCH 4/4] fix: flush --- packages/desktop/src/index.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/desktop/src/index.tsx b/packages/desktop/src/index.tsx index 7124e224a9e..a2e9da93860 100644 --- a/packages/desktop/src/index.tsx +++ b/packages/desktop/src/index.tsx @@ -152,6 +152,15 @@ const createPlatform = (): Platform => { let timer: ReturnType | undefined let flushing: Promise | undefined + const settle = async () => { + if (timer) { + clearTimeout(timer) + timer = undefined + } + + await flushing?.catch(() => undefined) + } + const flush = async () => { if (flushing) return flushing @@ -203,6 +212,7 @@ const createPlatform = (): Platform => { schedule() }, clear: async () => { + await settle() pending.clear() const store = await getStore(name) await store.clear().catch(() => undefined)