async Task <int> FetchOldMessages(CancellationToken token) { var options = GitterApi.GetNewOptions(); options.Lang = Localisation.LocalCultureInfo.Name; options.AfterId = ""; if (Messages?.Any() ?? false) { options.BeforeId = GetFirstMessageId(); if (!token.IsCancellationRequested) { var count = await FetchNewMessages(options, token); await InvokeAsync(StateHasChanged); //await Task.Delay(100); //_ = await JSRuntime.ScrollIntoView(options.BeforeId); return(count); } } token.ThrowIfCancellationRequested(); return(0); }
async Task MonitorNewMessages() { RoomWatcher.Stop(); if (RoomWatcher.Interval == 250) { RoomWatcher.Interval = 2000; } var options = GitterApi.GetNewOptions(); options.Lang = Localisation.LocalCultureInfo.Name; options.AfterId = ""; bool bottom = false; try { bottom = await JSRuntime.IsScrolledToBottom("blgmessagelist"); } catch (Exception ex) { Console.WriteLine(ex); } if (Messages?.Any() ?? false) { options.AfterId = GetLastMessageId(); } await FetchNewMessages(options, tokenSource.Token); if (Messages?.Any() ?? false) { if (bottom) { _ = await JSRuntime.ScrollIntoView(GetLastMessageId()); } } RoomWatcher?.Start(); }
public MessagesViewModel(Room room, IGitterApi api = null, IScreen hostScreen = null) { this.HostScreen = hostScreen ?? Locator.Current.GetService <IScreen>(); this.Messages = new ReactiveList <MessageViewModel>(); this.UrlPathSegment = room.name; IObservable <string> accessToken = GitterApi.GetAccessToken().PublishLast().RefCount(); this.LoadMessages = ReactiveCommand.CreateAsyncObservable(_ => accessToken.SelectMany(token => (api ?? GitterApi.UserInitiated).GetMessages(room.id, token))); this.Users = new ReactiveList <UserViewModel>(); this.LoadUsers = ReactiveCommand.CreateAsyncObservable(_ => accessToken .SelectMany(token => (api ?? GitterApi.UserInitiated).GetRoomUsers(room.id, token)) .Select(users => users.OrderBy(user => user.displayName, StringComparer.CurrentCulture).Select(user => new UserViewModel(user)))); this.LoadUsers.Subscribe(x => { using (this.Users.SuppressChangeNotifications()) { this.Users.Clear(); this.Users.AddRange(x); } }); this.SendMessage = ReactiveCommand.CreateAsyncTask(this.WhenAnyValue(x => x.MessageText, x => !String.IsNullOrWhiteSpace(x)), async _ => { await(api ?? GitterApi.UserInitiated).SendMessage(room.id, new SendMessage(this.MessageText), await accessToken); this.MessageText = String.Empty; }); this.LoadMessages.FirstAsync().SelectMany(x => x.ToObservable()) .Concat(this.StreamMessages(room.id)) .Select(x => new MessageViewModel(x)) .Subscribe(x => { this.Messages.Insert(0, x); }); }
internal async Task MarkRead() { if (await slim.WaitAsync(1)) { try { if (MessageData.Unread) { await Task.Delay(1000); State.RecordActivity(); if (await GitterApi.MarkChatMessageAsRead(UserId, RoomId, MessageData.Id)) { MessageData.Unread = false; } } } catch { } finally { slim.Release(); } } }
async Task MonitorNewMessages() { RoomWatcher.Stop(); if (RoomWatcher.Interval == 250) { RoomWatcher.Interval = 2000; } var options = GitterApi.GetNewOptions(); options.Lang = Localisation.LocalCultureInfo.Name; options.AfterId = ""; //bool bottom = false; //try //{ // bottom = await JSRuntime.IsScrolledToBottom("blgmessagelist"); //} //catch //{ //} if (Messages?.Any() ?? false) { options.AfterId = GetLastMessageId(); } await FetchNewMessages(options, tokenSource.Token); //if (Messages?.Any() ?? false) //{ // if (bottom) // { // _ = await JSRuntime.ScrollIntoView(GetLastMessageId()); // } //} RoomWatcher?.Start(); }
private static IObservable <IEnumerable <RoomViewModel> > LoadRoomsImpl(IGitterApi api) { return(GitterApi.GetAccessToken() .SelectMany(api.GetRooms) .Select(rooms => rooms.OrderBy(room => room.name, StringComparer.CurrentCulture).Select(room => new RoomViewModel(room)))); }