бля а какой запрос на поиск по айди
This commit is contained in:
@@ -5,6 +5,7 @@ import '../../../main.dart';
|
||||
import '../../../backend/api.dart';
|
||||
import '../../../backend/modules/messages.dart';
|
||||
import '../../../core/storage/app_database.dart';
|
||||
import '../../../models/attachment.dart';
|
||||
import '../../widgets/message_bubble.dart';
|
||||
|
||||
class ChatScreen extends StatefulWidget {
|
||||
@@ -81,6 +82,7 @@ class _ChatScreenState extends State<ChatScreen>
|
||||
_isLoading = false;
|
||||
});
|
||||
}
|
||||
_loadForwardedSenderNames();
|
||||
} catch (e) {
|
||||
debugPrint('Error fetching history: $e');
|
||||
if (mounted) {
|
||||
@@ -164,6 +166,62 @@ class _ChatScreenState extends State<ChatScreen>
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _loadForwardedSenderNames() async {
|
||||
final forwardIds = <int>{};
|
||||
for (final msg in _messages) {
|
||||
if (msg.attachments != null) {
|
||||
for (final a in msg.attachments!) {
|
||||
if (a is ForwardedMessageAttachment) {
|
||||
if (a.originalSenderName == null) {
|
||||
forwardIds.add(a.originalSenderId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (forwardIds.isEmpty) return;
|
||||
|
||||
for (final id in forwardIds) {
|
||||
final name = await messagesModule.searchContactById(id);
|
||||
if (name != null && mounted) {
|
||||
setState(() {
|
||||
for (var i = 0; i < _messages.length; i++) {
|
||||
final msg = _messages[i];
|
||||
if (msg.attachments != null) {
|
||||
final newAttaches = msg.attachments!.map((a) {
|
||||
if (a is ForwardedMessageAttachment &&
|
||||
a.originalSenderId == id &&
|
||||
a.originalSenderName == null) {
|
||||
return ForwardedMessageAttachment(
|
||||
originalSenderId: id,
|
||||
originalSenderName: name,
|
||||
originalMessageId: a.originalMessageId,
|
||||
originalTime: a.originalTime,
|
||||
originalText: a.originalText,
|
||||
originalChatId: a.originalChatId,
|
||||
originalAttachments: a.originalAttachments,
|
||||
);
|
||||
}
|
||||
return a;
|
||||
}).toList();
|
||||
_messages[i] = CachedMessage(
|
||||
id: msg.id,
|
||||
accountId: msg.accountId,
|
||||
chatId: msg.chatId,
|
||||
senderId: msg.senderId,
|
||||
text: msg.text,
|
||||
time: msg.time,
|
||||
status: msg.status,
|
||||
payload: msg.payload,
|
||||
attachments: newAttaches,
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _scrollToBottom() {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
if (_scrollController.hasClients) {
|
||||
|
||||
@@ -78,6 +78,7 @@ class MessageBubble extends StatelessWidget {
|
||||
MessageType get contentType {
|
||||
if (message.attachments != null && message.attachments!.isNotEmpty) {
|
||||
final first = message.attachments!.first;
|
||||
if (first is ForwardedMessageAttachment) return MessageType.text;
|
||||
if (first is UnknownAttachment) return MessageType.text;
|
||||
if (first.type == AttachmentType.audio) return MessageType.voice;
|
||||
return MessageType.attachment;
|
||||
@@ -317,14 +318,26 @@ class MessageBubble extends StatelessWidget {
|
||||
? Colors.white
|
||||
: (isDark ? cs.onSurface : const Color(0xFF1C1C1E));
|
||||
|
||||
final forwarded = _getForwardedAttachment();
|
||||
|
||||
return Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
children: [
|
||||
Flexible(
|
||||
child: Text(
|
||||
message.text ?? '',
|
||||
style: TextStyle(color: textColor, fontSize: 16, height: 1.3),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
if (forwarded != null) ...[
|
||||
_buildForwardedHeader(context, forwarded),
|
||||
const SizedBox(height: 4),
|
||||
],
|
||||
Text(
|
||||
message.text ?? '',
|
||||
style: TextStyle(color: textColor, fontSize: 16, height: 1.3),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
@@ -343,12 +356,76 @@ class MessageBubble extends StatelessWidget {
|
||||
);
|
||||
}
|
||||
|
||||
ForwardedMessageAttachment? _getForwardedAttachment() {
|
||||
if (message.attachments == null || message.attachments!.isEmpty)
|
||||
return null;
|
||||
for (final a in message.attachments!) {
|
||||
if (a is ForwardedMessageAttachment) return a;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
Widget _buildForwardedHeader(
|
||||
BuildContext context,
|
||||
ForwardedMessageAttachment forwarded,
|
||||
) {
|
||||
final cs = Theme.of(context).colorScheme;
|
||||
final isDark = cs.brightness == Brightness.dark;
|
||||
final textColor = isMe
|
||||
? Colors.white
|
||||
: (isDark ? cs.onSurface : const Color(0xFF1C1C1E));
|
||||
final headerColor = isMe
|
||||
? Colors.white.withValues(alpha: 0.7)
|
||||
: (isDark ? cs.onSurfaceVariant : const Color(0xFF8E8E93));
|
||||
|
||||
final senderName = forwarded.originalSenderName;
|
||||
final displaySender = senderName ?? forwarded.originalSenderId.toString();
|
||||
final origText = forwarded.originalText;
|
||||
final hasOrigText = origText != null && origText.isNotEmpty;
|
||||
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Icon(Symbols.forward, size: 14, color: headerColor),
|
||||
const SizedBox(width: 4),
|
||||
Text(
|
||||
displaySender,
|
||||
style: TextStyle(
|
||||
color: headerColor,
|
||||
fontSize: 12,
|
||||
fontWeight: FontWeight.w500,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
if (hasOrigText) ...[
|
||||
const SizedBox(height: 2),
|
||||
Text(
|
||||
origText,
|
||||
style: TextStyle(color: textColor, fontSize: 14),
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
],
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildAttachmentContent(BuildContext context) {
|
||||
final attachments = message.attachments;
|
||||
if (attachments == null || attachments.isEmpty) {
|
||||
return _buildTextContent(context);
|
||||
}
|
||||
|
||||
final first = attachments.first;
|
||||
if (first is ForwardedMessageAttachment) {
|
||||
return _buildTextContent(context);
|
||||
}
|
||||
|
||||
final photos = attachments.whereType<PhotoAttachment>().toList();
|
||||
if (photos.isEmpty) {
|
||||
return _buildGenericAttachment(context, attachments.first);
|
||||
|
||||
Reference in New Issue
Block a user