import { useMemo, useState } from "react"; import { View, Text, TextInput, FlatList, Pressable, KeyboardAvoidingView, Platform } from "react-native"; import type { ChatMessage as ChatMsg } from "{{PACKAGE_SCOPE}}/core/shared/types.js"; import { useAppState } from "{{PACKAGE_SCOPE}}/ui/context/AppStateContext.js"; import { chatService } from "{{PACKAGE_SCOPE}}/ui/services/grpc-client.js"; import { MessageBubble } from "../../src/components/MessageBubble.js"; import { ModelPicker } from "../../src/components/ModelPicker.js"; import { tokens } from "../../src/theme/tokens.js"; export default function ChatScreen() { const state = useAppState(); const [input, setInput] = useState(""); const { activeModel, viewMode, messages } = state.chat; const visible: ChatMsg[] = useMemo( () => viewMode === "focused" ? messages[activeModel] ?? [] : Object.values(messages) .flat() .sort((a, b) => a.timestamp.localeCompare(b.timestamp)), [messages, activeModel, viewMode], ); const send = () => { if (!input.trim()) return; chatService.sendMessage(activeModel, input.trim()); setInput(""); }; return ( chatService.setActiveModel(m)} /> m.id} renderItem={({ item }) => } contentContainerStyle={{ padding: tokens.space.md }} /> Send ); }