Move mobile working timer into the thread timeline#4285
Conversation
- Render active work duration as a timeline row - Animate the composer connection status above the composer - Add coverage for active work feed presentation
| return ( | ||
| <View className="items-center pb-2"> | ||
| <Animated.View | ||
| className="absolute inset-x-0 bottom-full items-center pb-2" |
There was a problem hiding this comment.
🟡 Medium threads/ThreadComposer.tsx:242
ComposerConnectionStatusPill is now absolutely positioned at bottom-full, the same anchor used by ComposerCommandPopover (which also has z-10). When a command popover is open while a reconnect/loading status exists, the popover renders on top of the status pill, obscuring its message and reconnect button. The previous in-flow layout reserved vertical space so the two elements never shared the same slot. Consider offsetting the status pill further (e.g. accounting for the popover height) or repositioning it so it doesn't collide with the popover.
🚀 Reply "fix it for me" or copy this AI Prompt for your agent:
In file @apps/mobile/src/features/threads/ThreadComposer.tsx around line 242:
`ComposerConnectionStatusPill` is now absolutely positioned at `bottom-full`, the same anchor used by `ComposerCommandPopover` (which also has `z-10`). When a command popover is open while a reconnect/loading status exists, the popover renders on top of the status pill, obscuring its message and reconnect button. The previous in-flow layout reserved vertical space so the two elements never shared the same slot. Consider offsetting the status pill further (e.g. accounting for the popover height) or repositioning it so it doesn't collide with the popover.
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
Bugbot Autofix is ON, but a cloud agent failed to start.
Reviewed by Cursor Bugbot for commit 864aeef. Configure here.
| className="absolute inset-x-0 bottom-full items-center pb-2" | ||
| entering={FadeInDown.duration(180)} | ||
| exiting={FadeOutDown.duration(140)} | ||
| pointerEvents="box-none" |
There was a problem hiding this comment.
Status pill overlays approval cards
Medium Severity
The ComposerConnectionStatusPill is now absolutely positioned (bottom-full), which removes it from the layout flow. This means it no longer reserves space, causing it to overlap with the feed end, new working rows, and pending approval/user-input cards. This overlap can also lead to it stealing presses from underlying elements.
Reviewed by Cursor Bugbot for commit 864aeef. Configure here.
ApprovabilityVerdict: Needs human review 1 blocking correctness issue found. This PR relocates the working timer from above the composer to the thread timeline. Two unresolved review comments identify potential UI overlap issues with the connection status pill's new absolute positioning, which could obscure other elements or interfere with touch events. You can customize Macroscope's approvability policy. Learn more. |


Summary
Testing
threadActivitycoverage for active work rows.Note
Low Risk
Presentation-only mobile thread UI and feed derivation; scroll inset changes are a deliberate simplification with no auth or data-path impact.
Overview
Moves the “Working for …” indicator from the floating composer stack into the thread message list, so active agent work reads as part of the conversation timeline instead of sitting above the input.
deriveThreadFeedPresentationnow acceptsactiveWorkStartedAtand appends a syntheticworkingrow (working-indicator-row) at the end of the presented feed.ThreadFeedrenders that row with a per-second elapsed label viaWorkingTimelineRow. The empty-thread placeholder is suppressed when work is active so users still see the timer on an otherwise empty thread.Thread detail / composer chrome:
WorkingDurationPilland the extra overlay height reserved for it are removed; keyboard/list bottom inset math no longer includes a working-indicator slot. Pending approval/user-input cards stay in the composer overlay but without the layout animation wrapper that surrounded the old working pill.Composer connection pill: The reconnect/sync status pill is repositioned above the composer (
absolute+bottom-full) and gets FadeInDown / FadeOutDown enter/exit animations.Tests cover appending the active-work row and stripping it when re-derived without
activeWorkStartedAt.Reviewed by Cursor Bugbot for commit 864aeef. Bugbot is set up for automated code reviews on this repo. Configure here.
Note
Move the working timer from the composer overlay into the thread timeline
WorkingDurationPilloverlay above the composer inThreadDetailScreenand instead passesactiveWorkStartedAtdown toThreadFeed.WorkingTimelineRowcomponent that renders a live-updating "Working for " row at the bottom of the feed, refreshing every second viasetInterval.threadActivity.tswith a'working'entry type and updatesderiveThreadFeedPresentationto append or remove it based onactiveWorkStartedAt.ThreadComposeris changed to an absolutely positioned overlay withFadeInDown/FadeOutDownanimations, freeing up vertical layout space.📊 Macroscope summarized 864aeef. 4 files reviewed, 0 issues evaluated, 0 issues filtered, 0 comments posted
🗂️ Filtered Issues
No issues evaluated.