From 1c84556600f84aca4903966b3da3a25bdc9fc3f9 Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Sun, 28 Jun 2026 11:27:39 -0400 Subject: [PATCH] docs(bugs): mark N98/N99 FIXED Co-Authored-By: Claude Opus 4.8 --- LOTUS_BUGS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LOTUS_BUGS.md b/LOTUS_BUGS.md index 023bb9c96..c115c09f4 100644 --- a/LOTUS_BUGS.md +++ b/LOTUS_BUGS.md @@ -691,7 +691,7 @@ This document tracks identified bugs, edge cases, and architectural discrepancie **N98 — Normal logout (`logoutClient` / `handleLogout`) calls `window.localStorage.clear()`, permanently wiping user preferences and unsent drafts** - **File:** `src/client/initMatrix.ts`, line 78 (`logoutClient`); `src/app/pages/client/ClientRoot.tsx`, line 133 (`handleLogout` inside `useLogoutListener`) -- **Status:** **OPEN** [Claude_Found] +- **Status:** **FIXED** (`34997bcb`) — logoutClient/handleLogout use removeFallbackSession() (4 session keys only); window.localStorage.clear() reserved for clearLoginData(). - **Issue:** Both logout code paths call `window.localStorage.clear()`, which removes **every key** for the origin — not just the session credentials. Keys destroyed on every normal logout include: - `settings` — theme, notification preferences, keyboard shortcuts (`pttKey`, `deafenKey`), toolbar configuration, noise-suppression mode, accessibility settings, and all other `Settings` interface fields - `draft-msg-{roomId}` (one key per room) — unsent composer drafts for every room the user had open at logout time @@ -713,7 +713,7 @@ This document tracks identified bugs, edge cases, and architectural discrepancie **N99 — `useSyncState` callback in `ClientRoot.tsx` only handles `PREPARED`; a sync `ERROR` before first sync completion freezes the app on the loading screen with contradictory UI** - **File:** `src/app/pages/client/ClientRoot.tsx`, lines 179–186; `src/app/hooks/useSyncState.ts`, lines 1–14 -- **Status:** **OPEN** [Claude_Found] +- **Status:** **FIXED** (`34997bcb`) — useSyncState handles ERROR/STOPPED before first PREPARED → error splash + Retry (startMatrix); guarded by hasPreparedRef so post-PREPARED transients stay with SyncStatus. - **Issue:** The `useSyncState` callback in `ClientRoot` only calls `setLoading(false)` for `state === 'PREPARED'`. The Matrix JS SDK can emit `SyncState.Error` before ever reaching `PREPARED` — for example when the device is offline at startup, the homeserver is unreachable, or the first `/sync` request returns a non-retryable server error. When this happens: 1. `loading` remains `true` (never set to `false`) 2. `` renders indefinitely, showing the "Heating up" spinner