Skip to content

fix(web): a maximized right panel stays maximized when you return to its thread - #17327

Merged
Yash-Singh1 merged 1 commit into
pingdotgg:mainfrom
jamesvillarrubia:fix/preview-thread-reappears
Oct 10, 2026
Merged

Yash-Singh1 merged 1 commit into
pingdotgg:mainfrom
jamesvillarrubia:fix/preview-thread-reappears

Conversation

@jamesvillarrubia

@jamesvillarrubia jamesvillarrubia commented Oct 8, 2026 •

Copy link
Copy Markdown
Contributor

Problem

When you maximize the right panel to use a thread as a full-window preview, the chat column comes back after you visit Settings or open another thread. Fixes #17326.

ChatView kept the maximize flag in component state holding one thread key, so a ChatView remount, or maximizing a different thread's panel, dropped it.

Change

The flag moves into rightPanelStore as an optional maximized field on each thread's panel state, beside the open, tab, and active-tab state the store already saves per thread. ChatView reads it from the store.

  • Closing the panel with its close button still clears the flag, as before.
  • setMaximized goes through the store's automatic-update path, so maximizing does not count as a manual panel choice and does not block proactive diff or PR panels. The old component state did not either.
  • Saved state from before this change has no maximized field and loads unchanged, so the storage version stays at 14. The migration keeps the field for any future version bump.

Scope and approval

Small, focused fix for an obvious bug: the panel drops a layout the user chose while the user does nothing to the panel. Bug report: #17326.

Discussion #16893 asks for the flag to survive an explicit close. This PR leaves close behavior alone.

#16434 and #14881 also edit toggleRightPanelMaximized. Whichever lands second needs a small rebase.

Verification

  • vp test run apps/web/src/rightPanelStore.test.ts: 82 passed. Two new tests check that each thread keeps its own flag without bumping the manual-choice revision, and that migration keeps a saved maximized: true. Both failed before the change (setMaximized is not a function; migrated flag undefined).
  • apps/web typecheck passes. Lint reports no warnings on the changed lines.
  • Desktop dev build with sample data, before and after, for two paths: Settings and back, and another thread and back.
Before After
Before: chat column is back After: still maximized

Before (main):

t3code-maximize-before.mp4

After (this branch):

t3code-maximize-after.mp4

Not checked: mobile, which has no maximize control; the hosted web app, which runs the same web code.

Claude Opus 5.5 in Claude Code, run from T3 Code.

🤖 Generated with Claude Code

…to its thread

ChatView kept the maximize flag in local state holding one thread key, so
maximizing another thread's panel, leaving the thread routes, or reloading
dropped it. The flag now lives in the per-thread right panel store.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:S 10-29 changed lines (additions + deletions). labels Oct 8, 2026
@coderabbitai

coderabbitai Bot commented Oct 8, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Path: .coderabbit.config.ts
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 2d211871-1bf5-4a96-9e51-4fa9fc49afc0
📥 Commits

Reviewing files that changed from the base of the PR and between 7b57b72 and 4329f7f.

📒 Files selected for processing (3)
  • apps/web/src/components/ChatView.tsx
  • apps/web/src/rightPanelStore.test.ts
  • apps/web/src/rightPanelStore.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 9 remain after this review.


📝 Walkthrough

Walkthrough

Right-panel maximization is now stored in the right-panel store per thread. ChatView reads and updates the active thread’s maximization state. Closing the panel clears that state.

Changes

Per-thread right-panel maximization

Layer / File(s) Summary
Store maximization per thread
apps/web/src/rightPanelStore.ts, apps/web/src/rightPanelStore.test.ts
The store adds an optional maximized flag and a setter that updates it without changing surfaces or the user-action revision. Migration preserves the flag only when its value is exactly true. Tests cover state isolation between threads and migration.
Use thread-scoped panel state
apps/web/src/components/ChatView.tsx
ChatView reads maximization from the active thread’s stored state. The maximize toggle updates that state, and closing the panel clears it.

Priority: ⬇️ Low

Estimated code review effort: 2 (Simple) | ~10 minutes

Change: Bug fix · Severity of issue fixed: Low

Suggested reviewers: juliusmarminge

Merge Risk: ⚪ Minimal · up to 4329f

Maximization is retained per thread, and the reviewed paths show no concrete remaining regression. The change is ready to merge subject to normal checks.

Security Architecture Review

Security architecture risk: 🔵 Low · up to 4329f

The change persists a layout preference without adding permissions or changing which resources a panel can access. Existing saved state remains compatible. Remaining uncertainty concerns cleanup and interrupted layout updates, rather than a demonstrated security exposure.

Retained concerns
No architecture-level concerns identified.

Security review details

Security Blast Radius

  • inferred — The changed preference is retained in the browser's existing right-panel storage and addressed per environment and thread. The inspected change does not enlarge service authority or introduce a new resource-access sink.

Trust Boundaries and Controls

  • inferred — A persisted maximized value influences layout rather than granting access: ChatView requires exact true and an already-open eligible panel, while the setter does not create or replace surfaces. Migration's exact-true check is layout normalization, not an authorization control.
🚥 Pre-merge checks | ✅ 4
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed For #17326, the change stores maximized in rightPanelStore per thread and makes ChatView read that value. This preserves the maximized layout across route remounts and thread changes. `setMaximi…
Out of Scope Changes check ✅ Passed The changed files are ChatView.tsx, rightPanelStore.ts, and rightPanelStore.test.ts. The implementation, migration handling, and tests directly support #17326. No unrelated product behavior or u…
Description check ✅ Passed The description is complete and follows the repository template. It explains the problem, the store-based fix, scope and approval rationale, focused test results, manual verification, screenshots, rec…
Title check ✅ Passed The title clearly and concisely describes the primary fix: preserving a maximized right panel when returning to its thread.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@Yash-Singh1
Yash-Singh1 merged commit 71f6f1d into pingdotgg:main Oct 10, 2026
31 checks passed
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Oct 10, 2026
## What's Changed
* fix(web): align compact button touch targets by @Yash-Singh1 in pingdotgg/t3code#17748
* fix(server): t3_thread_launch refuses a new worktree whose base ref has no commit by @tris203 in pingdotgg/t3code#17791
* fix(web): omit underlines on markdown image links by @Saikrishna1876 in pingdotgg/t3code#17728
* fix(server): restore auto resume for wrapped Claude gateway rate limits by @tzachbon in pingdotgg/t3code#17778
* fix(opencode): name OpenCode 2 sessions after their thread by @nkoynov in pingdotgg/t3code#17414
* fix(web): find update settings from the command palette by @sergical in pingdotgg/t3code#17396
* fix(provider-opencode): tell OpenCode Zen and Go models apart by @mr-karan in pingdotgg/t3code#17424
* fix(server): a pull that fast-forwards no longer fails on large Git output by @ScottN-PV in pingdotgg/t3code#17376
* fix(web): cancel question auto-advance after navigation by @maxwellyoung in pingdotgg/t3code#17364
* fix(server): a bare repository name resolves to the signed-in account again by @ScottN-PV in pingdotgg/t3code#17379
* fix(web): a maximized right panel stays maximized when you return to its thread by @jamesvillarrubia in pingdotgg/t3code#17327
* fix(mobile): allow starting a task with only an image by @Claudesaul in pingdotgg/t3code#17409
* fix(server): PR watch no longer reports passed while a second run of a check is still going by @ScottN-PV in pingdotgg/t3code#17344
* fix(server): say why a thread can't be settled by @DylanTX in pingdotgg/t3code#17258
* fix(server): prevent busy terminals from starving history persistence by @StiensWout in pingdotgg/t3code#17181
* feat(server): use macOS .icns app icons as project icons by @psv2522 in pingdotgg/t3code#17149
* fix(mobile): usage reset icon lines up with its row by @Aforno in pingdotgg/t3code#17175
* fix(web): paths pasted after @ keep their underscores by @derektrimm in pingdotgg/t3code#16619
* fix(server): settle every OpenCode subagent call one report answers by @nkoynov in pingdotgg/t3code#17134
* perf(web): switching project keeps Diagnostics and Providers mounted by @flamboh in pingdotgg/t3code#17122
* perf(web): Open Source Licenses downloads its manifest once per session by @flamboh in pingdotgg/t3code#17119
* fix(server): restore OpenCode adapter test typecheck by @Yash-Singh1 in pingdotgg/t3code#17810
* fix(server): Claude subagents show the reasoning effort they run at by @RakshithBhat03 in pingdotgg/t3code#17496

## New Contributors
* @tzachbon made their first contribution in pingdotgg/t3code#17778
* @sergical made their first contribution in pingdotgg/t3code#17396
* @mr-karan made their first contribution in pingdotgg/t3code#17424
* @Claudesaul made their first contribution in pingdotgg/t3code#17409
* @DylanTX made their first contribution in pingdotgg/t3code#17258
* @psv2522 made their first contribution in pingdotgg/t3code#17149

**Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261010.2922...v0.0.46-nightly.20261010.2935

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261010.2935
github-actions Bot added a commit to davidvanderklay/t3code-flake that referenced this pull request Oct 10, 2026
## What's Changed
* fix(web): align compact button touch targets by @Yash-Singh1 in pingdotgg/t3code#17748
* fix(server): t3_thread_launch refuses a new worktree whose base ref has no commit by @tris203 in pingdotgg/t3code#17791
* fix(web): omit underlines on markdown image links by @Saikrishna1876 in pingdotgg/t3code#17728
* fix(server): restore auto resume for wrapped Claude gateway rate limits by @tzachbon in pingdotgg/t3code#17778
* fix(opencode): name OpenCode 2 sessions after their thread by @nkoynov in pingdotgg/t3code#17414
* fix(web): find update settings from the command palette by @sergical in pingdotgg/t3code#17396
* fix(provider-opencode): tell OpenCode Zen and Go models apart by @mr-karan in pingdotgg/t3code#17424
* fix(server): a pull that fast-forwards no longer fails on large Git output by @ScottN-PV in pingdotgg/t3code#17376
* fix(web): cancel question auto-advance after navigation by @maxwellyoung in pingdotgg/t3code#17364
* fix(server): a bare repository name resolves to the signed-in account again by @ScottN-PV in pingdotgg/t3code#17379
* fix(web): a maximized right panel stays maximized when you return to its thread by @jamesvillarrubia in pingdotgg/t3code#17327
* fix(mobile): allow starting a task with only an image by @Claudesaul in pingdotgg/t3code#17409
* fix(server): PR watch no longer reports passed while a second run of a check is still going by @ScottN-PV in pingdotgg/t3code#17344
* fix(server): say why a thread can't be settled by @DylanTX in pingdotgg/t3code#17258
* fix(server): prevent busy terminals from starving history persistence by @StiensWout in pingdotgg/t3code#17181
* feat(server): use macOS .icns app icons as project icons by @psv2522 in pingdotgg/t3code#17149
* fix(mobile): usage reset icon lines up with its row by @Aforno in pingdotgg/t3code#17175
* fix(web): paths pasted after @ keep their underscores by @derektrimm in pingdotgg/t3code#16619
* fix(server): settle every OpenCode subagent call one report answers by @nkoynov in pingdotgg/t3code#17134
* perf(web): switching project keeps Diagnostics and Providers mounted by @flamboh in pingdotgg/t3code#17122
* perf(web): Open Source Licenses downloads its manifest once per session by @flamboh in pingdotgg/t3code#17119
* fix(server): restore OpenCode adapter test typecheck by @Yash-Singh1 in pingdotgg/t3code#17810
* fix(server): Claude subagents show the reasoning effort they run at by @RakshithBhat03 in pingdotgg/t3code#17496

## New Contributors
* @tzachbon made their first contribution in pingdotgg/t3code#17778
* @sergical made their first contribution in pingdotgg/t3code#17396
* @mr-karan made their first contribution in pingdotgg/t3code#17424
* @Claudesaul made their first contribution in pingdotgg/t3code#17409
* @DylanTX made their first contribution in pingdotgg/t3code#17258
* @psv2522 made their first contribution in pingdotgg/t3code#17149

**Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261010.2922...v0.0.46-nightly.20261010.2935

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261010.2935
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:S 10-29 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: A maximized right panel comes back un-maximized after visiting Settings or another thread

2 participants