import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/models/chat_models/chat_message_model.dart'; import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/view_models/chat_view_model.dart'; import 'package:mc_common_app/view_models/payment_view_model.dart'; import 'package:mc_common_app/view_models/requests_view_model.dart'; import 'package:mc_common_app/views/chat/widgets/chat_bottom_sheets.dart'; import 'package:mc_common_app/views/chat/widgets/chat_message_widget.dart'; import 'package:mc_common_app/views/requests/request_bottomsheets.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:provider/provider.dart'; import 'package:easy_localization/easy_localization.dart' as lcl; class ChatView extends StatefulWidget { final ChatViewArguments chatViewArguments; const ChatView({super.key, required this.chatViewArguments}); @override State createState() => _ChatViewState(); } class _ChatViewState extends State { late ChatVM chatVM; late ChatTypeEnum chatTypeEnum; ChatViewArgumentsForRequest? chatViewArgumentsForRequest; ChatViewArgumentsForAd? chatViewArgumentsForAd; @override void initState() { chatTypeEnum = widget.chatViewArguments.chatTypeEnum; if (chatTypeEnum == ChatTypeEnum.ads) { chatViewArgumentsForAd = widget.chatViewArguments.chatViewArgumentsForAd; } else if (chatTypeEnum == ChatTypeEnum.requestOffer) { chatViewArgumentsForRequest = widget.chatViewArguments.chatViewArgumentsForRequest; } chatVM = context.read(); chatVM.isUserOnChatScreen = true; WidgetsBinding.instance.addPostFrameCallback((_) { if (chatVM.scrollController.hasClients) { chatVM.scrollChatDown(); } }); super.initState(); } @override void dispose() { chatVM.isUserOnChatScreen = false; super.dispose(); } Future onTextMessageSend() async { bool status = false; if (chatTypeEnum == ChatTypeEnum.requestOffer) { status = await chatVM.onTextMessageSendForRequest( context: context, receiverId: chatViewArgumentsForRequest!.receiverId, message: chatVM.chatMessageText, requestId: chatViewArgumentsForRequest!.requestId ?? 0, offerPrice: "0.0", chatMessageType: ChatMessageTypeEnum.freeText, ); } else if (chatTypeEnum == ChatTypeEnum.ads) { status = await chatVM.onTextMessageSendForAds( receiverId: chatViewArgumentsForAd!.receiverUserID ?? "", chatMessageType: ChatMessageTypeEnum.freeText, message: chatVM.chatMessageText, adId: chatViewArgumentsForAd!.adsID!, context: context, ); } else if (chatTypeEnum == ChatTypeEnum.general) { } else {} return status; } @override Widget build(BuildContext context) { return Scaffold( appBar: CustomAppBar(title: LocaleKeys.chat.tr()), body: Consumer2(builder: (BuildContext context, ChatVM chatVM, RequestsVM requestVM, Widget? child) { List chatMessages = []; if (chatTypeEnum == ChatTypeEnum.ads) { chatMessages = chatVM.currentMessagesForAds; } else if (chatTypeEnum == ChatTypeEnum.requestOffer) { if (AppState().currentAppType == AppType.customer && chatVM.serviceProviderOffersList.isNotEmpty) { chatMessages = chatVM.serviceProviderOffersList[chatViewArgumentsForRequest!.providerIndex].chatMessages ?? []; } else { chatMessages = requestVM.myFilteredRequests[chatViewArgumentsForRequest!.requestIndex].chatMessages; } } return Column( children: [ Expanded( child: chatMessages.isEmpty ? Center(child: LocaleKeys.noRequestsShow.tr().toText(fontSize: 16, color: MyColors.lightTextColor)) : ListView.separated( controller: chatVM.scrollController, itemCount: chatMessages.length, separatorBuilder: (BuildContext context, int index) => 20.height, itemBuilder: (BuildContext context, int index) { ChatMessageModel chatMessageModel = chatMessages[index]; return ChatMessageCustomWidget(chatMessageModel: chatMessageModel, requestStatusEnum: requestVM.currentSelectedRequest!.requestStatus); }, ).horPaddingMain(), ), 10.height, Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ if (chatTypeEnum == ChatTypeEnum.requestOffer && requestVM.currentSelectedRequest!.requestType.toRequestTypeStatusEnum() == RequestsTypeEnum.serviceRequest && requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.inProgress && AppState().currentAppType == AppType.customer) ...[ Expanded( child: ShowFillButton( maxWidth: double.infinity, margin: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), maxHeight: 55, title: LocaleKeys.reviewAndPayment.tr(), isBold: false, onPressed: () { context.read().updateRequestId(id: requestVM.currentSelectedRequest!.id); navigateWithName(context, AppRoutes.reviewRequestOffer, arguments: PaymentTypes.request); }, ), ), // Center( // child: LocaleKeys.requestAlreadyInProgress.tr().toText( // textAlign: TextAlign.center, // color: MyColors.lightTextColor, // fontSize: 14, // ), // ).paddingAll(15) ] else if (chatTypeEnum == ChatTypeEnum.requestOffer && requestVM.currentSelectedRequest!.requestType.toRequestTypeStatusEnum() == RequestsTypeEnum.specialCarRequest && requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.inProgress && AppState().currentAppType == AppType.customer) ...[ Expanded( child: ShowFillButton( maxWidth: double.infinity, margin: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), maxHeight: 55, title: LocaleKeys.completeDeal.tr(), isBold: false, onPressed: () { return dealCompletedConfirmationBottomSheet(mainContext: context, requestStatusEnum: RequestStatusEnum.completed, requestId: requestVM.currentSelectedRequest!.id); }, ), ), ] else ...[ if (AppState().currentAppType == AppType.provider && chatTypeEnum == ChatTypeEnum.requestOffer && requestVM.currentSelectedRequest!.requestStatus == RequestStatusEnum.submitted) ...[ Expanded( flex: 1, child: const Icon( Icons.local_offer_rounded, color: MyColors.darkPrimaryColor, size: 30, ).onPress( () { RequestDetailPageArguments requestDetailArguments = RequestDetailPageArguments(requestIndex: chatViewArgumentsForRequest!.requestIndex, requestModel: chatViewArgumentsForRequest!.requestModel!); buildSendOfferBottomSheet(context: context, requestDetailPageArguments: requestDetailArguments, isFromChatScreen: true); }, ), ), ], Expanded( flex: 8, child: TxtField( value: chatVM.chatMessageText, hint: LocaleKeys.typeMessageHere.tr(), keyboardType: TextInputType.text, isNeedBorder: false, onChanged: (v) => chatVM.updateChatMessageText(v), ), ), Expanded( flex: 1, child: const Icon( Icons.send_rounded, color: MyColors.darkPrimaryColor, size: 30, ).onPress( () async { final status = await onTextMessageSend(); if (status) { chatVM.scrollChatDown(); chatVM.clearChatMessageText(); } }, ), ), ], ], ).toContainer(isShadowEnabled: true) ], ); }), // body: ); } }