From d832f656599b153be8826bc43e1832209b2a1bf6 Mon Sep 17 00:00:00 2001
From: Matthias Nott <mnott@mnsoft.org>
Date: Sun, 08 Mar 2026 07:10:12 +0100
Subject: [PATCH] feat: per-session typing, incoming toast, remove switched-to messages

---
 app/chat.tsx |   21 +++++++++++++++++++--
 1 files changed, 19 insertions(+), 2 deletions(-)

diff --git a/app/chat.tsx b/app/chat.tsx
index bbc5a4c..2a177cc 100644
--- a/app/chat.tsx
+++ b/app/chat.tsx
@@ -10,6 +10,7 @@
 import { CommandBar, TextModeCommandBar } from "../components/chat/CommandBar";
 import { ImageCaptionModal } from "../components/chat/ImageCaptionModal";
 import { StatusDot } from "../components/ui/StatusDot";
+import { IncomingToast } from "../components/ui/IncomingToast";
 import { SessionDrawer } from "../components/SessionDrawer";
 import { playAudio, stopPlayback, isPlaying, onPlayingChange } from "../services/audio";
 
@@ -20,7 +21,7 @@
 }
 
 export default function ChatScreen() {
-  const { messages, sendTextMessage, sendVoiceMessage, sendImageMessage, deleteMessage, clearMessages, isTyping, requestScreenshot, sessions, loadMoreMessages, hasMoreMessages } =
+  const { messages, sendTextMessage, sendVoiceMessage, sendImageMessage, deleteMessage, clearMessages, isTyping, requestScreenshot, sessions, switchSession, loadMoreMessages, hasMoreMessages, incomingToast, dismissToast } =
     useChat();
   const { status } = useConnection();
   const { colors, mode, cycleMode } = useTheme();
@@ -34,6 +35,13 @@
   useEffect(() => {
     return onPlayingChange((uri) => setAudioPlaying(uri !== null));
   }, []);
+
+  const handleToastTap = useCallback(() => {
+    if (incomingToast) {
+      switchSession(incomingToast.sessionId);
+      dismissToast();
+    }
+  }, [incomingToast, switchSession, dismissToast]);
 
   const handleScreenshot = useCallback(() => {
     requestScreenshot();
@@ -252,7 +260,16 @@
       </View>
 
       {/* Message list */}
-      <View style={{ flex: 1 }}>
+      <View style={{ flex: 1, position: "relative" }}>
+        {/* Toast for other-session incoming messages */}
+        {incomingToast && (
+          <IncomingToast
+            sessionName={incomingToast.sessionName}
+            preview={incomingToast.preview}
+            onTap={handleToastTap}
+            onDismiss={dismissToast}
+          />
+        )}
         {messages.length === 0 ? (
           <View style={{ flex: 1, alignItems: "center", justifyContent: "center", gap: 16 }}>
             <View

--
Gitblit v1.3.1