Skip to content

fix(mobile): add long-press unarchive menu to archived thread rows - #5640

Closed
sideeffffect wants to merge 1 commit into
pingdotgg:mainfrom
sideeffffect:fix/mobile-android-unarchive
Closed

fix(mobile): add long-press unarchive menu to archived thread rows#5640
sideeffffect wants to merge 1 commit into
pingdotgg:mainfrom
sideeffffect:fix/mobile-android-unarchive

Conversation

@sideeffffect

@sideeffffect sideeffffect commented Aug 7, 2026

Copy link
Copy Markdown

Problem

On Android, archived threads can't be reliably unarchived. The archived-threads screen's rows are the only thread list in the app without a long-press action menu — every other row (home, sidebar) got a ControlPillMenu in the Android support work (#3579), but the archived rows were missed.

That leaves the swipe action as the sole unarchive affordance: swipe a row open, then tap the narrow "Unarchive" button. On Android this is fiddly, and worse — a full swipe on the row triggers Delete, so a slightly-too-far swipe permanently deletes the thread instead of unarchiving it.

The underlying command/decider/projector/reducer path for unarchive is correct and symmetric with archive; this is purely a missing Android-friendly UI affordance.

Fix

Wrap the archived thread row in a ControlPillMenu long-press menu exposing Unarchive and Delete, mirroring the home/sidebar rows:

  • Android — anchors a native dropdown to the row (via the injected onLongPress), giving a dependable, non-swipe way to unarchive.
  • iOS — renders the standard context menu, consistent with the other thread lists.

Swipe actions are left untouched. Also passes resetKey to the row's ThreadSwipeable so recycled LegendList rows reset their swipe state, matching the home/sidebar lists.

Testing

  • tsc --noEmit (mobile) — clean
  • vp check (format + lint) — clean
  • vp test for features/archive + features/home — 38 passed

🤖 Generated with Claude Code


Note

Low Risk
UI-only affordance on the archive screen; reuses existing ControlPillMenu and existing unarchive/delete callbacks with no backend or auth changes.

Overview
Archived threads were the only list rows without long-press actions, so on Android unarchive depended on a narrow swipe button and a full swipe could delete instead.

Archived thread rows are wrapped in ControlPillMenu with shouldOpenOnLongPress, exposing Unarchive and Delete the same way as home/sidebar thread rows (native dropdown on Android, context menu on iOS). Swipe-to-unarchive/delete is unchanged.

ThreadSwipeable also gets a resetKey of environmentId:threadId so recycled LegendList rows don’t keep a stale open swipe state, consistent with other thread lists.

Reviewed by Cursor Bugbot for commit 571cc90. Bugbot is set up for automated code reviews on this repo. Configure here.

On Android the only way to unarchive a thread was to swipe a row open and
tap the narrow "Unarchive" action button — a fiddly interaction, and the
archived-threads screen (unlike every other thread list) had no long-press
menu fallback. A full swipe on the row triggers Delete, so a mistimed swipe
permanently removes the thread instead of unarchiving it.

Mirror the home/sidebar rows: wrap the archived row in a ControlPillMenu
long-press menu exposing Unarchive and Delete. On Android this anchors a
native dropdown to the row; on iOS it renders a context menu. Swipe actions
are unchanged. Also pass `resetKey` so recycled LegendList rows reset their
swipe state, matching the other thread lists.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 880c4b79-a573-4f47-94f3-1cbfbd95b73b

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

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:M 30-99 changed lines (additions + deletions). labels Aug 7, 2026
@t3-code

t3-code Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

closing in favor of #5658, the later implementation of the same archived-row unarchive action.

@t3-code t3-code Bot closed this Aug 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M 30-99 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.

1 participant