public FeedGroupViewModel( Func <Article, FeedItemViewModel> factory, INavigationService navigationService, IFeedStoreService feedStoreService, ISettingManager settingManager, Category category) { var showRead = true; var cache = new ReactiveList <FeedItemViewModel> { ChangeTrackingEnabled = true }; Items = cache.CreateDerivedCollection(x => x, x => !(!showRead && x.Read)); Items.CountChanged.Subscribe(x => IsEmpty = x == 0); Title = category.Title; Modify = ReactiveCommand.CreateFromTask(() => navigationService.Navigate <ChannelViewModel>()); Fetch = ReactiveCommand.CreateFromTask(async() => { IsLoading = true; var settings = await settingManager.Read(); var response = await feedStoreService.LoadAsync(category.Channels); var viewModels = response.Select(factory).ToList(); showRead = settings.Read; cache.Clear(); cache.AddRange(viewModels); IsLoading = false; }); }
public FeedCategoryViewModel( INavigationService navigationService, IFeedStoreService feedStoreService, IFactoryService factoryService, Category category) { Title = category.Title; (IsLoading, IsEmpty) = (true, false); Items = new ObservableCollection <ArticleViewModel>(); OpenSources = new ObservableCommand(navigationService.Navigate <ChannelsViewModel>); Fetch = new ObservableCommand(async() => { IsLoading.Value = true; var sources = category.Channels; var response = await feedStoreService.LoadAsync(sources); Items.Clear(); foreach (var article in response.Item2) { Items.Add(factoryService.CreateInstance < ArticleViewModel>(article)); } IsEmpty.Value = Items.Count == 0; IsLoading.Value = false; }); }
public BackgroundService( INotificationService notificationService, IFeedStoreService feedStoreService, ICategoryManager categoryManager, ISettingManager settingManager) { _notificationService = notificationService; _feedStoreService = feedStoreService; _categoryManager = categoryManager; _settingManager = settingManager; }
public BackgroundService( ICategoriesRepository categoriesRepository, INotificationService notificationService, IFeedStoreService feedStoreService, ISettingsService settingsService) { _categoriesRepository = categoriesRepository; _notificationService = notificationService; _feedStoreService = feedStoreService; _settingsService = settingsService; }
public FeedGroupViewModel( Func <Article, FeedItemViewModel> factory, INavigationService navigationService, IFeedStoreService feedStoreService, ISettingManager settingManager, Category category) { _source = new ReactiveList <FeedItemViewModel> { ChangeTrackingEnabled = true }; _navigationService = navigationService; _feedStoreService = feedStoreService; _settingManager = settingManager; _category = category; _factory = factory; Modify = ReactiveCommand.CreateFromTask(_navigationService.Navigate <ChannelViewModel>); Fetch = ReactiveCommand.CreateFromTask(() => _feedStoreService.Load(_category.Channels)); Items = _source.CreateDerivedCollection(x => x, x => !(!ShowRead && x.Read)); Fetch.Select(articles => articles.Select(_factory)) .ObserveOn(RxApp.MainThreadScheduler) .Do(articles => _source.Clear()) .Subscribe(_source.AddRange); Items.IsEmptyChanged .Subscribe(x => IsEmpty = x); Fetch.IsExecuting.Skip(1) .Subscribe(x => IsLoading = x); Fetch.IsExecuting .Where(executing => executing) .SelectMany(x => _settingManager.Read()) .Select(settings => settings.Read) .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(x => ShowRead = x); Fetch.IsExecuting .Where(executing => executing) .Select(executing => false) .Subscribe(x => HasErrors = x); Fetch.ThrownExceptions .Select(exception => true) .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(x => HasErrors = x); Activator = new ViewModelActivator(); this.WhenActivated((CompositeDisposable disposables) => Fetch.Execute().Subscribe()); }
public FeedGroupViewModel( Func <Article, FeedItemViewModel> factory, INavigationService navigationService, IFeedStoreService feedStoreService, ISettingManager settingManager, Category category) { _source = new ReactiveList <FeedItemViewModel> { ChangeTrackingEnabled = true }; _navigationService = navigationService; _feedStoreService = feedStoreService; _settingManager = settingManager; _category = category; _factory = factory; Modify = ReactiveCommand.CreateFromTask(_navigationService.Navigate <ChannelViewModel>); Fetch = ReactiveCommand.CreateFromTask(() => _feedStoreService.Load(_category.Channels)); Items = _source.CreateDerivedCollection(x => x, x => !(!ShowRead && x.Read)); Fetch.Select(articles => articles.Select(_factory)) .ObserveOn(RxApp.MainThreadScheduler) .Do(articles => _source.Clear()) .Subscribe(_source.AddRange); Fetch.IsExecuting .Where(executing => executing) .SelectMany(x => _settingManager.Read()) .Select(settings => settings.Read) .ObserveOn(RxApp.MainThreadScheduler) .Subscribe(x => ShowRead = x); Items.IsEmptyChanged .Subscribe(x => IsEmpty = x); Fetch.IsExecuting .Skip(1) .Subscribe(x => IsLoading = x); Error = new Interaction <Exception, bool>(); Fetch.ThrownExceptions .ObserveOn(RxApp.MainThreadScheduler) .SelectMany(Error.Handle) .Where(retry => retry) .Select(x => Unit.Default) .InvokeCommand(Fetch); }
public FeedGroupViewModel( Func <Article, FeedItemViewModel> factory, INavigationService navigationService, IFeedStoreService feedStoreService, ISettingManager settingManager, Category category) { _navigationService = navigationService; _feedStoreService = feedStoreService; _settingManager = settingManager; _category = category; _factory = factory; _source = new ReactiveList <FeedItemViewModel> { ChangeTrackingEnabled = true }; Items = _source.CreateDerivedCollection(x => x, x => !(!ShowRead && x.Read)); Modify = ReactiveCommand.CreateFromTask( () => _navigationService.Navigate <ChannelViewModel>() ); Fetch = ReactiveCommand.CreateFromTask(DoFetch); Fetch.IsExecuting.Skip(1) .Subscribe(x => IsLoading = x); Items.CountChanged .Select(count => count == 0) .Subscribe(x => IsEmpty = x); Error = new Interaction <Exception, bool>(); Fetch.ThrownExceptions .ObserveOn(RxApp.MainThreadScheduler) .SelectMany(error => Error.Handle(error)) .Where(retryRequested => retryRequested) .Select(x => Unit.Default) .InvokeCommand(Fetch); }