| .. | .. |
|---|
| 265 | 265 | } = useChat(); |
|---|
| 266 | 266 | const [editingId, setEditingId] = useState<string | null>(null); |
|---|
| 267 | 267 | const [keyboardHeight, setKeyboardHeight] = useState(0); |
|---|
| 268 | + const sessionScrollRef = useRef<ScrollView>(null); |
|---|
| 268 | 269 | |
|---|
| 269 | 270 | // Sort: active first, then by index |
|---|
| 270 | 271 | const sortedSessions = [...sessions].sort((a, b) => { |
|---|
| .. | .. |
|---|
| 312 | 313 | const handleStartRename = useCallback((session: WsSession) => { |
|---|
| 313 | 314 | Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); |
|---|
| 314 | 315 | setEditingId(session.id); |
|---|
| 315 | | - }, []); |
|---|
| 316 | + // Scroll down after keyboard appears so the rename field is visible |
|---|
| 317 | + const idx = sortedSessions.findIndex(s => s.id === session.id); |
|---|
| 318 | + if (idx >= 0 && sessionScrollRef.current) { |
|---|
| 319 | + setTimeout(() => { |
|---|
| 320 | + sessionScrollRef.current?.scrollTo({ y: idx * 60, animated: true }); |
|---|
| 321 | + }, 400); |
|---|
| 322 | + } |
|---|
| 323 | + }, [sortedSessions]); |
|---|
| 316 | 324 | |
|---|
| 317 | 325 | const handleConfirmRename = useCallback( |
|---|
| 318 | 326 | (sessionId: string, newName: string) => { |
|---|
| .. | .. |
|---|
| 407 | 415 | |
|---|
| 408 | 416 | {/* Session list */} |
|---|
| 409 | 417 | <ScrollView |
|---|
| 418 | + ref={sessionScrollRef} |
|---|
| 410 | 419 | style={{ paddingHorizontal: 16 }} |
|---|
| 411 | 420 | showsVerticalScrollIndicator={false} |
|---|
| 412 | 421 | keyboardShouldPersistTaps="handled" |
|---|