feat(ios): paginate older turns with infinite scroll - #308
DatScreamer wants to merge 1 commit into
Conversation
Replace the explicit Load-earlier-messages button with scroll-triggered pagination. Track visible turn IDs and prefetch the next older page as the user approaches the top, debounced per cursor so concurrent prefetches collapse. Bump page size to 20, make loadOlderTurns report whether a page was actually loaded, and re-route the Latest button through a semantic ScrollPosition with a UIKit scroll-view resolver so the jump executes even while momentum is decelerating. Anchor merged exploration rows to their newest constituent turn so prepending older pages keeps scroll identity stable, and auto-collapse large conversations past a 200-item threshold.
|
Depends on the server-side pagination from 0xSero/alleycat#49 (issue 0xSero/alleycat#48), pinned via #307's Cargo.lock bump. |
|
#319 has merged ( |
|
This PR is superseded by #331 ( |
Closes part of #306
Depends on #307 (land after it so the paged cursor behaves predictably).
Problem
iOS conversation history loading was manual (a "Load earlier messages" button), page size 5, and the "Latest" jump button could be consumed just by stopping a decelerating ScrollView.
Changes (ConversationView, AppModel, TranscriptTurn, Settings, tests)
loadOlderTurnsnow returns whether a page loaded.ScrollPosition+ a UIKit scroll-view resolver so the jump executes even while momentum is decelerating.Scope
iOS only; the conversation surface is shared across all runtimes, so this improves every provider (codex, claude, pi, local-studio, opencode).
Parity note
Android still uses a manual "Load earlier messages" button (ConversationScreen.kt). The Rust metadata-read fix (#307) benefits both; the infinite-scroll UX is iOS-only in this change. Android parity is a follow-up.
Tests
Verification
make ios-sim-fast