fix(mobile): show connection status in the floating pill instead of a second one - #10440
Conversation
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This is a focused mobile UI fix that removes the duplicate connection pill and displays the existing connection states in the established floating control, with reconnect behavior preserved and mapping tests added. Its animation and sizing changes are localized to that control and do not affect data, schemas, infrastructure, or sensitive functionality. You can add or adjust custom eligibility rules. Learn more. |
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
The composer rendered its own reconnecting/offline pill that swapped with the working pill when the connection dropped. Fold the connection phase into the single floating status pill so the label swaps in place and the capsule animates between widths. Co-Authored-By: Claude Code <noreply@anthropic.com>
Co-Authored-By: Claude Code <noreply@anthropic.com>
Co-Authored-By: Claude Code <noreply@anthropic.com>
…rement Co-Authored-By: Claude Code <noreply@anthropic.com>
The native glass view only takes a size from a real layout pass, so driving its width from an animated style left the material stuck at its mounted size: the pill rendered as a bare label with a stray circle behind it until the first label swap forced a re-layout. An in-flow sizer now carries the animated width and the glass capsule takes its size from that. Co-Authored-By: Claude Code <noreply@anthropic.com>
Moves the phase-to-pill mapping into a pure module so it can be tested without standing up the native view stack, and covers each connection phase and the reconnect handler. Co-Authored-By: Claude Code <noreply@anthropic.com>
d311a91 to
a300584
Compare
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Team Run ID: 📒 Files selected for processing (5)
Included review availability: 9 reviews are currently available. Your included PR review attempts over the past 7 days set your current allowance at 10 reviews per hour. 📝 WalkthroughWalkthroughThe mobile thread UI moves connection status from ChangesThread connection status
Estimated code review effort: 4 (Complex) | ~45 minutes Merge Risk: ⚪ Minimal · up to The connection status is consolidated into the floating pill while preserving reconnect behavior and working-state presentation. Current evidence identifies no merge-blocking user or production risk. Sequence Diagram(s)sequenceDiagram
participant ThreadDetailScreen
participant connectionFloatingStatus
participant FloatingWorkingControl
participant ThreadComposer
ThreadDetailScreen->>connectionFloatingStatus: evaluate connection state
connectionFloatingStatus-->>ThreadDetailScreen: return status or null
ThreadDetailScreen->>FloatingWorkingControl: render floating status
ThreadDetailScreen->>ThreadComposer: render composer without connection props
FloatingWorkingControl->>ThreadDetailScreen: invoke reconnect handler
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Comment |
## What's Changed * fix(mobile): keep pending messages in the chat timeline by @juliusmarminge in pingdotgg/t3code#10449 * fix(mobile): show connection status in the floating pill instead of a second one by @juliusmarminge in pingdotgg/t3code#10440 * fix: use Pierre icons consistently for attachments by @juliusmarminge in pingdotgg/t3code#10475 * feat(mobile): open the thread screen as soon as a new task is submitted by @juliusmarminge in pingdotgg/t3code#10435 * fix(devcontainer): make repository setup work by @saphid in pingdotgg/t3code#7875 * fix(projects): prevent invalid script IDs from crashing threads by @saphid in pingdotgg/t3code#10019 * fix(mobile): hide changed-files navigator and restore refresh in raw diff fallback by @lnieuwenhuis in pingdotgg/t3code#9828 * fix(ios): scroll short source files from blank space by @juliusmarminge in pingdotgg/t3code#10178 * feat(mobile): start a new thread on an existing branch by @StiensWout in pingdotgg/t3code#10359 * fix(mobile): improve font-size slider performance and prevent maximum update depth errors by @bbernag in pingdotgg/t3code#7138 * fix(web): keep composer toolbar controls anchored during transitions by @juliusmarminge in pingdotgg/t3code#10478 * fix(web): resize the floating preview from any edge by @juliusmarminge in pingdotgg/t3code#10467 * fix(mobile): prevent chat from disappearing when scrolling by @juliusmarminge in pingdotgg/t3code#10479 * fix(mobile): smooth composer status pill resizing by @juliusmarminge in pingdotgg/t3code#10484 * fix(mobile): release initial scroll target after dragging by @juliusmarminge in pingdotgg/t3code#10483 * fix(mobile): animate thread lifecycle transitions consistently by @juliusmarminge in pingdotgg/t3code#10487 * fix(mobile): restore assistant message bottom padding by @juliusmarminge in pingdotgg/t3code#10491 * fix(mobile): preserve chat rows when toggling commands by @juliusmarminge in pingdotgg/t3code#10492 ## New Contributors * @bbernag made their first contribution in pingdotgg/t3code#7138 **Full Changelog**: pingdotgg/t3code@v0.0.39-nightly.20260907.1332...v0.0.40-nightly.20260907.1346 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.40-nightly.20260907.1346
## What's Changed * fix(mobile): keep pending messages in the chat timeline by @juliusmarminge in pingdotgg/t3code#10449 * fix(mobile): show connection status in the floating pill instead of a second one by @juliusmarminge in pingdotgg/t3code#10440 * fix: use Pierre icons consistently for attachments by @juliusmarminge in pingdotgg/t3code#10475 * feat(mobile): open the thread screen as soon as a new task is submitted by @juliusmarminge in pingdotgg/t3code#10435 * fix(devcontainer): make repository setup work by @saphid in pingdotgg/t3code#7875 * fix(projects): prevent invalid script IDs from crashing threads by @saphid in pingdotgg/t3code#10019 * fix(mobile): hide changed-files navigator and restore refresh in raw diff fallback by @lnieuwenhuis in pingdotgg/t3code#9828 * fix(ios): scroll short source files from blank space by @juliusmarminge in pingdotgg/t3code#10178 * feat(mobile): start a new thread on an existing branch by @StiensWout in pingdotgg/t3code#10359 * fix(mobile): improve font-size slider performance and prevent maximum update depth errors by @bbernag in pingdotgg/t3code#7138 * fix(web): keep composer toolbar controls anchored during transitions by @juliusmarminge in pingdotgg/t3code#10478 * fix(web): resize the floating preview from any edge by @juliusmarminge in pingdotgg/t3code#10467 * fix(mobile): prevent chat from disappearing when scrolling by @juliusmarminge in pingdotgg/t3code#10479 * fix(mobile): smooth composer status pill resizing by @juliusmarminge in pingdotgg/t3code#10484 * fix(mobile): release initial scroll target after dragging by @juliusmarminge in pingdotgg/t3code#10483 * fix(mobile): animate thread lifecycle transitions consistently by @juliusmarminge in pingdotgg/t3code#10487 * fix(mobile): restore assistant message bottom padding by @juliusmarminge in pingdotgg/t3code#10491 * fix(mobile): preserve chat rows when toggling commands by @juliusmarminge in pingdotgg/t3code#10492 * feat(web): group onboarding project import by repository by @t3dotgg in pingdotgg/t3code#10493 * fix(web): remove inserted citations on cancel by @extoci in pingdotgg/t3code#10518 * fix(mobile): match Working status color to desktop by @baptisteArno in pingdotgg/t3code#10515 * fix(mobile): wait for native thread scroll before reveal by @juliusmarminge in pingdotgg/t3code#10486 * fix(web): tolerate servers that predate git identity in project import by @juliusmarminge in pingdotgg/t3code#10547 * fix(web): restore settled PR colors on hover by @flamboh in pingdotgg/t3code#10023 * fix(web): keep popup triggers steady when pressed by @dominic-r in pingdotgg/t3code#10468 * fix(web): keep project favicon shape consistent across sizes by @sameerr03 in pingdotgg/t3code#10502 * fix(claude): report usage limits on retried turns by @StiensWout in pingdotgg/t3code#10549 * refactor(desktop): classify backend exports by @juliusmarminge in pingdotgg/t3code#10265 * refactor(desktop): classify electron exports by @juliusmarminge in pingdotgg/t3code#10266 * refactor(desktop): classify app exports by @juliusmarminge in pingdotgg/t3code#10267 * refactor(desktop): classify preview exports by @juliusmarminge in pingdotgg/t3code#10268 * ci(knip): enforce desktop exports by @juliusmarminge in pingdotgg/t3code#10269 * fix(web): remove excess sidebar thread spacing by @maria-rcks in pingdotgg/t3code#10569 * fix(web): make settings project scopes searchable and scrollable by @maria-rcks in pingdotgg/t3code#10570 * fix(web): use `tabular-nums` with the ui font for sidebar timer by @extoci in pingdotgg/t3code#10592 * fix(web): correct pending question attachment message by @dominic-r in pingdotgg/t3code#10599 * fix(mobile): restore brand artwork in the Android adaptive icon by @juliusmarminge in pingdotgg/t3code#10598 * fix(mobile): configure iOS Keychain access group by @VedankPurohit in pingdotgg/t3code#3665 * fix(web): remember Composer Fast mode across new chats by @aravhawk in pingdotgg/t3code#2981 * fix(server): disable executable capabilities in Claude metadata generation by @maxwellyoung in pingdotgg/t3code#4169 * Add stop thread keybinding command by @jakeleventhal in pingdotgg/t3code#4308 ## New Contributors * @bbernag made their first contribution in pingdotgg/t3code#7138 * @baptisteArno made their first contribution in pingdotgg/t3code#10515 * @aravhawk made their first contribution in pingdotgg/t3code#2981 **Full Changelog**: pingdotgg/t3code@v0.0.39...v0.0.40 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.40
Problem
While an environment is disconnected, mobile shows the connection state in its own
pill anchored above the composer, and the floating working pill hides itself
entirely (
connectionStateLabel !== "connected"returnednull). So a droppedconnection mid-turn swapped a centered glass pill for a differently-styled,
left-aligned one in a different place, dropped the working timer, and covered the
last feed row. The feed also shifted, because the floating control stops reserving
its space.
What changed
One pill.
connectionFloatingStatusmaps the connection phase into the floatingpill's status, so connection, syncing, compacting, and working all swap labels in
place inside the same capsule. The composer's
ComposerConnectionStatusPillandits
connectionError/onReconnectEnvironmentprops are gone.Making one capsule change width needed three fixes:
out from that edge slid with it. Labels are now absolute children centered by
the capsule, and an in-flow sizer animates to the measured label width.
GlassViewonly takes a size from a real layout pass, so an animatedwidth set on it left the material stuck at its mounted size — the pill rendered
as a bare label with a stray circle behind it until the first label swap forced
a re-layout. The sizer drives the width so the glass gets a genuine layout.
rows now occupy the same centered spot.
Before / after
Same thread, same environment, same scroll and viewport, connection cut at the
same point by killing a TCP proxy in front of the server. iOS 26 simulator, dark.
Before (main) — working pill disappears, a left-aligned pill takes over lower
down and covers "Thinking", and the feed shifts:
https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d63e91c34a63230b/pr-clip-before.mp4
After — one capsule resizes in place through
working → failed to connect → syncing → working:
https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/72200c880a081030/pr-clip-after.mp4
The glass regression caught during review of my own recordings, before (stuck
capsule showing through as a circle) and after:
Verification
vp test run apps/mobile/src/features/threads/floating-working-status.test.ts—5 passing, covering every connection phase, the missing-label fallback, and the
reconnect handler. The mapping moved to a pure module so it is testable without
the native view stack.
404 px to 907 px, its center held at 662.5–663 px on every frame.
returns, and with the scroll-to-end button both merged and separated.
tsgoreports 63 pre-existingnavigation-typing errors on
maintoo; the repo'stypecheckscript usestsc.)Limits
Verified on the iOS 26 simulator, where the native liquid-glass path runs. The
non-glass fallback branch got the same layout treatment but was not exercised on
a device.
Opus 5 via Claude Code.
Notes for review
Precedence with pending approvals. The floating pill used to be suppressed
whenever an approval or user-input card was up, and it now returns the connection
status first, so it renders in that state too. That is not new information on
screen: the composer pill it replaces had no such suppression, so a disconnected
environment with a pending approval already showed a pill. It is the same single
pill, just in the floating control's position now.
Why the UI paths are not unit-tested. Every existing test under
apps/mobile/srccovers pure modules, and the repo guidance is explicit about notrendering components to assert props or attributes. The animation and glass work
here is only meaningful against real UIKit — the stuck-glass bug in particular was
invisible to anything but a device, since it came from the native view taking its
size from a layout pass. So the mapping is unit-tested and the rendering is
covered by the simulator captures above, including a frame-by-frame measurement of
the capsule's center through a resize.