Conversation
- tick(): always return true when a large-gap jump changes state (changed flag) - update_target(): clamp display pointers when new text is shorter to prevent panic in fill_display_buffer - update_target(): fix String::reserve wrong-base bug (compare capacity, reserve len deficit) - new(): capture Instant::now() once and reuse for last_update_time and animation_start_time - is_complete(): add doc comment explaining why Msc4357Live always returns false
- Suppress edited indicator for actively-streaming messages to avoid misleading UI while text is still being updated - Re-request NextFrame in restore_state when streaming_messages is non-empty so the animation loop resumes after room switch - Verified streaming_messages.clear() on timeline clear is already present
…tch_up_to_wall_clock)
- Clamp changed_indices to prevent infinite iteration on usize::MAX sentinel - Preserve visible prefix when entering streaming mode (no replay from start) - Make typing latch bidirectional so transient drops don't cause early completion - Only request NextFrame when streams have unrevealed characters - Cache timeline indices to avoid O(streams*items) per-frame scan - Use Timer for idle timeout instead of per-frame polling - Time-based animation (chars_per_second) for frame-rate independence - Simplify test names and remove duplicate tests
Reset runtime state and return to the login loop when session tokens expire, and remove persisted Matrix stores alongside stale session files.
Make the login form use a narrower centered layout and remove the extra outer login panel background so the desktop presentation matches the mobile-style card better.
Keep the login screen layout intact while replacing the extra outer login panel with a plain view so the screen no longer draws a separate card container.
Fix session restore and in-app signup flow
Replace prefix-match + recency + not-self heuristic with deterministic MSC4357 `org.matrix.msc4357.live` field detection. This simplifies the detection path and makes streaming animation reliable for any compliant server. Key changes: - StreamingAnimState: replace sender_user_id/detection/sender_stopped_typing with is_live bool; add restore() for timeline reset preservation - room_screen: add is_msc4357_live() helper, streaming_scan_range() for bounded detection, remove heuristic detection and typing-latch logic - sliding_sync: simplify TypingUsers back to Vec<String> - Split timeouts: 30s for finished streams, 5min for live streams
…romptly Bug 1: streaming_scan_range reused clamp_indices which clamped end to min(old_len, new_len), making PushBack/Append (changed_indices=old_len..new_len) produce an empty range. New live messages were never detected. Fix: clamp directly to new_len so appended items are scanned. Bug 2: when the final live=false update arrived with text already fully revealed, needs_frame()=false meant no NextFrame was scheduled, so the completed state lingered with cursor until timeout. Fix: also schedule a frame when is_complete() becomes true.
Merge related test cases to reduce duplication: - 2 restore tests → 1 (test_restore_preserves_common_prefix) - 2 timeout tests → 1 (test_timeout_split_by_live_state) - 4 scan_range tests → 1 (test_streaming_scan_range) - Remove test_needs_frame_when_caught_up (covered by test_is_complete_msc4357) 85 → 79 tests, same coverage.
- add desktop avatar file picker upload flow in account settings\n- add MatrixRequest::UploadAvatar worker path with PNG/JPEG validation\n- add fallback delete-avatar request for homeservers returning M_UNRECOGNIZED\n- show not-supported notices for avatar actions on mobile platforms
- add English and Simplified Chinese translation resources - introduce i18n module and wire AppLanguage-driven text updates - replace hardcoded UI strings in home/login/settings/room/tsp flows
feat(settings): support avatar upload and robust avatar deletion
…ions Refine room input bar quick actions and emoji picker UX
…ter-fallback fix(search): support exact MXID people search and fallback to full list on empty local results
# Conflicts: # src/room/room_input_bar.rs
Improve app service bot targeting and in-room action feedback
Support multiple Matrix accounts simultaneous Issue 374
# Conflicts: # src/app.rs # src/home/room_screen.rs # src/home/spaces_bar.rs # src/login/login_screen.rs # src/room/room_input_bar.rs # src/settings/account_settings.rs
- Extract duplicated point-of-no-return blocks into enter_point_of_no_return() - Fix missed sender.send().unwrap() on MessageEdited path - Reset display_filter, sort_fn, and drawn_previously on logout - Drain PENDING_ROOM_UPDATES and PENDING_SPACE_UPDATES in ClearAppState handlers
feat(i18n): Support i18n
# Conflicts: # src/home/room_screen.rs
Resolve import conflict in spaces_bar.rs: keep both LogoutAction (from this branch) and AppState/i18n imports (from main).
Add room threads pane and thread pagination support
…n-logout fix: skip app state restore after explicit logout
Dock.load_state() destroys DrawList2d objects by clearing tab_bars during event handling, but the rendering pipeline still holds stale DrawListId references from the previous frame. This causes massive "Drawlist id generation wrong" errors and a completely blank main content area. Replace dock.load_state() in load_dock_state_from() with programmatic tab recreation via close_all_tabs() + focus_or_create_tab(), which uses the Dock's normal widget API and avoids direct DrawList destruction. Fixes #45 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…drawlist-corruption Fix blank main page caused by Dock.load_state() DrawList corruption
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 784af95d45
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
|
||
| SYNC_SERVICE.lock().unwrap().replace(Arc::new(sync_service)); | ||
|
|
||
| let (login_sender, _login_receiver) = tokio::sync::mpsc::channel(1); |
There was a problem hiding this comment.
Keep login receiver alive when rebuilding worker after switch
During account switch restart, this creates login_sender but immediately drops its paired receiver (_login_receiver). That leaves no consumer for forwarded non-add-account login requests and also breaks the outer login loop’s channel assumptions once the switched session ends, so post-switch logout/reauth flows can no longer reliably process new login requests without restarting the app.
Useful? React with 👍 / 👎.
| @@ -4062,7 +5469,7 @@ async fn spawn_sso_server( | |||
| }) { | |||
| Ok(identity_provider_res) => { | |||
| if !is_logged_in { | |||
| if let Err(e) = login_sender.send(LoginRequest::LoginBySSOSuccess(client, client_session)).await { | |||
| if let Err(e) = login_sender.send(LoginRequest::LoginBySSOSuccess(client, client_session, false)).await { | |||
There was a problem hiding this comment.
Mark SSO success as add-account during add-account flow
SSO completion is always emitted as LoginBySSOSuccess(..., false), so when the user is in add-account mode the backend treats the SSO result as a primary login instead of an add-account login. Because matrix_worker_task branches on that flag, SSO-based add-account attempts are routed down the wrong path and do not complete as an account-add operation.
Useful? React with 👍 / 👎.
No description provided.