nextcamp - fix session resume when navigating back to chat in sidebar (#5370)

This commit is contained in:
Zane
2025-10-30 13:40:32 -07:00
committed by GitHub
parent ad4269330e
commit c39775ea44
+22 -4
View File
@@ -76,6 +76,8 @@ const PairRouteWrapper = ({
setFatalError, setFatalError,
agentState, agentState,
loadCurrentChat, loadCurrentChat,
activeSessionId,
setActiveSessionId,
}: { }: {
chat: ChatType; chat: ChatType;
setChat: (chat: ChatType) => void; setChat: (chat: ChatType) => void;
@@ -84,6 +86,8 @@ const PairRouteWrapper = ({
setFatalError: (value: ((prevState: string | null) => string | null) | string | null) => void; setFatalError: (value: ((prevState: string | null) => string | null) | string | null) => void;
agentState: AgentState; agentState: AgentState;
loadCurrentChat: (context: InitializationContext) => Promise<ChatType>; loadCurrentChat: (context: InitializationContext) => Promise<ChatType>;
activeSessionId: string | null;
setActiveSessionId: (id: string | null) => void;
}) => { }) => {
const location = useLocation(); const location = useLocation();
const setView = useNavigation(); const setView = useNavigation();
@@ -96,11 +100,13 @@ const PairRouteWrapper = ({
// Determine which session ID to use: // Determine which session ID to use:
// 1. From route state (when navigating from Hub with a new session) // 1. From route state (when navigating from Hub with a new session)
// 2. From URL params (when resuming a session) // 2. From URL params (when resuming a session or after refresh)
// 3. From the existing chat state (when navigating to Pair directly) // 3. From active session state (when navigating back from other routes)
const sessionId = routeState.resumeSessionId || resumeSessionId || chat.sessionId; // 4. From the existing chat state
const sessionId =
routeState.resumeSessionId || resumeSessionId || activeSessionId || chat.sessionId;
// Update URL with session ID if it's not already there (new chat from pair) // Update URL with session ID when on /pair route (for refresh support)
useEffect(() => { useEffect(() => {
if (process.env.ALPHA && sessionId && sessionId !== resumeSessionId) { if (process.env.ALPHA && sessionId && sessionId !== resumeSessionId) {
setSearchParams((prev) => { setSearchParams((prev) => {
@@ -110,6 +116,13 @@ const PairRouteWrapper = ({
} }
}, [sessionId, resumeSessionId, setSearchParams]); }, [sessionId, resumeSessionId, setSearchParams]);
// Update active session state when session ID changes
useEffect(() => {
if (process.env.ALPHA && sessionId && sessionId !== activeSessionId) {
setActiveSessionId(sessionId);
}
}, [sessionId, activeSessionId, setActiveSessionId]);
return process.env.ALPHA ? ( return process.env.ALPHA ? (
<Pair2 <Pair2
setChat={setChat} setChat={setChat}
@@ -322,6 +335,9 @@ export function AppInner() {
recipe: null, recipe: null,
}); });
// Store the active session ID for navigation persistence
const [activeSessionId, setActiveSessionId] = useState<string | null>(null);
const { addExtension } = useConfig(); const { addExtension } = useConfig();
const { agentState, loadCurrentChat, resetChat } = useAgent(); const { agentState, loadCurrentChat, resetChat } = useAgent();
const resetChatIfNecessary = useCallback(() => { const resetChatIfNecessary = useCallback(() => {
@@ -574,6 +590,8 @@ export function AppInner() {
setFatalError={setFatalError} setFatalError={setFatalError}
setAgentWaitingMessage={setAgentWaitingMessage} setAgentWaitingMessage={setAgentWaitingMessage}
setIsGoosehintsModalOpen={setIsGoosehintsModalOpen} setIsGoosehintsModalOpen={setIsGoosehintsModalOpen}
activeSessionId={activeSessionId}
setActiveSessionId={setActiveSessionId}
/> />
} }
/> />