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