Skip to content

fix(mobile): animate thread lifecycle transitions consistently - #10487

Merged
juliusmarminge merged 1 commit into
mainfrom
t3code/mobile-thread-transition-animation
Sep 7, 2026
Merged

fix(mobile): animate thread lifecycle transitions consistently#10487
juliusmarminge merged 1 commit into
mainfrom
t3code/mobile-thread-transition-animation

Conversation

@juliusmarminge

@juliusmarminge juliusmarminge commented Sep 7, 2026

Copy link
Copy Markdown
Member

What Changed

Mobile thread lifecycle actions now finish the existing slide-out and collapse animation before updating the list. Swipe and menu actions share it across Home, the thread sidebar, and Archive, including delete, archive, settle, snooze, wake, un-settle, and unarchive. Deletion still waits for confirmation, failures restore rows, and recycling a row does not strand its command.

Why

Only the Settle swipe button animated its row away. Other actions abruptly replaced the row and moved its neighbors. Registering visible rows with the shared action flow applies the same transition regardless of where an action starts.

Validation: four focused dismissal tests pass, the mobile TypeScript check passes, and targeted lint completes with warnings. On an iPhone 17e simulator running iOS 26.5, verified snooze, confirmed deletion, full-swipe settle, un-settle, and wake against a disposable server. Archive and sidebar wiring were reviewed in source. No wire contracts, provider adapters, web, or desktop behavior changed.

UI Changes

Same simulator, viewport, project, and thread restored between captures. Before uses c0d4e95; after uses 4c3b4b5. The final layout is the same; the recording shows the transition difference. Captures are cropped to the affected list area.

Before and after screenshots:

Before and after snoozing the same thread

Before and after recording, shown at half speed:

Before and after thread dismissal animation

Download the comparison video

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Implemented with GPT-6 through Codex.

@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:L 100-499 changed lines (additions + deletions). labels Sep 7, 2026
@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 13.6 KiB 13.6 KiB −37 B (−0.3%) 15.1 KiB
Codex Thread snapshot wire 7.0 KiB 7.0 KiB −1 B (−0.0%) 7.3 KiB
Codex Live turn WebSocket wire 6.5 KiB 6.5 KiB −36 B (−0.5%) 7.8 KiB
Codex Live turn WebSocket decoded 57.1 KiB 57.0 KiB −88 B (−0.2%) 66.4 KiB
Codex Live turn messages 10 8 −2 (−20.0%) 21
Claude Total thread wire 13.6 KiB 13.6 KiB −54 B (−0.4%) 15.1 KiB
Claude Thread snapshot wire 7.0 KiB 7.1 KiB +10 B (+0.1%) 7.3 KiB
Claude Live turn WebSocket wire 6.6 KiB 6.5 KiB −64 B (−1.0%) 7.8 KiB
Claude Live turn WebSocket decoded 57.9 KiB 57.8 KiB −88 B (−0.1%) 66.4 KiB
Claude Live turn messages 10 8 −2 (−20.0%) 21

Baseline: c0d4e95 · PR result: 4c3b4b5 · Source CI: success

Scenario and decoded snapshot size

10 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.

  • Codex decoded thread snapshot: 113.9 KiB
  • Claude decoded thread snapshot: 114.6 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@macroscopeapp

macroscopeapp Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — This mobile fix coordinates dismissal animations across multiple visible thread rows and changes timing and rollback behavior for archive, delete, settle, snooze, and wake actions. Because it introduces shared asynchronous lifecycle state across several production list surfaces, the change warrants human review.

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

@coderabbitai

coderabbitai Bot commented Sep 7, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Team

Run ID: 499a9e70-3bd8-40e9-a55a-c9acad2ff024

📥 Commits

Reviewing files that changed from the base of the PR and between c0d4e95 and 4c3b4b5.

📒 Files selected for processing (7)
  • apps/mobile/src/features/archive/ArchivedThreadsScreen.tsx
  • apps/mobile/src/features/home/thread-dismissal.test.ts
  • apps/mobile/src/features/home/thread-dismissal.ts
  • apps/mobile/src/features/home/thread-swipe-actions.tsx
  • apps/mobile/src/features/home/useThreadListActions.ts
  • apps/mobile/src/features/threads/thread-list-items.tsx
  • apps/mobile/src/features/threads/thread-list-v2-items.tsx

Included review availability: 6 reviews are currently available. Your included PR review attempts over the past 7 days set your current allowance at 10 reviews per hour.


📝 Walkthrough

Walkthrough

Thread dismissal now coordinates visible row copies by composite thread key. Mutations wait for dismissal animations, restore rows on unsuccessful outcomes, and use lifecycle-aware swipe reset keys.

Changes

Thread dismissal coordination

Layer / File(s) Summary
Dismissal coordination contract
apps/mobile/src/features/home/thread-dismissal.ts, apps/mobile/src/features/home/thread-dismissal.test.ts
Registered rows receive keyed dismissal requests. Mutations wait for all exit completions and restore rows when they fail or return an unsuccessful result.
Swipeable dismissal integration
apps/mobile/src/features/home/thread-swipe-actions.tsx
ThreadSwipeable uses registered dismissal handlers, synchronous primary actions, row restoration, and updated full-swipe behavior.
Mutation wiring and row identity
apps/mobile/src/features/home/useThreadListActions.ts, apps/mobile/src/features/threads/thread-list-items.tsx, apps/mobile/src/features/threads/thread-list-v2-items.tsx, apps/mobile/src/features/archive/ArchivedThreadsScreen.tsx
Thread mutations use withThreadDismissal. List rows provide composite environment-and-thread keys, and v2 rows reset swipe state when lifecycle timestamps change.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Merge Risk: ⚪ Minimal · up to 4c3b4

The updated dismissal flow has no confirmed merge-blocking risk.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant ThreadSwipeable
  participant withThreadDismissal
  participant ThreadMutation
  User->>ThreadSwipeable: trigger thread action
  ThreadSwipeable->>withThreadDismissal: request keyed dismissal
  withThreadDismissal->>ThreadSwipeable: dismiss visible copies
  ThreadSwipeable-->>withThreadDismissal: report animation completion
  withThreadDismissal->>ThreadMutation: run mutation
  ThreadMutation-->>withThreadDismissal: return result
  withThreadDismissal->>ThreadSwipeable: restore rows if unsuccessful
Loading

Suggested reviewers: t3dotgg, gabrielelpidio, stienswout

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 6 functions across 7 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
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.
Description check ✅ Passed The description includes all required sections. It clearly explains the changes, motivation, UI impact, validation, screenshots, video, and completed checklist items.
Title check ✅ Passed The title clearly and concisely describes the primary change: consistent animation of mobile thread lifecycle transitions.
  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch t3code/mobile-thread-transition-animation

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

@juliusmarminge
juliusmarminge merged commit e32dd42 into main Sep 7, 2026
23 checks passed
@juliusmarminge
juliusmarminge deleted the t3code/mobile-thread-transition-animation branch September 7, 2026 09:58
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Sep 7, 2026
## 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
raman325 added a commit to raman325/t3code that referenced this pull request Sep 7, 2026
* origin/main: (675 commits)
  fix(web): tolerate servers that predate git identity in project import (pingdotgg#10547)
  chore(mobile): bump app version to 1.1.0
  fix(mobile): wait for native thread scroll before reveal (pingdotgg#10486)
  fix(mobile): match Working status color to desktop
  fix(web): remove inserted citations on cancel (pingdotgg#10518)
  feat(web): group onboarding project import by repository (pingdotgg#10493)
  fix(mobile): preserve chat rows when toggling commands (pingdotgg#10492)
  fix(mobile): restore assistant message bottom padding (pingdotgg#10491)
  fix(mobile): animate thread lifecycle transitions consistently (pingdotgg#10487)
  fix(mobile): release initial scroll target after dragging (pingdotgg#10483)
  fix(mobile): smooth composer status pill resizing (pingdotgg#10484)
  fix(mobile): prevent chat from disappearing when scrolling (pingdotgg#10479)
  fix(web): resize the floating preview from any edge (pingdotgg#10467)
  fix(web): keep composer toolbar controls anchored during transitions (pingdotgg#10478)
  fix(mobile): improve font-size slider performance and prevent maximum update depth errors (pingdotgg#7138)
  feat(mobile): start a new thread on an existing branch (pingdotgg#10359)
  fix(ios): scroll short source files from blank space (pingdotgg#10178)
  fix(mobile): hide changed-files navigator and restore refresh in raw diff fallback (pingdotgg#9828)
  fix(projects): prevent invalid script IDs from crashing threads (pingdotgg#10019)
  fix(devcontainer): make repository setup work (pingdotgg#7875)
  ...

# Conflicts:
#	apps/server/src/provider/builtInDrivers.ts
#	docs/README.md
#	docs/user/install.md
#	packages/contracts/src/settings.test.ts
#	packages/contracts/src/settings.ts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L 100-499 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.

1 participant