|
1 | | -import { useCallback, useEffect, useMemo, useState } from 'react'; |
2 | | -import { ActivityIndicator, FlatList, KeyboardAvoidingView, Platform, View } from 'react-native'; |
3 | | -import { useAtomValue } from 'jotai'; |
4 | 1 | import { type CloudStatus, type KiloSessionId, type StoredMessage } from 'cloud-agent-sdk'; |
5 | | -import { toast } from 'sonner-native'; |
| 2 | +import { useAtomValue } from 'jotai'; |
| 3 | +import { useCallback, useEffect, useMemo } from 'react'; |
| 4 | +import { ActivityIndicator, FlatList, KeyboardAvoidingView, Platform, View } from 'react-native'; |
6 | 5 | import { useSafeAreaInsets } from 'react-native-safe-area-context'; |
| 6 | +import { toast } from 'sonner-native'; |
7 | 7 |
|
8 | 8 | import { ChatComposer } from '@/components/agents/chat-composer'; |
9 | 9 | import { ConnectivityBanner } from '@/components/agents/connectivity-banner'; |
10 | 10 | import { MessageBubble } from '@/components/agents/message-bubble'; |
11 | | -import { normalizeAgentMode } from '@/components/agents/mode-options'; |
12 | | -import { type AgentMode } from '@/components/agents/mode-selector'; |
13 | 11 | import { PermissionCard } from '@/components/agents/permission-card'; |
14 | 12 | import { QuestionCard } from '@/components/agents/question-card'; |
15 | 13 | import { useSessionManager } from '@/components/agents/session-provider'; |
16 | 14 | import { SessionStatusIndicator } from '@/components/agents/session-status-indicator'; |
17 | 15 | import { useInteractionHandlers } from '@/components/agents/use-interaction-handlers'; |
18 | 16 | import { useSessionAutoScroll } from '@/components/agents/use-session-auto-scroll'; |
| 17 | +import { useSessionConfigSync } from '@/components/agents/use-session-config-sync'; |
19 | 18 | import { WorkingIndicator } from '@/components/agents/working-indicator'; |
20 | 19 | import { ScreenHeader } from '@/components/screen-header'; |
21 | 20 | import { Text } from '@/components/ui/text'; |
@@ -71,51 +70,14 @@ export function SessionDetailContent({ sessionId }: Readonly<SessionDetailConten |
71 | 70 |
|
72 | 71 | const { models: modelOptions } = useAvailableModels(organizationId); |
73 | 72 |
|
74 | | - const [currentMode, setCurrentMode] = useState<AgentMode>(() => |
75 | | - normalizeAgentMode(fetchedData?.mode) |
76 | | - ); |
77 | | - |
78 | | - const [currentModel, setCurrentModel] = useState<string>(fetchedData?.model ?? ''); |
79 | | - const [currentVariant, setCurrentVariant] = useState<string>(fetchedData?.variant ?? ''); |
80 | | - |
81 | | - // Sync mode/model/variant from session data and SDK session config. |
82 | | - // The SDK's sessionConfig is updated from assistant messages during snapshot |
83 | | - // replay, so it captures the model actually used in the conversation. |
84 | | - useEffect(() => { |
85 | | - const mode = sessionConfig?.mode ?? fetchedData?.mode; |
86 | | - if (mode) { |
87 | | - setCurrentMode(normalizeAgentMode(mode)); |
88 | | - } |
89 | | - |
90 | | - const model = sessionConfig?.model ?? fetchedData?.model; |
91 | | - if (model) { |
92 | | - setCurrentModel(model); |
93 | | - } |
94 | | - |
95 | | - const variant = sessionConfig?.variant ?? fetchedData?.variant; |
96 | | - if (variant) { |
97 | | - setCurrentVariant(variant); |
98 | | - } |
99 | | - }, [ |
100 | | - sessionConfig?.mode, |
101 | | - sessionConfig?.model, |
102 | | - sessionConfig?.variant, |
103 | | - fetchedData?.mode, |
104 | | - fetchedData?.model, |
105 | | - fetchedData?.variant, |
106 | | - ]); |
107 | | - |
108 | | - // Auto-select first available model when session has no model (e.g. remote CLI sessions) |
109 | | - useEffect(() => { |
110 | | - if (currentModel || modelOptions.length === 0 || fetchedData === null) { |
111 | | - return; |
112 | | - } |
113 | | - const firstModel = modelOptions[0]; |
114 | | - if (firstModel) { |
115 | | - setCurrentModel(firstModel.id); |
116 | | - setCurrentVariant(firstModel.variants[0] ?? ''); |
117 | | - } |
118 | | - }, [currentModel, modelOptions, fetchedData]); |
| 73 | + const { |
| 74 | + currentMode, |
| 75 | + currentModel, |
| 76 | + currentVariant, |
| 77 | + setCurrentMode, |
| 78 | + setCurrentModel, |
| 79 | + setCurrentVariant, |
| 80 | + } = useSessionConfigSync({ fetchedData, sessionConfig, modelOptions }); |
119 | 81 |
|
120 | 82 | const { |
121 | 83 | flatListRef, |
|
0 commit comments