/// <summary> /// 模拟消息 /// </summary> /// <returns></returns> public async Task FakeMessaging() { //var shouldReply = new Random().Next(0, 3) > 0 ? true : false; var shouldReply = true; if (shouldReply) { ScrollToMessage(Messages.Last().Last()); IsTyping = true; await Task.Delay(TimeSpan.FromSeconds(3)); var message = new Message { Content = "你好,欢迎使用DCMS帮助服务,请问你有什么需要解答的吗?", CreationDate = DateTime.Now, Sender = CurrentConversation.Peer, ISentPreviousMessage = Messages.Last().Last().ISent, ISent = false, ConversationId = CurrentConversation.Id, SenderId = CurrentConversation.Peer.Id }; Messages.Last().Add(message); CurrentConversation.LastMessage = message; await _conversationsDataStore.UpdateItemAsync(CurrentConversation); IsTyping = false; ScrollToMessage(message); await _messagesDataStore.AddItemAsync(message); } }
public MessagerPageViewModel(INavigationService navigationService, IConversationsDataStore conversationsDataStore, IMessagesDataStore messagesDataStore, IDialogService dialogService ) : base(navigationService, dialogService) { Title = "帮助中心"; _conversationsDataStore = conversationsDataStore; _messagesDataStore = messagesDataStore; _messages = new List <Message>(); //回复 this.ReplyMessageSelectedCommand = ReactiveCommand.Create <Message>((message) => { ScrollToMessage(message); }); this.MessageSwippedCommand = ReactiveCommand.Create <Message>((message) => { ReplyMessage = message; MessagingCenter.Send(this, Constants.ShowKeyboard, new MyFocusEventArgs { IsFocused = true }); }); //发送消息 this.SendMessageCommand = ReactiveCommand.CreateFromTask(async() => { var message = new Message { Content = CurrentMessage, ReplyTo = ReplyMessage, CreationDate = DateTime.Now, Sender = new User(), ISentPreviousMessage = (bool)Messages?.Last()?.Last()?.ISent, ISent = true, ConversationId = CurrentConversation.Id, SenderId = new User().Id }; CurrentConversation.LastMessage = message; await _conversationsDataStore.UpdateItemAsync(CurrentConversation); CurrentMessage = string.Empty; Messages.Last().Add(message); ReplyMessage = null; await _messagesDataStore.AddItemAsync(message); CurrentConversation.LastMessage = message; ScrollToMessage(message); await FakeMessaging(); }, this.WhenAnyValue(vm => vm.CurrentMessage, curm => !String.IsNullOrEmpty(curm))); //取消回复 this.CancelReplyCommand = ReactiveCommand.Create(() => { ReplyMessage = null; MessagingCenter.Send(this, Constants.ShowKeyboard, new MyFocusEventArgs { IsFocused = false }); }); //初始化 this.Load = ReactiveCommand.CreateFromTask(() => Task.Run(async() => { //获取对话 this.CurrentConversation = await _conversationsDataStore.GetItemAsync(this.ConversationId); //获取消息 var messages = await _messagesDataStore.GetMessagesForConversation(this.ConversationId); _messages.AddRange(messages); var messagesGroups = _messages.GroupBy(m => m.CreationDate.Day) .Select(grp => { var messagesGrp = grp.ToList().OrderBy(m => m.CreationDate); var msg = messagesGrp.First(); var date = msg.CreationDate.Date; var dayDiff = DateTime.Now.Day - date.Day; string groupHeader = string.Empty; if (dayDiff == 0) { groupHeader = TextResources.Today; } else if (dayDiff == 1) { groupHeader = TextResources.Yesterday; } else { groupHeader = date.ToString("MM-dd-yyyy"); } return(new MessagesGroup ( dateTime: date, groupHeader: groupHeader, messages: new ObservableCollection <Message>(messagesGrp) )); }) .OrderBy(m => m.DateTime.Day) .ToList(); this.Messages = new ObservableCollection <MessagesGroup>(messagesGroups); await Task.Delay(TimeSpan.FromSeconds(0.5)); if (Messages.Any()) { ScrollToMessage(Messages?.Last()?.Last()); } })); this.BindBusyCommand(Load); }