From 50793e4e5d4790ea9aec71ced38715e83f49b0b6 Mon Sep 17 00:00:00 2001 From: Eduard Wisch Date: Tue, 19 May 2026 22:47:32 +0200 Subject: [PATCH] App-Lifecycle: Back-Button, Resume letzte Position, sicheres Speichern MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Resume: jede Navigation wird gemerkt; nach App-Neustart (oder wenn Android den Prozess beim App-Wechsel beendet hat) öffnet die App wieder genau dort, wo der Benutzer war — inklusive offenem Protokoll - Protokoll wird beim Verlassen der Seite (Back-Tap/Navigation) und beim Wechsel in den Hintergrund automatisch gesichert — auch Eingaben, die noch nicht per onblur gespeichert wurden, gehen nicht mehr verloren - Hardware-Backbutton schließt einen offenen Werkzeug-Dialog, statt gleich die Seite zu verlassen (neue Overlay-Registry overlay.svelte.ts) - backButton.svelte.ts: PluginListenerHandle korrekt aus @capacitor/core importiert (war fälschlich @capacitor/app — Svelte-Check-Fehler behoben) Co-Authored-By: Claude Opus 4.7 (1M context) --- src/lib/backButton.svelte.ts | 4 ++-- src/lib/overlay.svelte.ts | 32 ++++++++++++++++++++++++++ src/routes/+layout.svelte | 29 +++++++++++++++++++++-- src/routes/protokoll/[id]/+page.svelte | 29 +++++++++++++++++++++-- 4 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 src/lib/overlay.svelte.ts diff --git a/src/lib/backButton.svelte.ts b/src/lib/backButton.svelte.ts index 6400709..06a6395 100644 --- a/src/lib/backButton.svelte.ts +++ b/src/lib/backButton.svelte.ts @@ -11,8 +11,8 @@ * 3. Auf der Hauptroute: 1. Tap = Hinweis, 2. Tap binnen 1,8 s = App beenden */ -import { App, type PluginListenerHandle } from '@capacitor/app'; -import { Capacitor } from '@capacitor/core'; +import { App } from '@capacitor/app'; +import { Capacitor, type PluginListenerHandle } from '@capacitor/core'; interface BackConfig { /** Schließt einen offenen Overlay-Zustand. true = verarbeitet, nichts weiter tun. */ diff --git a/src/lib/overlay.svelte.ts b/src/lib/overlay.svelte.ts new file mode 100644 index 0000000..6dfa446 --- /dev/null +++ b/src/lib/overlay.svelte.ts @@ -0,0 +1,32 @@ +/** + * Registry offener Overlays (Dialoge, Sheets, Bottom-Sheets). + * + * Damit der Hardware-Backbutton zuerst ein offenes Overlay schließt, statt + * gleich die Seite zu verlassen, meldet jedes Overlay beim Öffnen einen + * Schließen-Callback an. Der Backbutton-Handler (backButton.svelte.ts) ruft + * `closeTopOverlay()` und navigiert nur, wenn kein Overlay offen war. + * + * Modul-Scope, kein Svelte-State — Mehrfachregistrierung ist sicher. + */ + +const closers: Array<() => void> = []; + +/** + * Overlay anmelden, solange es geöffnet ist. + * Gibt die Abmeldefunktion zurück (im Svelte-$effect-Cleanup aufrufen). + */ +export function pushOverlay(close: () => void): () => void { + closers.push(close); + return () => { + const i = closers.lastIndexOf(close); + if (i >= 0) closers.splice(i, 1); + }; +} + +/** Oberstes Overlay schließen. Liefert true, wenn es eines zu schließen gab. */ +export function closeTopOverlay(): boolean { + const close = closers.pop(); + if (!close) return false; + close(); + return true; +} diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 120e3f0..40a4773 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -1,13 +1,15 @@