import 'dart:async'; import 'dart:convert'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:mohem_flutter_app/provider/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/int_extensions.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/main.dart'; import 'package:mohem_flutter_app/models/chat/call.dart'; import 'package:mohem_flutter_app/ui/chat/call/chat_outgoing_call_screen.dart'; import 'package:mohem_flutter_app/ui/chat/chat_bubble.dart'; import 'package:mohem_flutter_app/ui/landing/dashboard_screen.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:signalr_netcore/signalr_client.dart'; import 'package:swipe_to/swipe_to.dart'; class ChatDetailScreen extends StatefulWidget { // ignore: prefer_const_constructors_in_immutables ChatDetailScreen({Key? key}) : super(key: key); @override State createState() => _ChatDetailScreenState(); } class _ChatDetailScreenState extends State { dynamic userDetails; late ChatProviderModel data; final RefreshController _rc = RefreshController(initialRefresh: false); void getMoreChat() async { if (userDetails != null) { data.paginationVal = data.paginationVal + 10; if (userDetails != null) { data.getSingleUserChatHistory( senderUID: AppState().chatDetails!.response!.id!.toInt(), receiverUID: userDetails["targetUser"].id, loadMore: true, isNewChat: false, ); } } await Future.delayed( const Duration( milliseconds: 1000, ), ); _rc.loadComplete(); } @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!.toInt(), receiverUID: userDetails["targetUser"].id, loadMore: false, isNewChat: userDetails["isNewChat"], ); } return Scaffold( backgroundColor: MyColors.backgroundColor, appBar: AppBarWidget(context, title: userDetails["targetUser"].userName.toString().replaceAll(".", " ").capitalizeFirstofEach, showHomeButton: false, image: userDetails["targetUser"].image, actions: [ IconButton( onPressed: () { makeCall( callType: "AUDIO", con: hubConnection, ); }, icon: SvgPicture.asset( "assets/icons/chat/call.svg", width: 22, height: 22, ), ), IconButton( onPressed: () { makeCall( callType: "VIDEO", con: hubConnection, ); }, icon: SvgPicture.asset( "assets/icons/chat/video_call.svg", width: 20, height: 20, ), ), 10.width, ]), body: Consumer( builder: (BuildContext context, ChatProviderModel m, Widget? child) { return (m.isLoading ? ChatHomeShimmer() : Column( children: [ Expanded( flex: 2, child: SmartRefresher( enablePullDown: false, enablePullUp: true, onLoading: () { getMoreChat(); }, header: const MaterialClassicHeader( color: MyColors.gradiantEndColor, ), controller: _rc, reverse: true, child: ListView.builder( controller: m.scrollController, shrinkWrap: true, physics: const BouncingScrollPhysics(), reverse: 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().replaceAll(".", " ")) .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, right: 20, top: 20, bottom: 0, ), child: Card( margin: EdgeInsets.zero, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(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, context, ); }, ) ], ), ).paddingOnly( right: 20, ), ), ), ), ], )); }, ), ); } void makeCall({required String callType, required HubConnection con}) async { print("================== Make call Triggered ============================"); Map json = { "callerID": AppState().chatDetails!.response!.id!.toString(), "callReceiverID": userDetails["targetUser"].id.toString(), "notification_foreground": "true", "message": "Aamir is calling", "title": "Video Call", "type": callType == "VIDEO" ? "Video" : "Audio", "identity": AppState().chatDetails!.response!.userName, "name": AppState().chatDetails!.response!.title, "is_call": "true", "is_webrtc": "true", "contant": "Start video Call ${AppState().chatDetails!.response!.userName}", "contantNo": "775d1f11-62d9-6fcc-91f6-21f8c14559fb", "chatEventId": "3", "fileTypeId": null, "currentUserId": AppState().chatDetails!.response!.id!.toString(), "chatSource": "1", "userChatHistoryLineRequestList": [ { "isSeen": false, "isDelivered": false, "targetUserId": userDetails["targetUser"].id, "targetUserStatus": 4, } ], // "server": "https://192.168.8.163:8086", "server": "https://livecareturn.hmg.com:8086", }; CallDataModel callData = CallDataModel.fromJson(json); await Navigator.push( context, MaterialPageRoute( builder: (BuildContext context) => OutGoingCall( isVideoCall: callType == "VIDEO" ? true : false, OutGoingCallData: callData, ), ), ); } }