@ -8,6 +8,7 @@ import 'package:mc_common_app/classes/consts.dart';
import ' package:mc_common_app/extensions/string_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/generated/locale_keys.g.dart ' ;
import ' package:mc_common_app/main.dart ' ;
import ' package:mc_common_app/main.dart ' ;
import ' package:mc_common_app/models/advertisment_models/ad_details_model.dart ' ;
import ' package:mc_common_app/models/chat_models/chat_message_model.dart ' ;
import ' package:mc_common_app/models/chat_models/chat_message_model.dart ' ;
import ' package:mc_common_app/models/general_models/generic_resp_model.dart ' ;
import ' package:mc_common_app/models/general_models/generic_resp_model.dart ' ;
import ' package:mc_common_app/models/requests_models/provider_offers_model.dart ' ;
import ' package:mc_common_app/models/requests_models/provider_offers_model.dart ' ;
@ -46,6 +47,23 @@ class ChatVM extends ChangeNotifier {
notifyListeners ( ) ;
notifyListeners ( ) ;
}
}
bool isUserOnChatScreen = false ;
final ScrollController scrollController = ScrollController ( ) ;
void scrollChatDown ( ) {
if ( ! isUserOnChatScreen ) {
return ;
}
logger . i ( scrollController . position . maxScrollExtent ) ;
scrollController . animateTo (
scrollController . position . maxScrollExtent + 200 , / / for the text field
duration: const Duration ( seconds: 1 ) ,
curve: Curves . fastOutSlowIn ,
) ;
}
List < OfferRequestCommentModel > offerRejectModelList = [
List < OfferRequestCommentModel > offerRejectModelList = [
OfferRequestCommentModel (
OfferRequestCommentModel (
index: 0 ,
index: 0 ,
@ -69,10 +87,17 @@ class ChatVM extends ChangeNotifier {
) ,
) ,
] ;
] ;
OfferRequestCommentModel selectedOfferRequestCommentModel = OfferRequestCommentModel (
index: 3 ,
isSelected: true ,
title: LocaleKeys . otherVar . tr ( ) ,
) ;
void updateSelectionInOfferRejectModelList ( int index ) {
void updateSelectionInOfferRejectModelList ( int index ) {
for ( var value in offerRejectModelList ) {
for ( var value in offerRejectModelList ) {
value . isSelected = false ;
value . isSelected = false ;
}
}
selectedOfferRequestCommentModel = offerRejectModelList [ index ] ;
offerRejectModelList [ index ] . isSelected = true ;
offerRejectModelList [ index ] . isSelected = true ;
notifyListeners ( ) ;
notifyListeners ( ) ;
}
}
@ -89,6 +114,9 @@ class ChatVM extends ChangeNotifier {
/ / REJECTING OFFER
/ / REJECTING OFFER
bool isRejectOfferButtonValidated ( ) {
bool isRejectOfferButtonValidated ( ) {
if ( selectedOfferRequestCommentModel . index ! = offerRejectModelList . length - 1 ) {
return true ;
}
bool isValidated = true ;
bool isValidated = true ;
if ( rejectOfferDescription . isEmpty ) {
if ( rejectOfferDescription . isEmpty ) {
rejectOfferDescriptionError = GlobalConsts . descriptionError ;
rejectOfferDescriptionError = GlobalConsts . descriptionError ;
@ -102,35 +130,32 @@ class ChatVM extends ChangeNotifier {
return isValidated ;
return isValidated ;
}
}
Future < void > onNewMessageReceived ( { required List < ChatMessageModel > messages , required BuildContext context , bool isMyOwnOffer = false } ) async {
Future < void > onNewMessageReceived ( { required List < ChatMessageModel > messages , bool isMyOwnOffer = false , required RequestsVM requestsVM } ) async {
if ( AppState ( ) . currentAppType = = AppType . customer ) {
if ( AppState ( ) . currentAppType = = AppType . customer ) {
for ( var msg in messages ) {
for ( var msg in messages ) {
int providerIndex = serviceProviderOffersList . indexWhere ( ( element ) = > element . providerUserId = = msg . senderUserID ) ; / / TODO : NEED TO BE CHECKED
int providerIndex = serviceProviderOffersList . indexWhere ( ( element ) = > element . providerUserId = = msg . senderUserID ) ;
if ( providerIndex ! = - 1 ) {
if ( providerIndex ! = - 1 ) {
serviceProviderOffersList [ providerIndex ] . chatMessages ! . add ( msg ) ;
serviceProviderOffersList [ providerIndex ] . chatMessages ! . add ( msg ) ;
scrollChatDown ( ) ;
}
}
}
}
/ / providerUserId
} else {
} else {
for ( var msg in messages ) {
for ( var msg in messages ) {
logger . i ( msg ) ;
/ / Where we need to call this function for saving a message in chat we will use receiverUserID and in those cases where received ID is null , it means it is a signal R call
/ / Where we need to call this function for saving a message in chat we will use receiverUserID and in those cases where received ID is null , it means it is a signal R call
int providerIndex = - 1 ;
int providerIndex = - 1 ;
if ( isMyOwnOffer ) {
if ( isMyOwnOffer ) {
providerIndex = context . read < RequestsVM > ( ) . myFilteredRequests . indexWhere (
providerIndex = requestsVM . myFilteredRequests . indexWhere ( ( element ) = > ( element . customerUserID = = msg . receiverUserID & & element . id = = msg . requestID ) ) ;
( element ) = > element . customerUserID = = msg . receiverUserID ,
) ;
} else {
} else {
providerIndex = context . read < RequestsVM > ( ) . myFilteredRequests . indexWhere (
providerIndex = requestsVM . myFilteredRequests . indexWhere ( ( element ) = > ( element . customerUserID = = msg . senderUserID & & element . id = = msg . requestID ) ) ;
( element ) = > element . customerUserID = = msg . senderUserID ,
) ;
}
}
log ( " providerIndex: $ providerIndex " ) ;
if ( providerIndex ! = - 1 ) {
if ( providerIndex ! = - 1 ) {
context . read < RequestsVM > ( ) . addChatMessagesInRequestsModel ( msg: msg , index: providerIndex ) ;
requestsVM . addChatMessagesInRequestsModel ( msg: msg , index: providerIndex ) ;
scrollChatDown ( ) ;
}
}
}
}
}
}
notifyListeners ( ) ;
notifyListeners ( ) ;
}
}
@ -139,16 +164,28 @@ class ChatVM extends ChangeNotifier {
try {
try {
hubConnection = await chatRepo . getHubConnection ( ) ;
hubConnection = await chatRepo . getHubConnection ( ) ;
await hubConnection ! . start ( ) ;
await hubConnection ! . start ( ) ;
hubConnection ! . on ( " ReceiveMessageRequestOffer " , ( List < Object ? > ? arguments ) {
hubConnection ! . on ( SignalrConsts . receiveMessageRequestOffer , ( List < Object ? > ? arguments ) {
if ( arguments = = null | | arguments . isEmpty ) return ;
if ( arguments = = null | | arguments . isEmpty ) return ;
List < ChatMessageModel > chat = [ ] ;
List < ChatMessageModel > chat = [ ] ;
for ( var message in arguments ) {
for ( var message in arguments ) {
final chatMessage = ChatMessageModel . fromJson ( message as Map < String , dynamic > ) ;
final chatMessage = ChatMessageModel . fromJson ( message as Map < String , dynamic > ) ;
chat . add ( chatMessage ) ;
chat . add ( chatMessage ) ;
}
}
onNewMessageReceived ( messages: chat , context: context ) ;
onNewMessageReceived ( messages: chat , requestsVM: context . read < RequestsVM > ( ) ) ;
logger . i ( " I received ping : ${ arguments . toString ( ) } " ) ;
logger . i ( arguments ) ;
Utils . showToast ( arguments . toString ( ) ) ;
} ) ;
} ) ;
hubConnection ! . onclose ( ( exception ) {
logger . i ( " onClose: ${ exception . toString ( ) } " ) ;
buildHubConnection ( context ) ;
} ) ;
hubConnection ! . onreconnecting ( ( exception ) = > ( ) {
logger . i ( " onReconnecting: ${ exception . toString ( ) } " ) ;
} ) ;
hubConnection ! . onreconnected ( ( connectionId ) = > ( ) {
logger . i ( " onReconnected: ${ connectionId . toString ( ) } " ) ;
} ) ;
} catch ( e ) {
} catch ( e ) {
logger . i ( " Error: ${ e . toString ( ) } " ) ;
logger . i ( " Error: ${ e . toString ( ) } " ) ;
}
}
@ -157,7 +194,7 @@ class ChatVM extends ChangeNotifier {
}
}
}
}
Future < bool > on SendMessage ForRequestOffer ( {
Future < bool > on Offer SendForRequest( {
required String receiverId ,
required String receiverId ,
required ChatMessageTypeEnum chatMessageType ,
required ChatMessageTypeEnum chatMessageType ,
required String message ,
required String message ,
@ -166,12 +203,13 @@ class ChatVM extends ChangeNotifier {
required BuildContext context ,
required BuildContext context ,
} ) async {
} ) async {
if ( hubConnection = = null | | hubConnection ! . state ! = HubConnectionState . connected ) {
if ( hubConnection = = null | | hubConnection ! . state ! = HubConnectionState . connected ) {
logger . i ( " Hub Not Connected!! " ) ;
await buildHubConnection ( context ) ;
await buildHubConnection ( context ) ;
}
}
if ( hubConnection ! . state = = HubConnectionState . connected ) {
if ( hubConnection ! . state = = HubConnectionState . connected ) {
final providerId = AppState ( ) . getUser . data ! . userInfo ! . providerId ;
final providerId = AppState ( ) . getUser . data ! . userInfo ! . providerId ;
hubConnection ! . invoke (
hubConnection ! . invoke (
" SendMessageRequestOffer " ,
SignalrConsts . sendMessageRequestOffer ,
args: < Object > [
args: < Object > [
< String , dynamic > {
< String , dynamic > {
" ReceiverUserID " : receiverId ,
" ReceiverUserID " : receiverId ,
@ -196,12 +234,14 @@ class ChatVM extends ChangeNotifier {
}
}
logger . i ( < String , dynamic > {
logger . i ( < String , dynamic > {
" ID " : " " , / / here should be req offer ID
" ReceiverUserID " : receiverId ,
" ReceiverUserID " : receiverId ,
" MessageType " : chatMessageType . getIdFromChatMessageTypeEnum ( ) ,
" MessageType " : chatMessageType . getIdFromChatMessageTypeEnum ( ) ,
" ChatText " : message ,
" ChatText " : message ,
" RequestID " : requestId ,
" RequestID " : requestId ,
" ReqOfferID " : 0 ,
" ReqOfferID " : 0 ,
" ReqOffer " : < String , dynamic > {
" ReqOffer " : < String , dynamic > {
" ID " : " " ,
" RequestID " : requestId ,
" RequestID " : requestId ,
" Price " : double . parse ( offerPrice ) ,
" Price " : double . parse ( offerPrice ) ,
" ServiceProviderID " : AppState ( ) . getUser . data ! . userInfo ! . providerId ,
" ServiceProviderID " : AppState ( ) . getUser . data ! . userInfo ! . providerId ,
@ -212,7 +252,7 @@ class ChatVM extends ChangeNotifier {
return true ;
return true ;
}
}
Future < bool > onTextMessageSend ( {
Future < bool > onTextMessageSend ForRequest ( {
required String receiverId ,
required String receiverId ,
required ChatMessageTypeEnum chatMessageType ,
required ChatMessageTypeEnum chatMessageType ,
required String message ,
required String message ,
@ -223,6 +263,8 @@ class ChatVM extends ChangeNotifier {
if ( message . isEmpty ) return false ;
if ( message . isEmpty ) return false ;
if ( hubConnection = = null | | hubConnection ! . state ! = HubConnectionState . connected ) {
if ( hubConnection = = null | | hubConnection ! . state ! = HubConnectionState . connected ) {
logger . i ( " Hub Not Connected!! " ) ;
await buildHubConnection ( context ) ;
await buildHubConnection ( context ) ;
}
}
if ( hubConnection ! . state = = HubConnectionState . connected ) {
if ( hubConnection ! . state = = HubConnectionState . connected ) {
@ -236,10 +278,11 @@ class ChatVM extends ChangeNotifier {
" ChatText " : message ,
" ChatText " : message ,
" RequestID " : requestId ,
" RequestID " : requestId ,
" ReqOfferID " : latestOfferId ,
" ReqOfferID " : latestOfferId ,
/ / " ReqOffer " : { }
} ) ) ;
} ) ) ;
hubConnection ! . invoke (
hubConnection ! . invoke (
" SendMessageRequestOffer " ,
SignalrConsts . sendMessageRequestOffer ,
args: < Object > [
args: < Object > [
< String , dynamic > {
< String , dynamic > {
" ReceiverUserID " : receiverId ,
" ReceiverUserID " : receiverId ,
@ -248,6 +291,7 @@ class ChatVM extends ChangeNotifier {
" ChatText " : message ,
" ChatText " : message ,
" RequestID " : requestId ,
" RequestID " : requestId ,
" ReqOfferID " : latestOfferId ,
" ReqOfferID " : latestOfferId ,
/ / " ReqOffer " : { }
}
}
] ,
] ,
) . catchError ( ( e ) {
) . catchError ( ( e ) {
@ -273,7 +317,8 @@ class ChatVM extends ChangeNotifier {
serviceProviderOffersList [ providerIndex ] . chatMessages ! . add ( chatMessageModel ) ;
serviceProviderOffersList [ providerIndex ] . chatMessages ! . add ( chatMessageModel ) ;
}
}
} else {
} else {
int providerIndex = context . read < RequestsVM > ( ) . myFilteredRequests . indexWhere ( ( element ) = > element . customerUserID = = receiverId ) ;
int providerIndex = context . read < RequestsVM > ( ) . myFilteredRequests . indexWhere ( ( element ) = > ( element . customerUserID = = receiverId & & element . id = = requestId ) ) ;
log ( " providerIndex2: $ providerIndex " ) ;
if ( providerIndex ! = - 1 ) {
if ( providerIndex ! = - 1 ) {
context . read < RequestsVM > ( ) . addChatMessagesInRequestsModel ( msg: chatMessageModel , index: providerIndex ) ;
context . read < RequestsVM > ( ) . addChatMessagesInRequestsModel ( msg: chatMessageModel , index: providerIndex ) ;
}
}
@ -340,7 +385,7 @@ class ChatVM extends ChangeNotifier {
int providerId = AppState ( ) . getUser . data ! . userInfo ! . providerId ! ;
int providerId = AppState ( ) . getUser . data ! . userInfo ! . providerId ! ;
Utils . showLoading ( context ) ;
Utils . showLoading ( context ) ;
List < ChatMessageModel > chatMessages = await chatRepo . getUsersChatMessages ( providerId: providerId , customerId: customerId , requestOfferId: requestOfferId , requestId: requestId ) ;
List < ChatMessageModel > chatMessages = await chatRepo . getUsersChatMessages ( providerId: providerId , customerId: customerId , requestOfferId: requestOfferId , requestId: requestId ) ;
context . read < RequestsVM > ( ) . overwriteChatMessagesInRequestsModel ( messages: chatMessages , index: customerRequestIndex );
context . read < RequestsVM > ( ) . overwriteChatMessagesInRequestsModel ( messages: chatMessages , index: customerRequestIndex , context: context );
Utils . hideLoading ( context ) ;
Utils . hideLoading ( context ) ;
} catch ( e ) {
} catch ( e ) {
logger . i ( e . toString ( ) ) ;
logger . i ( e . toString ( ) ) ;
@ -349,11 +394,10 @@ class ChatVM extends ChangeNotifier {
}
}
}
}
Future < int > onActionOfferTapped ( { required BuildContext context , required RequestOfferStatusEnum requestOfferStatusEnum , required int reqOfferId }) async {
Future < int > onActionOfferTapped ( { required BuildContext context , required RequestOfferStatusEnum requestOfferStatusEnum , required int reqOfferId , required String comments }) async {
try {
try {
Utils . showLoading ( context ) ;
GenericRespModel genericRespModel = await requestRepo . updateOfferRequestStatus ( requestOfferStatusEnum: requestOfferStatusEnum , requestOfferId: reqOfferId , comments: comments ) ;
GenericRespModel genericRespModel = await requestRepo . updateOfferRequestStatus ( requestOfferStatusEnum: requestOfferStatusEnum , requestOfferId: reqOfferId ) ;
Utils . showToast ( genericRespModel . message . toString ( ) ) ;
Utils . hideLoading ( context ) ;
return genericRespModel . messageStatus = = 1 ? reqOfferId : - 1 ;
return genericRespModel . messageStatus = = 1 ? reqOfferId : - 1 ;
} catch ( e ) {
} catch ( e ) {
logger . i ( e . toString ( ) ) ;
logger . i ( e . toString ( ) ) ;
@ -362,4 +406,131 @@ class ChatVM extends ChangeNotifier {
return - 1 ;
return - 1 ;
}
}
}
}
Future < bool > onSendMessageForActionOnRequestOffer ( {
required String receiverId ,
required ChatMessageTypeEnum chatMessageType ,
required String comments ,
required int requestId ,
required int serviceProviderID ,
required int requestOfferID ,
required String offerPrice ,
required RequestOfferStatusEnum requestOfferStatusEnum ,
required BuildContext context ,
} ) async {
if ( hubConnection = = null | | hubConnection ! . state ! = HubConnectionState . connected ) {
logger . i ( " Hub Not Connected!! " ) ;
await buildHubConnection ( context ) ;
}
if ( hubConnection ! . state = = HubConnectionState . connected ) {
hubConnection ! . invoke (
SignalrConsts . sendMessageRequestOffer ,
args: < Object > [
< String , dynamic > {
" ReceiverUserID " : receiverId ,
" MessageType " : chatMessageType . getIdFromChatMessageTypeEnum ( ) ,
" ChatText " : comments ,
" RequestID " : requestId ,
" ReqOfferID " : requestOfferID ,
" ReqOffer " : < String , dynamic > {
" ID " : requestOfferID ,
" RequestID " : requestId ,
" Price " : double . parse ( offerPrice ) ,
" ServiceProviderID " : serviceProviderID ,
" OfferStatus " : requestOfferStatusEnum . getIdFromRequestOfferStatusEnum ( ) ,
" Comment " : comments ,
} ,
}
] ,
) . catchError ( ( e ) {
logger . i ( " error in invoking SendMessageRequestOffer: ${ e . toString ( ) } " ) ;
Utils . showToast ( e . toString ( ) ) ;
return false ;
} ) ;
}
logger . i ( < String , dynamic > {
" ReceiverUserID " : receiverId ,
" MessageType " : chatMessageType . getIdFromChatMessageTypeEnum ( ) ,
" ChatText " : comments ,
" RequestID " : requestId ,
" ReqOfferID " : 0 ,
" ReqOffer " : < String , dynamic > {
" ID " : requestOfferID ,
" RequestID " : requestId ,
" Price " : double . parse ( offerPrice ) ,
" ServiceProviderID " : serviceProviderID ,
" OfferStatus " : requestOfferStatusEnum . getIdFromRequestOfferStatusEnum ( ) ,
" Comment " : comments ,
} ,
} ) ;
return true ;
}
/ / = = = = = = = = = = = = = = = = = = = Ads = = = = = = = = = = = = = = = = = = = = = =
Future < bool > onTextMessageSendForAds ( {
required String receiverId ,
required ChatMessageTypeEnum chatMessageType ,
required String message ,
required AdDetailsModel adDetailsModel ,
required BuildContext context ,
} ) async {
if ( message . isEmpty ) return false ;
if ( hubConnection = = null | | hubConnection ! . state ! = HubConnectionState . connected ) {
logger . i ( " Hub Not Connected!! " ) ;
await buildHubConnection ( context ) ;
}
if ( hubConnection ! . state = = HubConnectionState . connected ) {
final userId = AppState ( ) . getUser . data ! . userInfo ! . userId . toString ( ) ;
final name = AppState ( ) . getUser . data ! . userInfo ! . firstName . toString ( ) ;
hubConnection ! . invoke (
SignalrConsts . sendMessageAds ,
args: < Object > [
< String , dynamic > {
" ReceiverUserID " : receiverId ,
" SenderUserID " : userId ,
" MessageType " : chatMessageType . getIdFromChatMessageTypeEnum ( ) ,
" ChatText " : message ,
" AdsID " : adDetailsModel . id ,
}
] ,
) . catchError ( ( e ) {
logger . i ( " error in invoking SendMessage: ${ e . toString ( ) } " ) ;
Utils . showToast ( e . toString ( ) ) ;
return false ;
} ) ;
ChatMessageModel chatMessageModel = ChatMessageModel (
messageType: chatMessageType . getIdFromChatMessageTypeEnum ( ) ,
chatText: message ,
isMyMessage: true ,
requestID: 0 ,
senderName: name ,
senderUserID: userId ,
chatMessageTypeEnum: ChatMessageTypeEnum . freeText ,
receiverUserID: receiverId ,
) ;
if ( AppState ( ) . currentAppType = = AppType . customer ) {
} else {
}
return true ;
}
return false ;
}
}
}