From b3a1729df271f8091d4d702526c9a408ca907a1c Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Thu, 1 Jan 2026 16:55:58 +0700 Subject: [PATCH] Use replace navigation for agent switches --- .../src/app/agent/[serverId]/[agentId].tsx | 1 + packages/app/src/components/agent-list.tsx | 17 ++++++-- .../app/src/hooks/use-aggregated-agents.ts | 42 ++++++++++--------- 3 files changed, 37 insertions(+), 23 deletions(-) diff --git a/packages/app/src/app/agent/[serverId]/[agentId].tsx b/packages/app/src/app/agent/[serverId]/[agentId].tsx index 8cf009b82..b7c9390c6 100644 --- a/packages/app/src/app/agent/[serverId]/[agentId].tsx +++ b/packages/app/src/app/agent/[serverId]/[agentId].tsx @@ -198,6 +198,7 @@ function AgentScreenContent({ : undefined ); + // Get parent agent ID for back navigation const parentAgentId = agent?.parentAgentId; diff --git a/packages/app/src/components/agent-list.tsx b/packages/app/src/components/agent-list.tsx index 79d91db40..106d94b60 100644 --- a/packages/app/src/components/agent-list.tsx +++ b/packages/app/src/components/agent-list.tsx @@ -1,6 +1,6 @@ import { View, Text, Pressable, FlatList, Modal, RefreshControl, type ListRenderItem } from "react-native"; -import { useCallback, useState, useMemo } from "react"; -import { router } from "expo-router"; +import { useCallback, useMemo, useState } from "react"; +import { router, usePathname } from "expo-router"; import { StyleSheet, useUnistyles } from "react-native-unistyles"; import { formatTimeAgo } from "@/utils/time"; import { getAgentProviderDefinition } from "@server/server/agent/provider-manifest"; @@ -17,6 +17,7 @@ interface AgentListProps { export function AgentList({ agents, isRefreshing = false, onRefresh, selectedAgentId }: AgentListProps) { const { theme } = useUnistyles(); + const pathname = usePathname(); const [actionAgent, setActionAgent] = useState(null); // Sort agents with requires attention at the top @@ -56,7 +57,9 @@ export function AgentList({ agents, isRefreshing = false, onRefresh, selectedAge to: "agent", params: { serverId, agentId }, }); - router.push({ + const shouldReplace = pathname.startsWith("/agent/"); + const navigate = shouldReplace ? router.replace : router.push; + navigate({ pathname: "/agent/[serverId]/[agentId]", params: { serverId, @@ -64,7 +67,7 @@ export function AgentList({ agents, isRefreshing = false, onRefresh, selectedAge }, }); }, - [isActionSheetVisible] + [isActionSheetVisible, pathname] ); const handleAgentLongPress = useCallback((agent: AggregatedAgent) => { @@ -176,8 +179,14 @@ export function AgentList({ agents, isRefreshing = false, onRefresh, selectedAge contentContainerStyle={styles.listContent} keyExtractor={keyExtractor} renderItem={renderAgentItem} + extraData={selectedAgentId} showsVerticalScrollIndicator={false} keyboardShouldPersistTaps="handled" + initialNumToRender={12} + windowSize={7} + maxToRenderPerBatch={12} + updateCellsBatchingPeriod={16} + removeClippedSubviews={true} refreshControl={ onRefresh ? ( ({ - id: id.substring(0, 20) + (id.length > 20 ? '...' : ''), - status: state.status, - sessionReady: state.sessionReady, - hasEverReceivedSessionState: state.hasEverReceivedSessionState, - })); + if (isPerfLoggingEnabled()) { + const connectionStatesArray = Array.from(connectionStates.entries()).map(([id, state]) => ({ + id: id.substring(0, 20) + (id.length > 20 ? '...' : ''), + status: state.status, + sessionReady: state.sessionReady, + hasEverReceivedSessionState: state.hasEverReceivedSessionState, + })); - console.log('[useAggregatedAgents] States:', { - hasAnyData, - isConnecting, - isInitialLoad, - isRevalidating, - totalConnectionStates: connectionStates.size, - connectingReasons: connectingReasons.length > 0 ? connectingReasons : 'none', - }); + console.log('[useAggregatedAgents] States:', { + hasAnyData, + isConnecting, + isInitialLoad, + isRevalidating, + totalConnectionStates: connectionStates.size, + connectingReasons: connectingReasons.length > 0 ? connectingReasons : 'none', + }); - console.log('[useAggregatedAgents] Connection States Detail:', - JSON.stringify(connectionStatesArray, null, 2) - ); + console.log('[useAggregatedAgents] Connection States Detail:', + JSON.stringify(connectionStatesArray, null, 2) + ); + } return { agents: allAgents,