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