From 78f101ac853aeea5d17067bec4215e070fc71fed Mon Sep 17 00:00:00 2001
From: Matthias Nott <mnott@mnsoft.org>
Date: Mon, 23 Mar 2026 12:01:07 +0100
Subject: [PATCH] feat: attach button with camera/gallery/files, atomic bundle send

---
 lib/services/mqtt_service.dart |   32 ++++++++++++++++++++++++++++++--
 1 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/lib/services/mqtt_service.dart b/lib/services/mqtt_service.dart
index 412291f..1d4cfa9 100644
--- a/lib/services/mqtt_service.dart
+++ b/lib/services/mqtt_service.dart
@@ -141,7 +141,8 @@
       client.keepAlivePeriod = 30;
       client.autoReconnect = false; // Don't auto-reconnect during trial — enable after success
       client.connectTimeoutPeriod = timeout;
-      client.logging(on: true);
+      // client.maxConnectionAttempts is final — can't set it
+      client.logging(on: false);
 
       client.onConnected = _onConnected;
       client.onDisconnected = _onDisconnected;
@@ -407,7 +408,6 @@
     }
 
     if (type == 'image' && sessionId != null) {
-      // Image message
       _publish('pailot/$sessionId/in', {
         'msgId': _uuid(),
         'type': 'image',
@@ -420,6 +420,34 @@
       return;
     }
 
+    if (type == 'bundle' && sessionId != null) {
+      // Atomic multi-attachment message
+      _publish('pailot/$sessionId/in', {
+        'msgId': _uuid(),
+        'type': 'bundle',
+        'sessionId': sessionId,
+        'caption': message['caption'] ?? '',
+        if (message['audioBase64'] != null) 'audioBase64': message['audioBase64'],
+        'attachments': message['attachments'] ?? [],
+        'ts': _now(),
+      }, MqttQos.atLeastOnce);
+      return;
+    }
+
+    if (type == 'file' && sessionId != null) {
+      _publish('pailot/$sessionId/in', {
+        'msgId': _uuid(),
+        'type': 'file',
+        'sessionId': sessionId,
+        'fileBase64': message['fileBase64'] ?? '',
+        'fileName': message['fileName'] ?? 'file',
+        'mimeType': message['mimeType'] ?? 'application/octet-stream',
+        'fileSize': message['fileSize'] ?? 0,
+        'ts': _now(),
+      }, MqttQos.atLeastOnce);
+      return;
+    }
+
     if (type == 'tts' && sessionId != null) {
       // TTS request — route as command
       _publish('pailot/control/in', {

--
Gitblit v1.3.1