| .. | .. |
|---|
| 10 | 10 | import { CommandBar, TextModeCommandBar } from "../components/chat/CommandBar"; |
|---|
| 11 | 11 | import { ImageCaptionModal } from "../components/chat/ImageCaptionModal"; |
|---|
| 12 | 12 | import { StatusDot } from "../components/ui/StatusDot"; |
|---|
| 13 | +import { IncomingToast } from "../components/ui/IncomingToast"; |
|---|
| 13 | 14 | import { SessionDrawer } from "../components/SessionDrawer"; |
|---|
| 14 | 15 | import { playAudio, stopPlayback, isPlaying, onPlayingChange } from "../services/audio"; |
|---|
| 15 | 16 | |
|---|
| .. | .. |
|---|
| 20 | 21 | } |
|---|
| 21 | 22 | |
|---|
| 22 | 23 | export default function ChatScreen() { |
|---|
| 23 | | - const { messages, sendTextMessage, sendVoiceMessage, sendImageMessage, deleteMessage, clearMessages, isTyping, requestScreenshot, sessions, loadMoreMessages, hasMoreMessages } = |
|---|
| 24 | + const { messages, sendTextMessage, sendVoiceMessage, sendImageMessage, deleteMessage, clearMessages, isTyping, requestScreenshot, sessions, switchSession, loadMoreMessages, hasMoreMessages, incomingToast, dismissToast } = |
|---|
| 24 | 25 | useChat(); |
|---|
| 25 | 26 | const { status } = useConnection(); |
|---|
| 26 | 27 | const { colors, mode, cycleMode } = useTheme(); |
|---|
| .. | .. |
|---|
| 34 | 35 | useEffect(() => { |
|---|
| 35 | 36 | return onPlayingChange((uri) => setAudioPlaying(uri !== null)); |
|---|
| 36 | 37 | }, []); |
|---|
| 38 | + |
|---|
| 39 | + const handleToastTap = useCallback(() => { |
|---|
| 40 | + if (incomingToast) { |
|---|
| 41 | + switchSession(incomingToast.sessionId); |
|---|
| 42 | + dismissToast(); |
|---|
| 43 | + } |
|---|
| 44 | + }, [incomingToast, switchSession, dismissToast]); |
|---|
| 37 | 45 | |
|---|
| 38 | 46 | const handleScreenshot = useCallback(() => { |
|---|
| 39 | 47 | requestScreenshot(); |
|---|
| .. | .. |
|---|
| 252 | 260 | </View> |
|---|
| 253 | 261 | |
|---|
| 254 | 262 | {/* Message list */} |
|---|
| 255 | | - <View style={{ flex: 1 }}> |
|---|
| 263 | + <View style={{ flex: 1, position: "relative" }}> |
|---|
| 264 | + {/* Toast for other-session incoming messages */} |
|---|
| 265 | + {incomingToast && ( |
|---|
| 266 | + <IncomingToast |
|---|
| 267 | + sessionName={incomingToast.sessionName} |
|---|
| 268 | + preview={incomingToast.preview} |
|---|
| 269 | + onTap={handleToastTap} |
|---|
| 270 | + onDismiss={dismissToast} |
|---|
| 271 | + /> |
|---|
| 272 | + )} |
|---|
| 256 | 273 | {messages.length === 0 ? ( |
|---|
| 257 | 274 | <View style={{ flex: 1, alignItems: "center", justifyContent: "center", gap: 16 }}> |
|---|
| 258 | 275 | <View |
|---|