import 'package:fcs/constants.dart'; import 'package:fcs/domain/entities/package.dart'; import 'package:fcs/domain/entities/shipment.dart'; import 'package:fcs/domain/entities/user.dart'; import 'package:fcs/domain/vo/message.dart'; import 'package:fcs/helpers/theme.dart'; import 'package:fcs/pages/chat/model/message_model.dart'; import 'package:fcs/pages/customer/customer_editor.dart'; import 'package:fcs/pages/customer/model/customer_model.dart'; import 'package:fcs/pages/main/model/main_model.dart'; import 'package:fcs/pages/main/util.dart'; import 'package:fcs/pages/package/model/package_model.dart'; import 'package:fcs/pages/package/package_info.dart'; import 'package:fcs/pages/profile/profile_page.dart'; import 'package:fcs/pages/shipment/model/shipment_model.dart'; import 'package:fcs/pages/shipment/shipment_info.dart'; import 'package:fcs/pages/widgets/local_app_bar.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'bubble.dart'; class MessageDetail extends StatelessWidget { final String? receiverName; final String? receiverID; final MessageModel messageModel; final TextEditingController textEditingController = TextEditingController(); final ScrollController listScrollController = ScrollController(); MessageDetail( {Key? key, required this.messageModel, this.receiverName, this.receiverID}) : super(key: key) { listScrollController.addListener(() { if (listScrollController.offset >= listScrollController.position.maxScrollExtent && !listScrollController.position.outOfRange) { if (!messageModel.isEnded) messageModel.load(); } if (listScrollController.offset <= listScrollController.position.minScrollExtent && !listScrollController.position.outOfRange) {} }); } @override Widget build(BuildContext context) { String userID = Provider.of(context).user?.id ?? ""; return Scaffold( appBar: LocalAppBar( titleWidget: Text(receiverName ?? "FCS Team", style: TextStyle(color: Colors.white, fontSize: 20))), body: Padding( padding: EdgeInsets.all(16.0), child: Column( children: [ Expanded( child: ListView.builder( itemBuilder: (context, index) { var msg = messageModel.messages[index]; Message next; bool showDate = false; if (messageModel.messages.length > index + 1) { next = messageModel.messages[index + 1]; if (!msg.sameDay(next)) { showDate = true; } } if (messageModel.messages.length - 1 == index && messageModel.isEnded) { showDate = true; } return buildBubble( msg, userID, showDate, () => _viewDetail(context, msg)); }, itemCount: messageModel.messages.length, reverse: true, controller: listScrollController, )), buildInput(context), ], ), ), ); } Widget buildBubble(Message msg, String userID, bool showDate, CallbackOnViewDetail callback) { return Bubble( message: msg.message ?? "", date: msg.date!, delivered: true, sender: msg.senderName, isMine: msg.senderID == userID || msg.receiverID == receiverID, isCustomer: receiverID == null, showDate: showDate, isSystem: msg.messageType != null && msg.messageType != "", callbackOnViewDetail: callback, ); } Widget buildInput(BuildContext context) { return Container( padding: EdgeInsets.only(top: 3), child: Row( children: [ Flexible( child: Container( child: TextField( onSubmitted: (value) { Provider.of(context, listen: false).sendMessage( textEditingController.text, receiverID ?? ""); textEditingController.text = ""; }, style: TextStyle(color: primaryColor, fontSize: 15.0), maxLines: 10, minLines: 1, keyboardType: TextInputType.multiline, controller: textEditingController, cursorColor: primaryColor, decoration: InputDecoration( focusedBorder: const OutlineInputBorder( borderSide: const BorderSide(color: primaryColor, width: 1.0), ), border: new OutlineInputBorder( borderRadius: const BorderRadius.all(const Radius.circular(5.0)), ), hintText: getLocalString(context, "message.hint.input"), hintStyle: TextStyle( color: Colors.grey, ), ), ), ), ), // Button send message Material( child: Container( margin: EdgeInsets.symmetric(horizontal: 8.0), child: IconButton( icon: Icon(Icons.send), onPressed: () { Provider.of(context, listen: false).sendMessage( textEditingController.text, receiverID ?? ""); textEditingController.text = ""; }, color: primaryColor, ), ), color: Colors.white, ), ], ), width: double.infinity, decoration: BoxDecoration( border: Border(top: BorderSide(color: Colors.grey.shade700, width: 0.5)), color: Colors.white), ); } _viewDetail(BuildContext context, Message message) async { if (message.messageType == message_type_package && message.messageID != null && message.messageID != "") { PackageModel packageModel = Provider.of(context, listen: false); Package? p = await packageModel.getPackage(message.messageID!); if (p == null) return; Navigator.push(context, CupertinoPageRoute(builder: (context) => PackageInfo(package: p))); } if (message.messageType == message_type_profile && message.messageID != null && message.messageID != "") { MainModel mainModel = Provider.of(context, listen: false); if (mainModel.user?.isCustomer() ?? false) { Navigator.push( context, CupertinoPageRoute(builder: (context) => Profile())); } else { CustomerModel customerModel = Provider.of(context, listen: false); User user = await customerModel.getUser(message.messageID); Navigator.of(context).push(CupertinoPageRoute( builder: (context) => CustomerEditor(customer: user))); } } if (message.messageType == message_type_shipment && message.messageID != null && message.messageID != "") { ShipmentModel shipmentModel = Provider.of(context, listen: false); Shipment? s = await shipmentModel.getShipment(message.messageID!); if (s == null) return; await Navigator.push( context, CupertinoPageRoute( builder: (context) => ShipmentInfo( shipment: s, isCustomer: true, ))); } } }