import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:mohem_flutter_app/api/chat/chat_provider_model.dart'; import 'package:mohem_flutter_app/app_state/app_state.dart'; import 'package:mohem_flutter_app/classes/colors.dart'; import 'package:mohem_flutter_app/extensions/string_extensions.dart'; import 'package:mohem_flutter_app/extensions/widget_extensions.dart'; import 'package:mohem_flutter_app/generated/locale_keys.g.dart'; import 'package:mohem_flutter_app/ui/chat/chat_bubble.dart'; import 'package:mohem_flutter_app/widgets/app_bar_widget.dart'; import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart'; import 'package:provider/provider.dart'; import 'package:pull_to_refresh/pull_to_refresh.dart'; import 'package:swipe_to/swipe_to.dart'; class ChatDetailScreen extends StatelessWidget { ChatDetailScreen({Key? key}) : super(key: key); dynamic userDetails; late ChatProviderModel data; ScrollController scrollController = ScrollController(); RefreshController _refreshController = RefreshController(initialRefresh: false); void getMoreChat() async { if (userDetails != null) { data.paginationVal = data.paginationVal + 10; data.getSingleUserChatHistory(senderUID: AppState().chatDetails!.response!.id.toString(), receiverUID: userDetails["targetUser"].id, loadMore: true); } await Future.delayed(Duration(milliseconds: 1000)); _refreshController.refreshCompleted(); } @override Widget build(BuildContext context) { userDetails = ModalRoute.of(context)!.settings.arguments; data = Provider.of(context, listen: false); if (userDetails != null) data.getSingleUserChatHistory(senderUID: AppState().chatDetails!.response!.id.toString(), receiverUID: userDetails["targetUser"].id, loadMore: false); return Scaffold( backgroundColor: const Color(0xFFF8F8F8), appBar: AppBarWidget(context, title: userDetails["targetUser"].userName, showHomeButton: false, image: userDetails["targetUser"].image), body: Consumer( builder: (BuildContext context, ChatProviderModel m, Widget? child) { return (m.isLoading ? ChatHomeShimmer() : Column( children: [ Expanded( flex: 2, child: SmartRefresher( enablePullDown: true, enablePullUp: false, header: const MaterialClassicHeader( color: MyColors.gradiantEndColor, ), controller: _refreshController, onRefresh: getMoreChat, child: ListView.builder( controller: scrollController, shrinkWrap: true, itemCount: m.userChatHistory.length, padding: const EdgeInsets.only(top: 20), itemBuilder: (BuildContext context, int i) { return SwipeTo( iconColor: MyColors.lightGreenColor, child: ChatBubble( text: m.userChatHistory[i].contant.toString(), replyText: m.userChatHistory[i].userChatReplyResponse != null ? m.userChatHistory[i].userChatReplyResponse!.contant.toString() : "", isSeen: m.userChatHistory[i].isSeen == true ? true : false, isCurrentUser: m.userChatHistory[i].currentUserId == AppState().chatDetails!.response!.id ? true : false, isDelivered: m.userChatHistory[i].currentUserId == AppState().chatDetails!.response!.id && m.userChatHistory[i].isDelivered == true ? true : false, dateTime: m.dateFormte(m.userChatHistory[i].createdDate!), isReplied: m.userChatHistory[i].userChatReplyResponse != null ? true : false, userName: AppState().chatDetails!.response!.userName == m.userChatHistory[i].currentUserName.toString() ? "You" : m.userChatHistory[i].currentUserName.toString(), ), onRightSwipe: () { m.chatReply(m.userChatHistory[i]); }, ); }, ), ), ), if (m.isMsgReply) Row( children: [ Container( height: 80, color: MyColors.textMixColor, width: 6, ), Expanded( child: Container( height: 80, color: MyColors.black.withOpacity(0.10), child: ListTile( title: (AppState().chatDetails!.response!.userName == m.repliedMsg.first.currentUserName.toString() ? "You" : m.repliedMsg.first.currentUserName.toString()) .toText14(color: MyColors.lightGreenColor), subtitle: (m.repliedMsg.isNotEmpty ? m.repliedMsg.first.contant! : "").toText12(color: MyColors.white, maxLine: 2), trailing: GestureDetector( onTap: m.closeMe, child: Container( decoration: BoxDecoration( color: MyColors.white.withOpacity(0.5), borderRadius: const BorderRadius.all( Radius.circular(20), ), ), child: const Icon( Icons.close, size: 23, color: MyColors.white, ), ), ), ), ), ), ], ), if (m.isFileSelected && m.sFileType == ".png" || m.sFileType == ".jpeg" || m.sFileType == ".jpg") Card( margin: EdgeInsets.zero, elevation: 0, child: Padding( padding: const EdgeInsets.only(left: 20.0, right: 20, top: 20, bottom: 0), child: Card( margin: EdgeInsets.zero, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(0.0), ), elevation: 0, child: Container( height: 200, decoration: BoxDecoration( image: DecorationImage( image: FileImage( m.selectedFile, ), fit: BoxFit.cover), borderRadius: const BorderRadius.all( Radius.circular(0), ), ), child: const SizedBox( width: double.infinity, height: 200, ), ), ), ), ), Card( margin: EdgeInsets.zero, child: TextField( controller: m.message, decoration: InputDecoration( hintText: m.isFileSelected ? m.selectedFile.path.split("/").last : LocaleKeys.typeheretoreply.tr(), hintStyle: TextStyle(color: m.isFileSelected ? MyColors.darkTextColor : MyColors.grey98Color, fontSize: 14), border: InputBorder.none, focusedBorder: InputBorder.none, enabledBorder: InputBorder.none, errorBorder: InputBorder.none, disabledBorder: InputBorder.none, contentPadding: EdgeInsets.only(left: m.sFileType.isNotEmpty ? 10 : 20, right: m.sFileType.isNotEmpty ? 0 : 5, top: 20, bottom: 20), prefixIcon: m.sFileType.isNotEmpty ? Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, children: [ SvgPicture.asset( m.getType(m.sFileType), height: 30, width: 25, alignment: Alignment.center, fit: BoxFit.cover, ).paddingOnly(left: 20), ], ) : null, suffixIcon: SizedBox( width: 96, child: Row( mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.center, // added line children: [ if (m.sFileType.isNotEmpty) IconButton( padding: EdgeInsets.zero, alignment: Alignment.centerRight, icon: Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.end, mainAxisSize: MainAxisSize.max, children: [ Container( decoration: const BoxDecoration( color: MyColors.redA3Color, borderRadius: BorderRadius.all( Radius.circular(20), ), ), child: const Icon( Icons.close, size: 15, color: MyColors.white, ), ), ("Clear").toText11(color: MyColors.redA3Color).paddingOnly(left: 4), ], ), onPressed: () async { m.removeAttachment(); }, ), if (m.sFileType.isEmpty) RotationTransition( turns: const AlwaysStoppedAnimation(45 / 360), child: IconButton( padding: EdgeInsets.zero, alignment: Alignment.topRight, icon: const Icon( Icons.attach_file_rounded, size: 26, color: MyColors.grey3AColor, ), onPressed: () async { m.selectImageToUpload(context); }, ), ), IconButton( alignment: Alignment.centerRight, padding: EdgeInsets.zero, icon: SvgPicture.asset( "assets/icons/chat/chat_send_icon.svg", height: 26, width: 26, ), onPressed: () { m.sendChatMessage(userDetails["targetUser"].id, userDetails["targetUser"].userName); }, ) ], ), ).paddingOnly(right: 20), ), ), ), ], )); }, ), ); } }