public RoomModuleViewModel(IRoom room, IMessageBus bus, IUserCache userCache, IChatDocument chatDocument,
                                   IClipboardService clipboardService, IGlobalCommands commands)
        {
            _room         = room;
            _bus          = bus;
            _userCache    = userCache;
            _chatDocument = chatDocument;


            Topic = _room.Topic;

            Users = new ReactiveCollection <UserViewModel>();

            UserMessage = String.Empty;

            PostMessageCommand = new ReactiveCommand(this.ObservableForProperty(vm => vm.UserEditedMessage)
                                                     .Select(c => c.Value).StartWith(false));
            Subscribe(() => PostMessageCommand.Subscribe(HandlePostMessage));

            _messages = new List <RoomMessage>();


            Subscribe(() => _bus.RegisterMessageSource(
                          _bus.Listen <ConnectionState>()
                          .Where(msg => msg.RoomId == room.Id)
                          .Do(cs => IsConnected = cs.Connected)
                          .Where(cs => cs.Connected)
                          .Delay(TimeSpan.FromSeconds(10), RxApp.TaskpoolScheduler)
                          .Where(_ => _streamingStarted && IsConnected)
                          .Select(_ => new RequestRecentMessagesMessage(_room.Id))));
            ;
            Subscribe(
                () => _bus.Listen <MessagesReceivedMessage>().Where(msg => msg.RoomId == room.Id).SubscribeUI(HandleMessagesReceived));
            Subscribe(
                () =>
                _bus.Listen <RoomInfoReceivedMessage>().Where(msg => msg.Room.Id == _room.Id).SubscribeUI(HandleRoomInfoReceived));
            Subscribe(() => _bus.Listen <UsersUpdatedMessage>().SubscribeUI(HandleUsersUpdated));

            _bus.SendMessage(new RequestRecentMessagesMessage(room.Id));
            _bus.SendMessage(new RequestRoomInfoMessage(_room.Id));

            Subscribe(() => _bus.RegisterMessageSource(Observable.Interval(TimeSpan.FromMinutes(5)).Select(
                                                           _ => new RequestKeepAliveMessage(_room.Id))));

            PasteCommand = new ReactiveCommand();

            Subscribe(() => PasteCommand.Select(pc => clipboardService.GetClipboardItem())
                      .Where(ci => ci != null)
                      .Subscribe(ci => _chatDocument.AddPasteFile(_room, ci)));

            var leaveRoomCommand = commands.LeaveRoomCommand.OfType <int>().Where(id => id == _room.Id);

            Subscribe(_bus.RegisterMessageSource(leaveRoomCommand.Select(_ => new RequestStopStreamingMessage(_room.Id))));
            Subscribe(_bus.RegisterMessageSource(leaveRoomCommand.Select(_ => new RequestLeaveRoomMessage(_room.Id))));
            Subscribe(
                _bus.RegisterMessageSource(
                    leaveRoomCommand.Select(_ => new ActivateModuleByIdMessage(ModuleNames.MainCampfireView, ModuleIds.Lobby))));
        }
Esempio n. 2
0
        public ToastViewModel(ShowToastMessage showToastMessage, IChatDocument document, IMessageBus bus, IApplicationActivator activator)
        {
            _document          = document;
            _document.FontSize = 14;
            IsVisible          = true;
            RoomName           = showToastMessage.Message.Room.Name;
            _document.AddMessage(showToastMessage.Message.Message, showToastMessage.Message.User, null);

            CloseCommand    = new ReactiveCommand();
            ActivateCommand = new ReactiveCommand();

            Closed = Observable.Timer(TimeSpan.FromSeconds(showToastMessage.Action.SecondsVisible), RxApp.TaskpoolScheduler)
                     .Do(_ => IsClosing = true).Delay(TimeSpan.FromSeconds(2), RxApp.TaskpoolScheduler)
                     .Select(_ => Unit.Default)
                     .Merge(CloseCommand.Select(_ => Unit.Default))
                     .Merge(ActivateCommand.Select(_ => Unit.Default));

            Subscribe(() => bus.RegisterMessageSource(
                          ActivateCommand.Select(
                              _ => new ActivateModuleByIdMessage(ModuleNames.MainCampfireView, showToastMessage.Message.Room.Id))
                          .Do(_ => activator.Activate())));
        }
Esempio n. 3
0
        public ToastViewModel(ShowToastMessage showToastMessage, IChatDocument document, IMessageBus bus, IApplicationActivator activator)
        {
            _document = document;
            _document.FontSize = 14;
            IsVisible = true;
            RoomName = showToastMessage.Message.Room.Name;
            _document.AddMessage(showToastMessage.Message.Message, showToastMessage.Message.User, null);

            CloseCommand = new ReactiveCommand();
            ActivateCommand = new ReactiveCommand();

            Closed = Observable.Timer(TimeSpan.FromSeconds(showToastMessage.Action.SecondsVisible), RxApp.TaskpoolScheduler)
                 .Do(_ => IsClosing = true).Delay(TimeSpan.FromSeconds(2), RxApp.TaskpoolScheduler)
                 .Select(_ => Unit.Default)
                 .Merge(CloseCommand.Select(_ => Unit.Default))
                 .Merge(ActivateCommand.Select(_ => Unit.Default));

            Subscribe(() =>bus.RegisterMessageSource(
                ActivateCommand.Select(
                    _ => new ActivateModuleByIdMessage(ModuleNames.MainCampfireView, showToastMessage.Message.Room.Id))
                    .Do(_ => activator.Activate())));
        }