コード例 #1
0
        public StartTimeEntryViewModel(
            ITimeService timeService,
            ITogglDataSource dataSource,
            IUserPreferences userPreferences,
            IOnboardingStorage onboardingStorage,
            IInteractorFactory interactorFactory,
            INavigationService navigationService,
            IAnalyticsService analyticsService,
            ISchedulerProvider schedulerProvider,
            IRxActionFactory rxActionFactory)
            : base(navigationService)
        {
            Ensure.Argument.IsNotNull(dataSource, nameof(dataSource));
            Ensure.Argument.IsNotNull(timeService, nameof(timeService));
            Ensure.Argument.IsNotNull(userPreferences, nameof(userPreferences));
            Ensure.Argument.IsNotNull(interactorFactory, nameof(interactorFactory));
            Ensure.Argument.IsNotNull(onboardingStorage, nameof(onboardingStorage));
            Ensure.Argument.IsNotNull(analyticsService, nameof(analyticsService));
            Ensure.Argument.IsNotNull(schedulerProvider, nameof(schedulerProvider));
            Ensure.Argument.IsNotNull(rxActionFactory, nameof(rxActionFactory));

            this.timeService       = timeService;
            this.userPreferences   = userPreferences;
            this.interactorFactory = interactorFactory;
            this.analyticsService  = analyticsService;
            this.schedulerProvider = schedulerProvider;

            DataSource        = dataSource;
            OnboardingStorage = onboardingStorage;

            TextFieldInfo        = textFieldInfo.AsDriver(schedulerProvider);
            IsBillable           = isBillable.AsDriver(schedulerProvider);
            IsSuggestingTags     = isSuggestingTags.AsDriver(schedulerProvider);
            IsSuggestingProjects = isSuggestingProjects.AsDriver(schedulerProvider);
            IsBillableAvailable  = isBillableAvailable.AsDriver(schedulerProvider);
            DisplayedTime        = displayedTime
                                   .Select(time => time.ToFormattedString(DurationFormat.Improved))
                                   .AsDriver(schedulerProvider);

            Done                     = rxActionFactory.FromObservable <IThreadSafeTimeEntry>(done);
            DurationTapped           = rxActionFactory.FromAction(durationTapped);
            ToggleBillable           = rxActionFactory.FromAction(toggleBillable);
            SetStartDate             = rxActionFactory.FromAsync(setStartDate);
            ChangeTime               = rxActionFactory.FromAsync(changeTime);
            ToggleTagSuggestions     = rxActionFactory.FromAction(toggleTagSuggestions);
            ToggleProjectSuggestions = rxActionFactory.FromAction(toggleProjectSuggestions);
            SelectSuggestion         = rxActionFactory.FromAsync <AutocompleteSuggestion>(selectSuggestion);
            SetRunningTime           = rxActionFactory.FromAction <TimeSpan>(setRunningTime);
            ToggleTasks              = rxActionFactory.FromAction <ProjectSuggestion>(toggleTasks);
            SetTextSpans             = rxActionFactory.FromAction <IImmutableList <ISpan> >(setTextSpans);

            var queryByType = queryByTypeSubject
                              .AsObservable()
                              .SelectMany(type => interactorFactory.GetAutocompleteSuggestions(new QueryInfo("", type)).Execute());

            var queryByText = textFieldInfo
                              .SelectMany(setBillableValues)
                              .Select(QueryInfo.ParseFieldInfo)
                              .Do(onParsedQuery)
                              .ObserveOn(schedulerProvider.BackgroundScheduler)
                              .SelectMany(query => interactorFactory.GetAutocompleteSuggestions(query).Execute());

            Suggestions = Observable.Merge(queryByText, queryByType)
                          .Select(filter)
                          .Select(group)
                          .CombineLatest(expandedProjects, (groups, _) => groups)
                          .Select(toCollections)
                          .Select(addStaticElements)
                          .AsDriver(schedulerProvider);
        }