157 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
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<int>(
 | 
						|
        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<int>(
 | 
						|
              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<ChatModel>(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).colorScheme.background,
 | 
						|
                                  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).colorScheme.background),
 | 
						|
                          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: <Widget>[
 | 
						|
                                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),
 | 
						|
                              ),
 | 
						|
                            ],
 | 
						|
                          )),
 | 
						|
                ],
 | 
						|
              );
 | 
						|
            })));
 | 
						|
  }
 | 
						|
}
 |