Skip to content

fix(mobile): thread rows without swipe actions line up with the rest - #19076

Closed
tris203 wants to merge 1 commit into
pingdotgg:mainfrom
tris203:fix/mobile-unswipeable-row-inset
Closed

tris203 wants to merge 1 commit into
pingdotgg:mainfrom
tris203:fix/mobile-unswipeable-row-inset

Conversation

@tris203

@tris203 tris203 commented Oct 13, 2026

Copy link
Copy Markdown
Contributor

Problem

On Android, and in the iPad sidebar, thread rows of an environment the app has not reached in the current session sit 8dp further out on both sides than their neighbours. With two environments, one connected and one not, the list has two different left edges, and the time label and provider icon on the right are offset too.

Change

A thread row skips its swipe wrapper when the client has no operate grant for the row's environment (thread-list-v2-items.tsx). The wrapper is also what applied the row's container style (swipeContainerStyle: an 8dp horizontal margin, 2dp vertical margin, and corner radius on Android; the sidebar container on iOS), so those rows lost it. They are now wrapped in a plain view carrying the same container style.

The iPhone list has no container style, so nothing changes there.

Scope and approval

A very small, focused fix for an obvious layout bug: one branch of one component, five added lines, no behaviour change. Rows in the same list should share an edge whether or not they can be swiped. No prior issue.

Verification

Android 17 emulator (Pixel 9), mobile dev client, two saved environments: "homelab" is connected, "laptop" is not reachable, so the app holds no operate grant for it. Before is main at 511d20c; after is this branch. Same device, same data.

Before After
Before: the two laptop rows sit further left and right than the homelab row After: all three rows share the same edges

Before, the two laptop rows start further left than the homelab row and their time labels and provider icons sit further right. After, all three rows line up.

The mobile typecheck passes. No test added: the fix is a layout wrapper, and a test for it would only assert the style prop.

Not checked: the iPad sidebar and iOS in general. The sidebar takes the same code path with its own container style, but only the Android phone list was run.

Claude Opus 5.5 in Claude Code, running in T3 Code.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Oct 13, 2026
@macroscopeapp

macroscopeapp Bot commented Oct 13, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at acd9c6c

Macroscope's review found this PR approvable — This is a five-line, single-component layout fix that reuses the existing swipe-container styling for rows without swipe actions. Its runtime impact is limited to consistent insets and corner treatment, with no changes to thread behavior, data, defaults, or static-analysis configuration.

You can add or adjust custom eligibility rules. Learn more.

@coderabbitai

coderabbitai Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Important

Review skipped

Review was skipped as selected files did not have any reviewable changes.

⚙️ Run configuration
  • Configuration used: Path: .coderabbit.config.ts
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 38e2e26b-afa9-46cc-9a26-76e8b89ea12c
📥 Commits

Reviewing files that changed from the base of the PR and between acd9c6c and 2ea681e.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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: 5cff5e3c-e22f-4e05-a31a-d746ca826d5b
📥 Commits

Reviewing files that changed from the base of the PR and between 98a6246 and acd9c6c.

📒 Files selected for processing (1)
  • apps/mobile/src/features/threads/thread-list-v2-items.tsx

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

📝 Walkthrough

When thread operations are unavailable, ThreadListV2Row now renders its content inside a View with rowAppearance.swipeContainerStyle. The row remains non-swipeable.

Changes: Thread row layout

Layer / File(s) Summary
Unavailable-operations row container
apps/mobile/src/features/threads/thread-list-v2-items.tsx
The unavailable-operations branch wraps row content in a View with rowAppearance.swipeContainerStyle. The row remains non-swipeable.

Priority: ⬇️ Low

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

Change: Bug fix

Suggested reviewers: juliusmarminge

Merge Risk: ⚪ Minimal · up to acd9c

Unavailable-operation rows gain the existing container styling. No concrete regression is established; the change appears ready to merge subject to normal checks.

Pre-merge checks: Passed 4
Passed Passed checks (4 passed)
Check name Status Explanation
Description check Passed The description includes all required sections. It explains the layout problem, the code change, the scope rationale, verification steps, observed results, screenshots, and unverified platforms.
Title check Passed The title clearly and concisely describes the primary fix: aligning thread rows that do not have swipe actions.
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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

A thread row skips its swipe wrapper when the client has no operate grant for
the row's environment, which is the case for an environment not reached in the
current app session. The wrapper also carried the row's container inset, so
those rows sat 8dp further out than their neighbours on Android and in the
iPad sidebar. They now keep the same container style.
@tris203
tris203 force-pushed the fix/mobile-unswipeable-row-inset branch from acd9c6c to 2ea681e Compare October 15, 2026 22:02
@t3dotgg

t3dotgg commented Oct 18, 2026

Copy link
Copy Markdown
Member

Note

🤖 Claude Opus 5.5 responding on behalf of Theo

Closing: #21071 shipped this same change. Rows that cannot be operated are now wrapped in rowAppearance.swipeContainerStyle in thread-list-v2-items.tsx, so they line up with swipeable rows. Thanks for catching it.

@t3dotgg t3dotgg closed this Oct 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS 0-9 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants