From a0f39302919fbacf7a0d407f01b1a50413ea6f70 Mon Sep 17 00:00:00 2001
From: Matthias Nott <mnott@mnsoft.org>
Date: Mon, 02 Mar 2026 23:15:13 +0100
Subject: [PATCH] feat: on-device speech recognition, navigation screen, session picker

---
 components/chat/MessageBubble.tsx |   29 +++++++++++++++++++++++++++--
 1 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/components/chat/MessageBubble.tsx b/components/chat/MessageBubble.tsx
index e7fbbd8..fd8c0b6 100644
--- a/components/chat/MessageBubble.tsx
+++ b/components/chat/MessageBubble.tsx
@@ -1,5 +1,5 @@
 import React, { useCallback, useState } from "react";
-import { Pressable, Text, View } from "react-native";
+import { Image, Pressable, Text, View } from "react-native";
 import { Message } from "../../types";
 import { playAudio, stopPlayback } from "../../services/audio";
 
@@ -57,7 +57,32 @@
             : "bg-pai-surface rounded-tl-sm"
         }`}
       >
-        {message.type === "voice" ? (
+        {message.type === "image" && message.imageBase64 ? (
+          /* Image message */
+          <View>
+            <Image
+              source={{ uri: `data:image/png;base64,${message.imageBase64}` }}
+              style={{
+                width: 260,
+                height: 180,
+                borderRadius: 10,
+                backgroundColor: "#14141F",
+              }}
+              resizeMode="contain"
+            />
+            {message.content ? (
+              <Text
+                style={{
+                  color: isUser ? "#FFF" : "#9898B0",
+                  fontSize: 12,
+                  marginTop: 4,
+                }}
+              >
+                {message.content}
+              </Text>
+            ) : null}
+          </View>
+        ) : message.type === "voice" ? (
           <Pressable
             onPress={handleVoicePress}
             className="flex-row items-center gap-3"

--
Gitblit v1.3.1