private async void ChatsServicesOnMensajeRecibido(object sender, ChatMensajeArgs e) { if (e.ChatRecibido != null && e.ChatRecibido.UltimoMensaje != null && !string.IsNullOrWhiteSpace(e.ChatRecibido.UltimoMensaje.Mensaje)) { bool mensajeYaExiste = false; if (Mensajes != null && Mensajes.Count > 0) { using (await _lockeable.LockAsync()) { mensajeYaExiste = Mensajes.Where(x => x.ConsecutivoMensaje == e.ChatRecibido.UltimoMensaje.Consecutivo && e.ChatRecibido.UltimoMensaje.Consecutivo > 0).Any(); } } // Si el mensaje no existe entonces lo muestro en el chat, mas que todo se usa para evitar que el mensaje que yo envie en este dispositivo lo muestre doble, ya que lo recibo tambien // Lo recibo tambien porque si escribo en este dispositivo pero estoy logeado en otro dispositivo el tambien debe recibir el mensaje aunque los dos estemos en la misma cuenta if (!mensajeYaExiste) { e.ChatRecibido.UltimoMensaje.CodigoChatRecibe = e.ChatRecibido.CodigoChatRecibe; e.ChatRecibido.UltimoMensaje.CodigoChatEnvia = e.ChatRecibido.Consecutivo; Device.BeginInvokeOnMainThread(async() => { using (await _lockeable.LockAsync()) { if (Mensajes != null) { Mensajes.Insert(0, new ChatMensajesModel(e.ChatRecibido.UltimoMensaje, Chat.CodigoChatRecibe)); } else { Mensajes = new ObservableRangeCollection <ChatMensajesModel>(new List <ChatMensajesModel> { new ChatMensajesModel(e.ChatRecibido.UltimoMensaje, Chat.CodigoChatRecibe) }); } } }); } } }
async Task CargarMensajes(int skipIndex, int takeIndex, bool isRefreshing = false) { if (!NoHayNadaMasParaCargar) { ChatsMensajesDTO chatMensaje = new ChatsMensajesDTO { CodigoChatEnvia = Chat.Consecutivo, CodigoChatRecibe = Chat.CodigoChatRecibe, SkipIndexBase = skipIndex, TakeIndexBase = takeIndex, ZonaHorariaGMTBase = _dateTimeHelper.DifferenceBetweenGMTAndLocalTimeZone }; if (isRefreshing && Mensajes != null) { chatMensaje.FechaFiltroBase = Mensajes.Max(x => x.ChatMensaje.FechaMensaje); } if (IsNotConnected) { return; } List <ChatsMensajesDTO> listaMensajes = await _chatsServices.ListarChatsMensajes(chatMensaje); if (listaMensajes != null) { if (listaMensajes.Count > 0) { using (await _lockeable.LockAsync()) { if (isRefreshing) { if (Mensajes == null) { Mensajes = new ObservableRangeCollection <ChatMensajesModel>(ChatMensajesModel.CrearListaMensajes(listaMensajes, Chat.CodigoChatRecibe)); } else { List <ChatMensajesModel> listaMensajesParaInsertar = ChatMensajesModel.CrearListaMensajes(listaMensajes, Chat.CodigoChatRecibe); foreach (ChatMensajesModel mensaje in listaMensajesParaInsertar) { Mensajes.Insert(0, mensaje); } } } else { listaMensajes.Reverse(); if (Mensajes == null) { Mensajes = new ObservableRangeCollection <ChatMensajesModel>(ChatMensajesModel.CrearListaMensajes(listaMensajes, Chat.CodigoChatRecibe)); } else { Mensajes.AddRange(ChatMensajesModel.CrearListaMensajes(listaMensajes, Chat.CodigoChatRecibe)); } } } } else { NoHayNadaMasParaCargar = listaMensajes.Count <= 0; } } } }