From 0e888d62af1434fef231e11a5c307a5b48a8deb1 Mon Sep 17 00:00:00 2001
From: Matthias Nott <mnott@mnsoft.org>
Date: Sat, 07 Mar 2026 10:49:07 +0100
Subject: [PATCH] feat: singleton audio, transcript reflection, voice persistence

---
 app/chat.tsx |   10 ++++------
 1 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/app/chat.tsx b/app/chat.tsx
index 49f93bc..8d4e95e 100644
--- a/app/chat.tsx
+++ b/app/chat.tsx
@@ -11,7 +11,7 @@
 import { ImageCaptionModal } from "../components/chat/ImageCaptionModal";
 import { StatusDot } from "../components/ui/StatusDot";
 import { SessionDrawer } from "../components/SessionDrawer";
-import { playAudio, stopPlayback, isPlaying, onPlayingChange } from "../services/audio";
+import { playSingle, stopPlayback, isPlaying, onPlayingChange } from "../services/audio";
 
 interface StagedImage {
   base64: string;
@@ -32,7 +32,7 @@
   const [stagedImage, setStagedImage] = useState<StagedImage | null>(null);
 
   useEffect(() => {
-    return onPlayingChange(setAudioPlaying);
+    return onPlayingChange((uri) => setAudioPlaying(uri !== null));
   }, []);
 
   const handleScreenshot = useCallback(() => {
@@ -137,10 +137,8 @@
     }
     for (let i = messages.length - 1; i >= 0; i--) {
       const msg = messages[i];
-      if (msg.role === "assistant") {
-        if (msg.audioUri) {
-          playAudio(msg.audioUri).catch(() => {});
-        }
+      if (msg.role === "assistant" && msg.audioUri) {
+        playSingle(msg.audioUri).catch(() => {});
         return;
       }
     }

--
Gitblit v1.3.1