import 'package:dash_chat_2/dash_chat_2.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hbb/common.dart'; import 'package:flutter_hbb/models/chat_model.dart'; import 'package:provider/provider.dart'; import '../../mobile/pages/home_page.dart'; class ChatPage extends StatelessWidget implements PageShape { late final ChatModel chatModel; ChatPage({ChatModel? chatModel}) { this.chatModel = chatModel ?? gFFI.chatModel; } @override final title = translate("Chat"); @override final icon = Icon(Icons.chat); @override final appBarActions = [ PopupMenuButton( icon: Icon(Icons.group), itemBuilder: (context) { // only mobile need [appBarActions], just bind gFFI.chatModel final chatModel = gFFI.chatModel; return chatModel.messages.entries.map((entry) { final id = entry.key; final user = entry.value.chatUser; return PopupMenuItem( child: Text("${user.firstName} ${user.id}"), value: id, ); }).toList(); }, onSelected: (id) { gFFI.chatModel.changeCurrentID(id); }) ]; @override Widget build(BuildContext context) { return ChangeNotifierProvider.value( value: chatModel, child: Container( color: Theme.of(context).scaffoldBackgroundColor, child: Consumer(builder: (context, chatModel, child) { final currentUser = chatModel.currentUser; return Stack( children: [ LayoutBuilder(builder: (context, constraints) { final chat = DashChat( onSend: (chatMsg) { chatModel.send(chatMsg); chatModel.inputNode.requestFocus(); }, currentUser: chatModel.me, messages: chatModel .messages[chatModel.currentID]?.chatMessages ?? [], inputOptions: InputOptions( sendOnEnter: true, focusNode: chatModel.inputNode, inputTextStyle: TextStyle( fontSize: 14, color: Theme.of(context) .textTheme .titleLarge ?.color), inputDecoration: isDesktop ? InputDecoration( isDense: true, hintText: "${translate('Write a message')}...", filled: true, fillColor: Theme.of(context).backgroundColor, contentPadding: EdgeInsets.all(10), border: OutlineInputBorder( borderRadius: BorderRadius.circular(6), borderSide: const BorderSide( width: 0, style: BorderStyle.none, ), ), ) : defaultInputDecoration( hintText: "${translate('Write a message')}...", fillColor: Theme.of(context).backgroundColor), sendButtonBuilder: defaultSendButton( padding: EdgeInsets.symmetric( horizontal: 6, vertical: 0), color: Theme.of(context).colorScheme.primary)), messageOptions: MessageOptions( showOtherUsersAvatar: false, textColor: Colors.white, maxWidth: constraints.maxWidth * 0.7, messageTextBuilder: (message, _, __) { final isOwnMessage = message.user.id == currentUser.id; return Column( crossAxisAlignment: isOwnMessage ? CrossAxisAlignment.end : CrossAxisAlignment.start, children: [ Text(message.text, style: TextStyle(color: Colors.white)), Padding( padding: const EdgeInsets.only(top: 5), child: Text( "${message.createdAt.hour}:${message.createdAt.minute}", style: TextStyle( color: Colors.white, fontSize: 10, ), ), ), ], ); }, messageDecorationBuilder: (_, __, ___) => defaultMessageDecoration( color: MyTheme.accent80, borderTopLeft: 8, borderTopRight: 8, borderBottomRight: 8, borderBottomLeft: 8, )), ); return SelectionArea(child: chat); }), desktopType == DesktopType.cm || chatModel.currentID == ChatModel.clientModeID ? SizedBox.shrink() : Padding( padding: EdgeInsets.all(12), child: Row( children: [ Icon(Icons.account_circle, color: MyTheme.accent80), SizedBox(width: 5), Text( "${currentUser.firstName} ${currentUser.id}", style: TextStyle(color: MyTheme.accent50), ), ], )), ], ); }))); } }