@@ -8,6 +8,10 @@ import {
88import { useCallback , useEffect , useMemo , useRef , useState , type ReactNode } from "react" ;
99import * as Option from "effect/Option" ;
1010import { EnvironmentId , ThreadId , type ProjectScript } from "@t3tools/contracts" ;
11+ import {
12+ requestOlderThreadTurns ,
13+ threadHasOlderTurns ,
14+ } from "@t3tools/client-runtime/state/threads" ;
1115import { projectScriptCwd , projectScriptRuntimeEnv } from "@t3tools/shared/projectScripts" ;
1216import { Platform , ScrollView , View } from "react-native" ;
1317import { useSafeAreaInsets } from "react-native-safe-area-context" ;
@@ -190,6 +194,20 @@ function ThreadRouteContent(
190194 useThreadSelection ( ) ;
191195 const selectedThreadDetailState = props . selectedThreadDetailState ;
192196 const selectedThreadDetail = Option . getOrNull ( selectedThreadDetailState . data ) ;
197+ // "Load earlier turns" header state for windowed (paginated) thread loads.
198+ const loadEarlierTurns = useMemo ( ( ) => {
199+ if ( selectedThread === null || ! threadHasOlderTurns ( selectedThreadDetailState ) ) {
200+ return null ;
201+ }
202+ return {
203+ loading :
204+ selectedThreadDetailState . page . _tag === "Some" &&
205+ selectedThreadDetailState . page . value . loadingOlder ,
206+ onLoadEarlier : ( ) => {
207+ requestOlderThreadTurns ( selectedThread . environmentId , selectedThread . id ) ;
208+ } ,
209+ } ;
210+ } , [ selectedThread , selectedThreadDetailState ] ) ;
193211 const { selectedThreadCwd } = useSelectedThreadWorktree ( ) ;
194212 const composer = useThreadComposerState ( ) ;
195213 const gitState = useSelectedThreadGitState ( ) ;
@@ -766,6 +784,7 @@ function ThreadRouteContent(
766784 draftAttachments = { composer . draftAttachments }
767785 connectionStateLabel = { routeConnectionState }
768786 threadSyncStatus = { selectedThreadDetailState . status }
787+ loadEarlier = { loadEarlierTurns }
769788 activeThreadBusy = { composer . activeThreadBusy }
770789 environmentId = { selectedThread . environmentId }
771790 projectWorkspaceRoot = { selectedThreadProject ?. workspaceRoot ?? null }
0 commit comments