public void ShouldIndicateWhenLoadingAndReady() => new TestScheduler().With(scheduler => { _providerStorage .Providers() .Returns(Observable.Return(new ChangeSet <IProvider, Guid>())); var model = BuildMainViewModel(scheduler); model.IsLoading.Should().BeFalse(); model.IsReady.Should().BeFalse(); model.Refresh.CanExecute(null).Should().BeTrue(); model.Refresh.Execute(null); scheduler.AdvanceBy(2); model.Providers.Should().BeEmpty(); model.IsLoading.Should().BeTrue(); model.IsReady.Should().BeFalse(); scheduler.AdvanceBy(2); model.Providers.Should().BeEmpty(); model.IsLoading.Should().BeFalse(); model.IsReady.Should().BeTrue(); });
public MainViewModel( ProviderViewModelFactory providerFactory, AuthViewModelFactory authFactory, IProviderStorage storage, IFileManager files, IScheduler current, IScheduler main) { _storage = storage; _refresh = ReactiveCommand.CreateFromTask( storage.Refresh, outputScheduler: main); var providers = storage.Providers(); providers.Transform(x => providerFactory(x, files, authFactory(x))) .ObserveOn(RxApp.MainThreadScheduler) .StartWithEmpty() .Bind(out _providers) .Subscribe(); _isLoading = _refresh .IsExecuting .ToProperty(this, x => x.IsLoading, scheduler: current); _isReady = _refresh .IsExecuting .Skip(1) .Select(executing => !executing) .ToProperty(this, x => x.IsReady, scheduler: current); providers.Where(changes => changes.Any()) .ObserveOn(RxApp.MainThreadScheduler) .OnItemAdded(x => SelectedProvider = Providers.LastOrDefault()) .OnItemRemoved(x => SelectedProvider = null) .Subscribe(); var canRemove = this .WhenAnyValue(x => x.SelectedProvider) .Select(provider => provider != null); _remove = ReactiveCommand.CreateFromTask( () => storage.Remove(SelectedProvider.Id), canRemove); var canAddProvider = this .WhenAnyValue(x => x.SelectedSupportedType) .Select(type => !string.IsNullOrWhiteSpace(type)); _add = ReactiveCommand.CreateFromTask( () => storage.Add(SelectedSupportedType), canAddProvider); _welcomeScreenVisible = this .WhenAnyValue(x => x.SelectedProvider) .Select(provider => provider == null) .ToProperty(this, x => x.WelcomeScreenVisible); _welcomeScreenCollapsed = this .WhenAnyValue(x => x.WelcomeScreenVisible) .Select(visible => !visible) .ToProperty(this, x => x.WelcomeScreenCollapsed); var canUnSelect = this .WhenAnyValue(x => x.SelectedProvider) .Select(provider => provider != null); _unselect = ReactiveCommand.Create( () => { SelectedProvider = null; }, canUnSelect); Activator = new ViewModelActivator(); this.WhenActivated(disposables => { SelectedSupportedType = SupportedTypes.FirstOrDefault(); _refresh.Execute() .Subscribe() .DisposeWith(disposables); }); }