sendMessageWithParams method
Send a message with full params (including attachments).
Message is queued locally first, then sent when online. Returns immediately with optimistic message.
Throws UserIdNotSetException if the identity provider has no user id.
Implementation
Future<Message> sendMessageWithParams(SendMessageParams params) async {
_ensureInitialized();
_ensureUserId();
final content = params.nonce != null
? MessageContent(
plainText: params.content,
cipherText: params.content,
nonce: params.nonce!,
)
: MessageContent(plainText: params.content);
final messageId = _generateId();
// Build optimistic attachments (placeholder until upload/sync).
final attachments = params.attachments
?.map(
(a) => FileAttachment(
id: '$messageId-${a.fileName}',
url: '',
name: a.fileName,
extension: a.fileName.split('.').lastOrNull ?? '',
size: 0,
mimeType: a.mimeType,
uploadStatus: FileUploadStatus.uploading,
),
)
.toList();
final message = Message(
id: messageId,
conversationId: params.conversationId,
senderId: _userId!,
content: content,
type: params.type,
clientTimestamp: DateTime.now(),
replyToId: params.replyToId,
attachments: attachments ?? const [],
);
await _database.insertMessage(message);
await _database.updateConversationLastMessage(
message.conversationId,
messageId: message.id,
messageAt: message.clientTimestamp,
incrementUnread: false,
);
unawaited(
_outboundQueue.enqueue(
OutboundOperation.sendMessage(
messageId: message.id,
conversationId: params.conversationId,
content: params.content,
type: params.type,
replyToId: params.replyToId,
attachments: params.attachments,
nonce: params.nonce,
extra: params.extra,
),
),
);
return message;
}