From a7315d99a2924e0b974207b0310b918e188b9b62 Mon Sep 17 00:00:00 2001 From: Alexander Harding Date: Thu, 30 Jan 2025 21:09:06 -0600 Subject: [PATCH] fix: auto refresh app on db crash (#1829) --- src/core/listeners/db.ts | 47 ++++++++++++++++++++++++++++++++++++ src/core/listeners/index.tsx | 1 + 2 files changed, 48 insertions(+) create mode 100644 src/core/listeners/db.ts diff --git a/src/core/listeners/db.ts b/src/core/listeners/db.ts new file mode 100644 index 0000000000..3f4d4ee84f --- /dev/null +++ b/src/core/listeners/db.ts @@ -0,0 +1,47 @@ +import { App } from "@capacitor/app"; +import Dexie from "dexie"; + +import { isAppleDeviceInstallable, isNative } from "#/helpers/device"; + +const DB_CLOSED_STORAGE_KEY = "db-closed"; + +/** + * https://github.com/ionic-team/cordova-plugin-ionic-webview/issues/354#issuecomment-1305878417 + */ +if (isNative() && isAppleDeviceInstallable()) { + App.addListener("appStateChange", async (state) => { + const dbLastClosed = +(localStorage.getItem(DB_CLOSED_STORAGE_KEY) || 0); + const thirtySecondsAgo = Date.now() - 30_000; + + const reloadedRecently = dbLastClosed > thirtySecondsAgo; + + if (!state.isActive) return; + if (reloadedRecently) return; + + console.info("Checking database integrity..."); + + // Fix connection Storage sometime lost (iOS) + try { + await Dexie.exists("WefwefDB"); + } catch (error) { + if (!(error instanceof Error)) throw error; + if (error.name !== "UnknownError") throw error; + if ( + !error.message.includes( + "Connection to Indexed Database server lost. Refresh the page to try again", + ) + ) + throw error; + + console.info("Failed database integrity check!", error); + + localStorage.setItem(DB_CLOSED_STORAGE_KEY, Date.now().toString()); + + window.location.reload(); + + throw error; + } + + console.info("Passed database integrity check!"); + }); +} diff --git a/src/core/listeners/index.tsx b/src/core/listeners/index.tsx index f8142fd461..47476aa2a3 100644 --- a/src/core/listeners/index.tsx +++ b/src/core/listeners/index.tsx @@ -7,6 +7,7 @@ import HapticsListener from "./HapticsListener"; // Listeners import "./androidSafeArea"; +import "./db"; import "./ionActivatable"; import "./network/listener"; import "./statusTap";