|
|
|
@ -35,6 +35,20 @@ class ChatVM extends BaseVM {
|
|
|
|
HubConnection? hubConnection;
|
|
|
|
HubConnection? hubConnection;
|
|
|
|
bool _isSubscribed = false; // Track if listeners are subscribed
|
|
|
|
bool _isSubscribed = false; // Track if listeners are subscribed
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Store ViewModels to avoid context dependency
|
|
|
|
|
|
|
|
RequestsVM? _requestsVM;
|
|
|
|
|
|
|
|
AdVM? _adVM;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Track if a message is currently being sent (prevents duplicate sends)
|
|
|
|
|
|
|
|
bool isSendingMessage = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Method to inject ViewModels (called once from Dashboard)
|
|
|
|
|
|
|
|
void setViewModels({required RequestsVM requestsVM, required AdVM adVM}) {
|
|
|
|
|
|
|
|
_requestsVM = requestsVM;
|
|
|
|
|
|
|
|
_adVM = adVM;
|
|
|
|
|
|
|
|
logger.i("ViewModels injected into ChatVM");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
String chatMessageText = "";
|
|
|
|
String chatMessageText = "";
|
|
|
|
|
|
|
|
|
|
|
|
updateChatMessageText(String value) {
|
|
|
|
updateChatMessageText(String value) {
|
|
|
|
@ -251,7 +265,12 @@ class ChatVM extends BaseVM {
|
|
|
|
notifyListeners();
|
|
|
|
notifyListeners();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void _subscribeToReceiveRequestOfferMessages(BuildContext context) {
|
|
|
|
void _subscribeToReceiveRequestOfferMessages() {
|
|
|
|
|
|
|
|
if (_requestsVM == null) {
|
|
|
|
|
|
|
|
logger.e("RequestsVM not set! Cannot subscribe to request offer messages.");
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
hubConnection!.on(SignalrConsts.receiveMessageRequestOffer, (List<Object?>? arguments) {
|
|
|
|
hubConnection!.on(SignalrConsts.receiveMessageRequestOffer, (List<Object?>? arguments) {
|
|
|
|
logger.i(arguments);
|
|
|
|
logger.i(arguments);
|
|
|
|
|
|
|
|
|
|
|
|
@ -261,9 +280,10 @@ class ChatVM extends BaseVM {
|
|
|
|
final chatMessage = ChatMessageModel.fromJson(message as Map<String, dynamic>, isForReqOfferImagesURLs: true);
|
|
|
|
final chatMessage = ChatMessageModel.fromJson(message as Map<String, dynamic>, isForReqOfferImagesURLs: true);
|
|
|
|
chat.add(chatMessage);
|
|
|
|
chat.add(chatMessage);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
onNewMessageReceivedForRequestOffer(messages: chat, requestsVM: context.read<RequestsVM>());
|
|
|
|
onNewMessageReceivedForRequestOffer(messages: chat, requestsVM: _requestsVM!);
|
|
|
|
// Utils.showToast(arguments.toString());
|
|
|
|
// Utils.showToast(arguments.toString());
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
logger.i("Subscribed to RequestOffer messages");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Future<bool> markMessagesAsRead(BuildContext context, List<int> messageIds, ChatTypeEnum chatTypeEnum) async {
|
|
|
|
Future<bool> markMessagesAsRead(BuildContext context, List<int> messageIds, ChatTypeEnum chatTypeEnum) async {
|
|
|
|
@ -346,13 +366,15 @@ class ChatVM extends BaseVM {
|
|
|
|
// Clear old listeners before subscribing (prevents duplicates)
|
|
|
|
// Clear old listeners before subscribing (prevents duplicates)
|
|
|
|
_clearAllListeners();
|
|
|
|
_clearAllListeners();
|
|
|
|
|
|
|
|
|
|
|
|
// Subscribe to messages (only if context is available for first-time connection)
|
|
|
|
// Subscribe to messages (no context needed anymore!)
|
|
|
|
// For reconnections, we'll re-subscribe without context
|
|
|
|
if (_requestsVM != null && _adVM != null) {
|
|
|
|
if (context != null) {
|
|
|
|
_subscribeToReceiveRequestOfferMessages();
|
|
|
|
_subscribeToReceiveRequestOfferMessages(context);
|
|
|
|
_subscribeToReceiveAdMessages();
|
|
|
|
_subscribeToReceiveAdMessages(context);
|
|
|
|
_subscribeToReceiveGeneralMessages();
|
|
|
|
_subscribeToReceiveGeneralMessages(context);
|
|
|
|
|
|
|
|
_isSubscribed = true;
|
|
|
|
_isSubscribed = true;
|
|
|
|
|
|
|
|
logger.i("All listeners subscribed successfully");
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
logger.w("ViewModels not injected yet. Listeners will be subscribed after injection.");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Configure handlers
|
|
|
|
// Configure handlers
|
|
|
|
@ -367,11 +389,21 @@ class ChatVM extends BaseVM {
|
|
|
|
_isSubscribed = false;
|
|
|
|
_isSubscribed = false;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
hubConnection!.onreconnected((connectionId) {
|
|
|
|
hubConnection!.onreconnected((connectionId) async {
|
|
|
|
logger.i("onReconnected: ${connectionId.toString()}");
|
|
|
|
logger.i("onReconnected: ${connectionId.toString()}");
|
|
|
|
// Re-subscribe after automatic reconnect (SignalR's own reconnect, not ours)
|
|
|
|
|
|
|
|
// This is safe because we clear listeners in onreconnecting
|
|
|
|
|
|
|
|
_retryCount = 0; // Reset on successful reconnect
|
|
|
|
_retryCount = 0; // Reset on successful reconnect
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ✅ CRITICAL FIX: Re-subscribe listeners after automatic reconnect
|
|
|
|
|
|
|
|
if (_requestsVM != null && _adVM != null) {
|
|
|
|
|
|
|
|
_clearAllListeners();
|
|
|
|
|
|
|
|
_subscribeToReceiveRequestOfferMessages();
|
|
|
|
|
|
|
|
_subscribeToReceiveAdMessages();
|
|
|
|
|
|
|
|
_subscribeToReceiveGeneralMessages();
|
|
|
|
|
|
|
|
_isSubscribed = true;
|
|
|
|
|
|
|
|
logger.i("✅ Listeners re-subscribed after automatic reconnection");
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
logger.e("❌ Cannot re-subscribe: ViewModels not set!");
|
|
|
|
|
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
} catch (e) {
|
|
|
|
} catch (e) {
|
|
|
|
logger.e("Error during hub connection setup: ${e.toString()}");
|
|
|
|
logger.e("Error during hub connection setup: ${e.toString()}");
|
|
|
|
@ -527,6 +559,16 @@ class ChatVM extends BaseVM {
|
|
|
|
}) async {
|
|
|
|
}) async {
|
|
|
|
if (chatMessageType == ChatMessageTypeEnum.freeText && message.isEmpty) return false;
|
|
|
|
if (chatMessageType == ChatMessageTypeEnum.freeText && message.isEmpty) return false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ✅ Prevent duplicate sends
|
|
|
|
|
|
|
|
if (isSendingMessage) {
|
|
|
|
|
|
|
|
logger.w("Message already being sent, ignoring duplicate tap");
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
isSendingMessage = true;
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
// Ensure connection is established
|
|
|
|
// Ensure connection is established
|
|
|
|
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) {
|
|
|
|
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) {
|
|
|
|
logger.i("Hub Not Connected!! Attempting to connect...");
|
|
|
|
logger.i("Hub Not Connected!! Attempting to connect...");
|
|
|
|
@ -538,6 +580,8 @@ class ChatVM extends BaseVM {
|
|
|
|
// Check again after attempt
|
|
|
|
// Check again after attempt
|
|
|
|
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) {
|
|
|
|
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) {
|
|
|
|
Utils.showToast("Failed to connect. Please try again.");
|
|
|
|
Utils.showToast("Failed to connect. Please try again.");
|
|
|
|
|
|
|
|
isSendingMessage = false;
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -590,21 +634,38 @@ class ChatVM extends BaseVM {
|
|
|
|
serviceProviderOffersList[providerIndex].chatMessages!.add(chatMessageModel);
|
|
|
|
serviceProviderOffersList[providerIndex].chatMessages!.add(chatMessageModel);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
int providerIndex = context.read<RequestsVM>().myFilteredRequests.indexWhere((element) => (element.customerUserID == receiverId && element.id == requestId));
|
|
|
|
// ✅ Use stored RequestsVM instead of context.read
|
|
|
|
|
|
|
|
if (_requestsVM != null) {
|
|
|
|
|
|
|
|
int providerIndex = _requestsVM!.myFilteredRequests.indexWhere((element) => (element.customerUserID == receiverId && element.id == requestId));
|
|
|
|
log("providerIndex2:$providerIndex");
|
|
|
|
log("providerIndex2:$providerIndex");
|
|
|
|
if (providerIndex != -1) {
|
|
|
|
if (providerIndex != -1) {
|
|
|
|
context.read<RequestsVM>().addChatMessagesInRequestsModel(msg: chatMessageModel, index: providerIndex);
|
|
|
|
_requestsVM!.addChatMessagesInRequestsModel(msg: chatMessageModel, index: providerIndex);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
isSendingMessage = false;
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
} catch (e) {
|
|
|
|
} catch (e) {
|
|
|
|
logger.e("error in invoking SendMessage: ${e.toString()}");
|
|
|
|
logger.e("error in invoking SendMessage: ${e.toString()}");
|
|
|
|
Utils.showToast("Failed to send message");
|
|
|
|
Utils.showToast("Failed to send message");
|
|
|
|
|
|
|
|
isSendingMessage = false;
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
isSendingMessage = false;
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
|
|
logger.e("Unexpected error in onMessageSendForRequest: ${e.toString()}");
|
|
|
|
|
|
|
|
isSendingMessage = false;
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
List<ServiceProvidersOffers> serviceProviderOffersList = [];
|
|
|
|
List<ServiceProvidersOffers> serviceProviderOffersList = [];
|
|
|
|
|
|
|
|
|
|
|
|
@ -806,7 +867,12 @@ class ChatVM extends BaseVM {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void _subscribeToReceiveAdMessages(BuildContext context) {
|
|
|
|
void _subscribeToReceiveAdMessages() {
|
|
|
|
|
|
|
|
if (_adVM == null) {
|
|
|
|
|
|
|
|
logger.e("AdVM not set! Cannot subscribe to ad messages.");
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
hubConnection!.on(SignalrConsts.receiveMessageAds, (List<Object?>? arguments) {
|
|
|
|
hubConnection!.on(SignalrConsts.receiveMessageAds, (List<Object?>? arguments) {
|
|
|
|
if (arguments == null || arguments.isEmpty) return;
|
|
|
|
if (arguments == null || arguments.isEmpty) return;
|
|
|
|
List<ChatMessageModel> chat = [];
|
|
|
|
List<ChatMessageModel> chat = [];
|
|
|
|
@ -818,6 +884,7 @@ class ChatVM extends BaseVM {
|
|
|
|
logger.i(arguments);
|
|
|
|
logger.i(arguments);
|
|
|
|
// Utils.showToast(arguments.toString());
|
|
|
|
// Utils.showToast(arguments.toString());
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
logger.i("Subscribed to Ads messages");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Future<void> onNewMessageReceivedForAds({required List<ChatMessageModel> messages}) async {
|
|
|
|
Future<void> onNewMessageReceivedForAds({required List<ChatMessageModel> messages}) async {
|
|
|
|
@ -837,6 +904,16 @@ class ChatVM extends BaseVM {
|
|
|
|
}) async {
|
|
|
|
}) async {
|
|
|
|
if (message.isEmpty) return false;
|
|
|
|
if (message.isEmpty) return false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ✅ Prevent duplicate sends
|
|
|
|
|
|
|
|
if (isSendingMessage) {
|
|
|
|
|
|
|
|
logger.w("Message already being sent, ignoring duplicate tap");
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
isSendingMessage = true;
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
// Ensure connection is established
|
|
|
|
// Ensure connection is established
|
|
|
|
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) {
|
|
|
|
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) {
|
|
|
|
logger.i("Hub Not Connected!! Attempting to connect...");
|
|
|
|
logger.i("Hub Not Connected!! Attempting to connect...");
|
|
|
|
@ -848,6 +925,8 @@ class ChatVM extends BaseVM {
|
|
|
|
// Check again after attempt
|
|
|
|
// Check again after attempt
|
|
|
|
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) {
|
|
|
|
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) {
|
|
|
|
Utils.showToast("Failed to connect. Please try again.");
|
|
|
|
Utils.showToast("Failed to connect. Please try again.");
|
|
|
|
|
|
|
|
isSendingMessage = false;
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -886,14 +965,28 @@ class ChatVM extends BaseVM {
|
|
|
|
|
|
|
|
|
|
|
|
if (AppState().currentAppType == AppType.customer) {
|
|
|
|
if (AppState().currentAppType == AppType.customer) {
|
|
|
|
} else {}
|
|
|
|
} else {}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
isSendingMessage = false;
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
} catch (e) {
|
|
|
|
} catch (e) {
|
|
|
|
logger.e("error in invoking SendMessage: ${e.toString()}");
|
|
|
|
logger.e("error in invoking SendMessage: ${e.toString()}");
|
|
|
|
Utils.showToast("Failed to send message");
|
|
|
|
Utils.showToast("Failed to send message");
|
|
|
|
|
|
|
|
isSendingMessage = false;
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
isSendingMessage = false;
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
|
|
logger.e("Unexpected error in onTextMessageSendForAds: ${e.toString()}");
|
|
|
|
|
|
|
|
isSendingMessage = false;
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ========================General ==================
|
|
|
|
// ========================General ==================
|
|
|
|
@ -934,7 +1027,8 @@ class ChatVM extends BaseVM {
|
|
|
|
notifyListeners();
|
|
|
|
notifyListeners();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void _subscribeToReceiveGeneralMessages(BuildContext context) {
|
|
|
|
void _subscribeToReceiveGeneralMessages() {
|
|
|
|
|
|
|
|
// General messages don't need specific VM, just storing messages
|
|
|
|
hubConnection!.on(SignalrConsts.receiveMessageGeneral, (List<Object?>? arguments) {
|
|
|
|
hubConnection!.on(SignalrConsts.receiveMessageGeneral, (List<Object?>? arguments) {
|
|
|
|
if (arguments == null || arguments.isEmpty) return;
|
|
|
|
if (arguments == null || arguments.isEmpty) return;
|
|
|
|
List<ChatMessageModel> chat = [];
|
|
|
|
List<ChatMessageModel> chat = [];
|
|
|
|
@ -946,6 +1040,7 @@ class ChatVM extends BaseVM {
|
|
|
|
logger.i(arguments);
|
|
|
|
logger.i(arguments);
|
|
|
|
// Utils.showToast(arguments.toString());
|
|
|
|
// Utils.showToast(arguments.toString());
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
logger.i("Subscribed to General messages");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Future<bool> onTextMessageSendForGeneralChat({
|
|
|
|
Future<bool> onTextMessageSendForGeneralChat({
|
|
|
|
@ -957,6 +1052,16 @@ class ChatVM extends BaseVM {
|
|
|
|
}) async {
|
|
|
|
}) async {
|
|
|
|
if (message.isEmpty) return false;
|
|
|
|
if (message.isEmpty) return false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ✅ Prevent duplicate sends
|
|
|
|
|
|
|
|
if (isSendingMessage) {
|
|
|
|
|
|
|
|
logger.w("Message already being sent, ignoring duplicate tap");
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
isSendingMessage = true;
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
// Ensure connection is established
|
|
|
|
// Ensure connection is established
|
|
|
|
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) {
|
|
|
|
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) {
|
|
|
|
logger.i("Hub Not Connected!! Attempting to connect...");
|
|
|
|
logger.i("Hub Not Connected!! Attempting to connect...");
|
|
|
|
@ -968,6 +1073,8 @@ class ChatVM extends BaseVM {
|
|
|
|
// Check again after attempt
|
|
|
|
// Check again after attempt
|
|
|
|
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) {
|
|
|
|
if (hubConnection == null || hubConnection!.state != HubConnectionState.connected) {
|
|
|
|
Utils.showToast("Failed to connect. Please try again.");
|
|
|
|
Utils.showToast("Failed to connect. Please try again.");
|
|
|
|
|
|
|
|
isSendingMessage = false;
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -1003,13 +1110,27 @@ class ChatVM extends BaseVM {
|
|
|
|
|
|
|
|
|
|
|
|
if (AppState().currentAppType == AppType.customer) {
|
|
|
|
if (AppState().currentAppType == AppType.customer) {
|
|
|
|
} else {}
|
|
|
|
} else {}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
isSendingMessage = false;
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
} catch (e) {
|
|
|
|
} catch (e) {
|
|
|
|
logger.e("error in invoking SendMessage: ${e.toString()}");
|
|
|
|
logger.e("error in invoking SendMessage: ${e.toString()}");
|
|
|
|
Utils.showToast("Failed to send message");
|
|
|
|
Utils.showToast("Failed to send message");
|
|
|
|
|
|
|
|
isSendingMessage = false;
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
isSendingMessage = false;
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
|
|
logger.e("Unexpected error in onTextMessageSendForGeneralChat: ${e.toString()}");
|
|
|
|
|
|
|
|
isSendingMessage = false;
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|