コード例 #1
0
        private IDisposable BindLoading(
            IObservable <MessageLoadRequestedArgs> loadRequests,
            Target target,
            IMessageLoader messageLoader,
            IMessageModelFactory messageModelFactory)
        {
            switch (target)
            {
            case Chat chat:
                return(BindChatLoading(
                           loadRequests,
                           chat,
                           messageLoader,
                           messageModelFactory));

            case Aggregate aggregate:
                return(BindAggregateLoading(
                           loadRequests,
                           aggregate,
                           messageLoader,
                           messageModelFactory));
            }

            return(Disposable.Empty);
        }
コード例 #2
0
 public MessageManager(
     IMessageLoader messageLoader,
     IMessageModelFactory messageModelFactory)
 {
     _messageLoader       = messageLoader;
     _messageModelFactory = messageModelFactory;
 }
コード例 #3
0
        public ExplorerProvider(
            Target target,
            IExplorerTrigger trigger,
            IMessageLoader messageLoader,
            IMessageModelFactory messageModelFactory,
            IAvatarManager avatarManager
            )
        {
            _items = new SourceList <ItemModel>();

            var loadRequests = Observable.FromEventPattern <MessageLoadRequestedArgs>(
                h => trigger.MessageLoadRequested += h,
                h => trigger.MessageLoadRequested -= h)
                               .Select(args => args.EventArgs);

            BindLoading(loadRequests, target, messageLoader, messageModelFactory)
            .DisposeWith(_serviceDisposable);

            var visibleRangeChanges = Observable.FromEventPattern <VisibleRangeNotifiedArgs>(
                h => trigger.VisibleRangeNotified += h,
                h => trigger.VisibleRangeNotified -= h)
                                      .Select(args => args.EventArgs);

            BindAvatarLoading(visibleRangeChanges, avatarManager)
            .DisposeWith(_serviceDisposable);

            BindMediaLoading(visibleRangeChanges)
            .DisposeWith(_serviceDisposable);
        }
コード例 #4
0
 private IDisposable BindAggregateLoading(
     IObservable <MessageLoadRequestedArgs> loadRequests,
     Aggregate aggregate,
     IMessageLoader messageLoader,
     IMessageModelFactory messageModelFactory)
 {
     throw new NotImplementedException();
 }
コード例 #5
0
 public InitMessageLoader(
     IChatLoader chatLoader,
     IMessageLoader messageLoader,
     IMessageModelFactory messageModelFactory)
 {
     _chatLoader          = chatLoader;
     _messageLoader       = messageLoader;
     _messageModelFactory = messageModelFactory;
 }
コード例 #6
0
        private IDisposable BindChatLoading(
            IObservable <MessageLoadRequestedArgs> loadRequests,
            Chat chat,
            IMessageLoader messageLoader,
            IMessageModelFactory messageModelFactory)
        {
            return(loadRequests
                   .ObserveOn(TaskPoolScheduler.Default)
                   .SelectMany(signal =>
            {
                var messages = signal.Direction == LoadDirection.Next
                        ? LoadNextMessages(chat, messageLoader)
                        : LoadPrevMessages(chat, messageLoader);

                return messages.Aggregate(new List <Message>(), (list, m) =>
                {
                    list.Add(m);
                    return list;
                })
                .Select(list => new
                {
                    Direction = signal.Direction,
                    Messages = list
                });
            })
                   .Subscribe(data =>
            {
                var direction = data.Direction;
                var models = data.Messages
                             .Select(messageModelFactory.CreateMessage)
                             .Reverse()
                             .ToList();

                switch (direction)
                {
                case LoadDirection.Prev:
                    _items.InsertRange(models, 0);
                    break;

                case LoadDirection.Next:
                    _items.AddRange(models);
                    break;
                }
            }));
        }
コード例 #7
0
        public static IDisposable BindPromoted(
            this HomeModel model,
            IChatLoader chatLoader,
            IMessageLoader messageLoader,
            IMessageModelFactory messageModelFactory)
        {
            model.PromotedMessages = new ObservableCollectionExtended <MessageModel>();

            return(chatLoader.LoadPromo()
                   .SelectSeq(chat =>
            {
                return messageLoader.LoadNextMessages(chat, 0, 10);
            })
                   .Accept(message =>
            {
                var messageModel = messageModelFactory.CreateMessage(message);
                model.PromotedMessages.Add(messageModel);
            }));
        }