From d359e7147050255864aad719b5b1ca6e6d9a968f Mon Sep 17 00:00:00 2001 From: Jganenok Date: Sun, 19 Apr 2026 12:30:44 +0700 Subject: [PATCH] =?UTF-8?q?=D1=83=D0=B1=D1=80=D0=B0=D0=BB=20=D0=B3=D0=BE?= =?UTF-8?q?=D0=B2=D0=BD=D0=BE=20=D0=B7=D0=B0=20=D0=B8=D0=BD=D0=B2=D0=B8?= =?UTF-8?q?=D1=81=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../screens/chats/chat_list_screen.dart | 22 ++++--- lib/frontend/screens/chats/chat_screen.dart | 39 ++++++++++++ lib/frontend/widgets/message_bubble.dart | 59 +++++++++---------- 3 files changed, 81 insertions(+), 39 deletions(-) diff --git a/lib/frontend/screens/chats/chat_list_screen.dart b/lib/frontend/screens/chats/chat_list_screen.dart index 986cbf2..d00b667 100644 --- a/lib/frontend/screens/chats/chat_list_screen.dart +++ b/lib/frontend/screens/chats/chat_list_screen.dart @@ -1042,6 +1042,7 @@ class _ChatListScreenState extends State isOnline: chat.isOnline, unreadCount: chat.unreadCount, isMuted: chat.dontDisturbUntil > 0, + chatType: "DIALOG", ); } else { if (chat.lastMsgSenderId != null ) { @@ -1077,6 +1078,7 @@ class _ChatListScreenState extends State isOnline: chat.isOnline, unreadCount: chat.unreadCount, isMuted: chat.dontDisturbUntil > 0, + chatType: chat.type, ); } }, childCount: _isInitialLoading ? 10 : chats.length), @@ -1679,6 +1681,7 @@ class _ChatListScreenState extends State bool isRead = false, int unreadCount = 0, bool isMuted = false, + String chatType = "CHAT", }) { final cs = Theme.of(context).colorScheme; final isSelected = _selectedChats.contains(id); @@ -1688,16 +1691,17 @@ class _ChatListScreenState extends State if (_isSelectionMode) { _toggleSelection(id); } else { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => ChatScreen( - chatId: int.parse(id), - name: name, - imageUrl: imageUrl, +Navigator.push( + context, + MaterialPageRoute( + builder: (context) => ChatScreen( + chatId: int.parse(id), + name: name, + imageUrl: imageUrl, + chatType: chatType, + ), ), - ), - ); + ); } }, onLongPress: () => _toggleSelection(id), diff --git a/lib/frontend/screens/chats/chat_screen.dart b/lib/frontend/screens/chats/chat_screen.dart index 28fb06d..f127ce2 100644 --- a/lib/frontend/screens/chats/chat_screen.dart +++ b/lib/frontend/screens/chats/chat_screen.dart @@ -14,12 +14,14 @@ class ChatScreen extends StatefulWidget { final int chatId; final String name; final String imageUrl; + final String chatType; const ChatScreen({ super.key, required this.chatId, required this.name, required this.imageUrl, + required this.chatType, }); @override @@ -469,6 +471,43 @@ class _ChatScreenState extends State Widget _buildInputArea(BuildContext context) { final cs = Theme.of(context).colorScheme; final mutedIcon = cs.onSurfaceVariant.withValues(alpha: 0.85); + + if (widget.chatType == "CHANNEL") { + return SafeArea( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0), + child: GestureDetector( + onTap: () {}, + child: Container( + width: double.infinity, + padding: const EdgeInsets.symmetric(vertical: 16), + decoration: BoxDecoration( + color: Color.alphaBlend( + cs.surfaceContainerHighest.withValues(alpha: 0.92), + cs.surface, + ), + borderRadius: BorderRadius.circular(28), + border: Border.all( + color: cs.outlineVariant.withValues(alpha: 0.5), + width: 0.5, + ), + ), + child: Center( + child: Text( + 'Отключить уведомления', + style: TextStyle( + color: cs.onSurface, + fontSize: 16, + fontWeight: FontWeight.w500, + ), + ), + ), + ), + ), + ), + ); + } + return SafeArea( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 8.0), diff --git a/lib/frontend/widgets/message_bubble.dart b/lib/frontend/widgets/message_bubble.dart index 74c4ed9..819b7cc 100644 --- a/lib/frontend/widgets/message_bubble.dart +++ b/lib/frontend/widgets/message_bubble.dart @@ -296,41 +296,41 @@ class MessageBubble extends StatelessWidget { return Padding( padding: EdgeInsets.only( - left: isMe ? 60 : 12, - right: isMe ? 12 : 60, + left: isMe ? 12 : 12, + right: isMe ? 12 : 12, top: topMargin, bottom: bottomMargin, ), child: Align( child: Row( mainAxisAlignment: isMe ? MainAxisAlignment.end : MainAxisAlignment.start, - spacing: 8.0, + crossAxisAlignment: CrossAxisAlignment.end, children: [ - if (senderAvatar != null && senderAvatar.isNotEmpty && !isMe && chatType != "DIALOG" - && nextMessage?.senderId != message.senderId && prevMessage?.senderId == message.senderId) - CircleAvatar( - radius: 15, - backgroundImage: NetworkImage(senderAvatar), - backgroundColor: cs.primaryContainer, - ) - else if (displaySender != null && !isMe && chatType != "DIALOG" - && nextMessage?.senderId != message.senderId && prevMessage?.senderId == message.senderId) - CircleAvatar( - radius: 15, - backgroundColor: cs.primaryContainer, - child: Text( - displaySender!.isNotEmpty - ? displaySender[0].toUpperCase() - : '?', - style: TextStyle(fontSize: 9, color: cs.onPrimaryContainer), - ), - ) - // Заглушка для паддинга - else - CircleAvatar( - radius: 15, - backgroundColor: Color(0x00000000) - ), + if (!isMe && chatType == "CHAT" && nextMessage?.senderId != message.senderId && prevMessage?.senderId == message.senderId) + ...(senderAvatar != null && senderAvatar.isNotEmpty) + ? [ + CircleAvatar( + radius: 15, + backgroundImage: NetworkImage(senderAvatar), + backgroundColor: cs.primaryContainer, + ) + ] + : [ + CircleAvatar( + radius: 15, + backgroundColor: cs.primaryContainer, + child: Text( + displaySender != null && displaySender.isNotEmpty + ? displaySender[0].toUpperCase() + : '?', + style: TextStyle(fontSize: 9, color: cs.onPrimaryContainer), + ), + ) + ] + else if (!isMe && chatType != "CHAT") + SizedBox(width: 0) + else if (!isMe) + CircleAvatar(radius: 15, backgroundColor: Color(0x00000000)), Container( constraints: BoxConstraints( maxWidth: MediaQuery.of(context).size.width * 0.75, @@ -389,11 +389,10 @@ class MessageBubble extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - if (message.senderId != message.accountId && prevMessage?.senderId != message.senderId) + if (message.senderId != message.accountId && prevMessage?.senderId != message.senderId && chatType == "CHAT") Text( displaySender ?? "", textAlign: TextAlign.left, - // TODO: Получение цветов по хешу ника style: TextStyle(color: cs.onPrimaryContainer) ), Row(