| 
									
										
										
										
											2022-08-04 17:24:02 +08:00
										 |  |  | import 'package:dash_chat_2/dash_chat_2.dart'; | 
					
						
							| 
									
										
										
										
											2022-02-28 21:26:44 +08:00
										 |  |  | import 'package:flutter/material.dart'; | 
					
						
							|  |  |  | import 'package:flutter_hbb/common.dart'; | 
					
						
							| 
									
										
										
										
											2022-03-03 14:58:57 +08:00
										 |  |  | import 'package:flutter_hbb/models/chat_model.dart'; | 
					
						
							|  |  |  | import 'package:provider/provider.dart'; | 
					
						
							| 
									
										
										
										
											2022-06-13 21:07:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-28 21:26:44 +08:00
										 |  |  | import 'home_page.dart'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-03 14:58:57 +08:00
										 |  |  | class ChatPage extends StatelessWidget implements PageShape { | 
					
						
							| 
									
										
										
										
											2022-08-11 10:19:12 +08:00
										 |  |  |   late final ChatModel chatModel; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ChatPage({ChatModel? chatModel}) { | 
					
						
							|  |  |  |     this.chatModel = chatModel ?? gFFI.chatModel; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-28 21:26:44 +08:00
										 |  |  |   @override | 
					
						
							| 
									
										
										
										
											2022-03-23 15:28:21 +08:00
										 |  |  |   final title = translate("Chat"); | 
					
						
							| 
									
										
										
										
											2022-02-28 21:26:44 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   final icon = Icon(Icons.chat); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							| 
									
										
										
										
											2022-03-25 16:34:27 +08:00
										 |  |  |   final appBarActions = [ | 
					
						
							|  |  |  |     PopupMenuButton<int>( | 
					
						
							| 
									
										
										
										
											2022-04-05 00:51:47 +08:00
										 |  |  |         icon: Icon(Icons.group), | 
					
						
							| 
									
										
										
										
											2022-03-25 16:34:27 +08:00
										 |  |  |         itemBuilder: (context) { | 
					
						
							| 
									
										
										
										
											2022-08-11 10:19:12 +08:00
										 |  |  |           // only mobile need [appBarActions], just bind gFFI.chatModel
 | 
					
						
							| 
									
										
										
										
											2022-06-13 21:07:26 +08:00
										 |  |  |           final chatModel = gFFI.chatModel; | 
					
						
							| 
									
										
										
										
											2022-03-25 16:34:27 +08:00
										 |  |  |           return chatModel.messages.entries.map((entry) { | 
					
						
							|  |  |  |             final id = entry.key; | 
					
						
							| 
									
										
										
										
											2022-05-16 00:01:27 +08:00
										 |  |  |             final user = entry.value.chatUser; | 
					
						
							| 
									
										
										
										
											2022-03-25 16:34:27 +08:00
										 |  |  |             return PopupMenuItem<int>( | 
					
						
							| 
									
										
										
										
											2022-08-04 17:24:02 +08:00
										 |  |  |               child: Text("${user.firstName}   ${user.id}"), | 
					
						
							| 
									
										
										
										
											2022-03-25 16:34:27 +08:00
										 |  |  |               value: id, | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |           }).toList(); | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         onSelected: (id) { | 
					
						
							| 
									
										
										
										
											2022-06-13 21:07:26 +08:00
										 |  |  |           gFFI.chatModel.changeCurrentID(id); | 
					
						
							| 
									
										
										
										
											2022-03-25 16:34:27 +08:00
										 |  |  |         }) | 
					
						
							|  |  |  |   ]; | 
					
						
							| 
									
										
										
										
											2022-02-28 21:26:44 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   @override | 
					
						
							|  |  |  |   Widget build(BuildContext context) { | 
					
						
							| 
									
										
										
										
											2022-03-25 16:34:27 +08:00
										 |  |  |     return ChangeNotifierProvider.value( | 
					
						
							| 
									
										
										
										
											2022-08-11 10:19:12 +08:00
										 |  |  |         value: chatModel, | 
					
						
							| 
									
										
										
										
											2022-03-25 16:34:27 +08:00
										 |  |  |         child: Container( | 
					
						
							|  |  |  |             color: MyTheme.grayBg, | 
					
						
							|  |  |  |             child: Consumer<ChatModel>(builder: (context, chatModel, child) { | 
					
						
							| 
									
										
										
										
											2022-04-04 14:54:00 +08:00
										 |  |  |               final currentUser = chatModel.currentUser; | 
					
						
							|  |  |  |               return Stack( | 
					
						
							|  |  |  |                 children: [ | 
					
						
							| 
									
										
										
										
											2022-08-16 23:07:22 +08:00
										 |  |  |                   LayoutBuilder(builder: (context, constraints) { | 
					
						
							|  |  |  |                     return DashChat( | 
					
						
							|  |  |  |                       onSend: (chatMsg) { | 
					
						
							|  |  |  |                         chatModel.send(chatMsg); | 
					
						
							|  |  |  |                       }, | 
					
						
							|  |  |  |                       currentUser: chatModel.me, | 
					
						
							|  |  |  |                       messages: chatModel | 
					
						
							|  |  |  |                               .messages[chatModel.currentID]?.chatMessages ?? | 
					
						
							|  |  |  |                           [], | 
					
						
							|  |  |  |                       messageOptions: MessageOptions( | 
					
						
							|  |  |  |                           showOtherUsersAvatar: false, | 
					
						
							|  |  |  |                           showTime: true, | 
					
						
							|  |  |  |                           maxWidth: constraints.maxWidth * 0.7, | 
					
						
							|  |  |  |                           messageDecorationBuilder: (_, __, ___) => | 
					
						
							|  |  |  |                               defaultMessageDecoration( | 
					
						
							|  |  |  |                                 color: MyTheme.accent80, | 
					
						
							|  |  |  |                                 borderTopLeft: 8, | 
					
						
							|  |  |  |                                 borderTopRight: 8, | 
					
						
							|  |  |  |                                 borderBottomRight: 8, | 
					
						
							|  |  |  |                                 borderBottomLeft: 8, | 
					
						
							|  |  |  |                               )), | 
					
						
							|  |  |  |                     ); | 
					
						
							|  |  |  |                   }), | 
					
						
							| 
									
										
										
										
											2022-04-04 14:54:00 +08:00
										 |  |  |                   chatModel.currentID == ChatModel.clientModeID | 
					
						
							|  |  |  |                       ? SizedBox.shrink() | 
					
						
							|  |  |  |                       : Padding( | 
					
						
							| 
									
										
										
										
											2022-04-05 00:51:47 +08:00
										 |  |  |                           padding: EdgeInsets.all(12), | 
					
						
							|  |  |  |                           child: Row( | 
					
						
							|  |  |  |                             children: [ | 
					
						
							|  |  |  |                               Icon(Icons.account_circle, | 
					
						
							|  |  |  |                                   color: MyTheme.accent80), | 
					
						
							|  |  |  |                               SizedBox(width: 5), | 
					
						
							|  |  |  |                               Text( | 
					
						
							| 
									
										
										
										
											2022-08-04 17:24:02 +08:00
										 |  |  |                                 "${currentUser.firstName}   ${currentUser.id}", | 
					
						
							| 
									
										
										
										
											2022-04-05 00:51:47 +08:00
										 |  |  |                                 style: TextStyle(color: MyTheme.accent50), | 
					
						
							|  |  |  |                               ), | 
					
						
							|  |  |  |                             ], | 
					
						
							|  |  |  |                           )), | 
					
						
							| 
									
										
										
										
											2022-04-04 14:54:00 +08:00
										 |  |  |                 ], | 
					
						
							| 
									
										
										
										
											2022-03-25 16:34:27 +08:00
										 |  |  |               ); | 
					
						
							|  |  |  |             }))); | 
					
						
							| 
									
										
										
										
											2022-03-03 14:58:57 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | } |