fix(#324): Mail-Kategorisierung ehrliche Background-Pause #333

Merged
admin-mrrm merged 1 commit from fix/324-kategorisierung-background into main 2026-05-18 17:32:43 +02:00
Owner

Closes #324.

Was

Mobile-only Fix. useCategorizeFolder bekommt einen AppState-Listener: sobald die App in background/inactive wechselt während eine Kategorisierung läuft, wird cancelRef.current=true gesetzt und der neue State-Flag pausedByBackground aktiviert. folders.tsx rendert dann ein oranges Banner: "Pausiert — App war im Hintergrund. Bitte erneut starten."

Warum nicht echtes Background-Processing

Option A aus dem Issue (Background-Task via expo-background-task) ist iOS-restricted und deutlich größerer Scope. Option C (serverseitige Pipeline) ist ein eigener Epic. Diese Änderung wählt bewusst die kleine ehrliche Variante (B): UI lügt nicht mehr.

Tests

  • Neuer pure Helper shouldPauseOnAppState(nextState, isRunning) mit 5 Tests (categorize-app-state.spec.ts). Vitest läuft im node-env ohne RN-Runtime → keine Hook-Test-Infra nötig.
  • Bestehende mail-batch-categorizer.spec.ts weiter grün.
  • pnpm typecheck clean.

Test plan (manual)

  • Mobile-Build laden, Mail-Inbox öffnen, Kategorisieren drücken
  • Während Lauf in andere App wechseln, ~10s warten, zurück
  • Erwartung: oranges Banner "Pausiert — App war im Hintergrund. Bitte erneut starten.", Spinner weg, Button wieder klickbar
Closes #324. ## Was Mobile-only Fix. `useCategorizeFolder` bekommt einen `AppState`-Listener: sobald die App in `background`/`inactive` wechselt während eine Kategorisierung läuft, wird `cancelRef.current=true` gesetzt und der neue State-Flag `pausedByBackground` aktiviert. `folders.tsx` rendert dann ein oranges Banner: _"Pausiert — App war im Hintergrund. Bitte erneut starten."_ ## Warum nicht echtes Background-Processing Option A aus dem Issue (Background-Task via `expo-background-task`) ist iOS-restricted und deutlich größerer Scope. Option C (serverseitige Pipeline) ist ein eigener Epic. Diese Änderung wählt bewusst die kleine ehrliche Variante (B): UI lügt nicht mehr. ## Tests - Neuer pure Helper `shouldPauseOnAppState(nextState, isRunning)` mit 5 Tests (`categorize-app-state.spec.ts`). Vitest läuft im node-env ohne RN-Runtime → keine Hook-Test-Infra nötig. - Bestehende `mail-batch-categorizer.spec.ts` weiter grün. - `pnpm typecheck` clean. ## Test plan (manual) - [ ] Mobile-Build laden, Mail-Inbox öffnen, Kategorisieren drücken - [ ] Während Lauf in andere App wechseln, ~10s warten, zurück - [ ] Erwartung: oranges Banner _"Pausiert — App war im Hintergrund. Bitte erneut starten."_, Spinner weg, Button wieder klickbar
fix(#324): Mail-Kategorisierung pausiert ehrlich bei App-Background
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/pr Build is passing
ec09117a00
Vorher: Beim App-Wechsel in den Background hängte die while-Loop
in mail-batch-categorizer.ts an pending IMAP/LLM-Promises, der
Date.now-Timer in der UI lief aber weiter und zeigte nur "möglich-
erweise aufgehängt" — irreführend.

Jetzt: AppState-Listener im useCategorizeFolder-Hook setzt
cancelRef.current=true sobald die App in background/inactive
geht. Neuer State-Flag pausedByBackground wird in folders.tsx
als oranges Banner gerendert: "Pausiert — App war im Hintergrund.
Bitte erneut starten."

shouldPauseOnAppState als pure helper extrahiert + getestet
(vitest läuft im node-env, keine RN-Runtime).
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
admin-mrrm/mrrmlabapp!333
No description provided.