public override async Task Initialize() { var workspace = await interactorFactory.GetDefaultWorkspace().Execute(); areCustomColorsEnabled = await interactorFactory.AreCustomColorsEnabledForWorkspace(workspace.Id).Execute(); workspaceId = initialWorkspaceId = workspace.Id; WorkspaceName = workspace.Name; await setupNameAlreadyTakenError(); }
public override async Task Initialize() { navigationFromStartTimeEntryViewModelStopwatch = stopwatchProvider.Get(MeasuredOperation.OpenCreateProjectViewFromStartTimeEntryView); stopwatchProvider.Remove(MeasuredOperation.OpenCreateProjectViewFromStartTimeEntryView); var defaultWorkspace = await interactorFactory.GetDefaultWorkspace() .TrackException <InvalidOperationException, IThreadSafeWorkspace>("EditProjectViewModel.Initialize") .Execute(); var allWorkspaces = await interactorFactory.GetAllWorkspaces().Execute(); var workspace = defaultWorkspace.IsEligibleForProjectCreation() ? defaultWorkspace : allWorkspaces.First(ws => ws.IsEligibleForProjectCreation()); areCustomColorsEnabled = await interactorFactory.AreCustomColorsEnabledForWorkspace(workspace.Id).Execute(); workspaceId = initialWorkspaceId = workspace.Id; WorkspaceName = workspace.Name; await setupNameAlreadyTakenError(); }
private IObservable <Color> pickColor() { return(currentWorkspace.FirstAsync() .SelectMany(currentWorkspace => interactorFactory .AreCustomColorsEnabledForWorkspace(currentWorkspace.Id).Execute() .SelectMany(areCustomColorsEnabled => Color.FirstAsync() .SelectMany(currentColor => colorFromViewmodel(currentColor, areCustomColorsEnabled))))); IObservable <Color> colorFromViewmodel(Color currentColor, bool areCustomColorsEnabled) => Navigate <SelectColorViewModel, ColorParameters, Color>( ColorParameters.Create(currentColor, areCustomColorsEnabled)) .ToObservable(); }
public EditProjectViewModel( ITogglDataSource dataSource, IRxActionFactory rxActionFactory, IInteractorFactory interactorFactory, ISchedulerProvider schedulerProvider, INavigationService navigationService) : base(navigationService) { Ensure.Argument.IsNotNull(dataSource, nameof(dataSource)); Ensure.Argument.IsNotNull(rxActionFactory, nameof(rxActionFactory)); Ensure.Argument.IsNotNull(interactorFactory, nameof(interactorFactory)); Ensure.Argument.IsNotNull(schedulerProvider, nameof(schedulerProvider)); this.dataSource = dataSource; this.interactorFactory = interactorFactory; Name = new BehaviorRelay <string>(""); IsPrivate = new BehaviorRelay <bool>(true); PickColor = rxActionFactory.FromObservable <Color>(pickColor); PickClient = rxActionFactory.FromObservable <IThreadSafeClient>(pickClient); PickWorkspace = rxActionFactory.FromObservable <IThreadSafeWorkspace>(pickWorkspace); var initialWorkspaceObservable = interactorFactory .GetDefaultWorkspace() .TrackException <InvalidOperationException, IThreadSafeWorkspace>("EditProjectViewModel.Initialize") .Execute() .SelectMany(defaultWorkspaceOrWorkspaceEligibleForProjectCreation) .Do(initialWorkspace => initialWorkspaceId = initialWorkspace.Id); currentWorkspace = initialWorkspaceObservable .Merge(PickWorkspace.Elements) .ShareReplay(1); currentClient = currentWorkspace .SelectValue((IThreadSafeClient)null) .Merge(PickClient.Elements) .ShareReplay(1); WorkspaceName = currentWorkspace .Select(w => w.Name) .DistinctUntilChanged() .AsDriver(schedulerProvider); CanCreatePublicProjects = currentWorkspace .Select(w => w.Admin) .DoIf(isAdmin => !isAdmin, _ => IsPrivate.Accept(true)) .DistinctUntilChanged() .AsDriver(schedulerProvider); var clientName = currentClient .Select(client => client?.Name ?? "") .DistinctUntilChanged(); ClientName = clientName .AsDriver(schedulerProvider); Color = PickColor.Elements .StartWith(getRandomColor()) .Merge(currentWorkspace .SelectMany(customColorIsEnabled) .SelectMany(customColorsAreAvailable => customColorsAreAvailable ? Observable.Empty <Color>() : Color.FirstAsync().Select(randomColorIfNotDefault))) .DistinctUntilChanged() .AsDriver(schedulerProvider); var saveEnabledObservable = Name.Select(checkNameValidity); var projectOrClientNameChanged = Observable .Merge(clientName.SelectUnit(), Name.SelectUnit()); Save = rxActionFactory.FromObservable(done, saveEnabledObservable); ToggleIsPrivate = rxActionFactory.FromAction(toggleIsPrivate); Error = Save.Errors .Select(e => e.Message) .Merge(projectOrClientNameChanged.SelectValue(string.Empty)) .AsDriver(schedulerProvider); IObservable <IThreadSafeWorkspace> defaultWorkspaceOrWorkspaceEligibleForProjectCreation(IThreadSafeWorkspace defaultWorkspace) => defaultWorkspace.IsEligibleForProjectCreation() ? Observable.Return(defaultWorkspace) : interactorFactory.GetAllWorkspaces().Execute() .Select(allWorkspaces => allWorkspaces.First(ws => ws.IsEligibleForProjectCreation())); IObservable <bool> customColorIsEnabled(IThreadSafeWorkspace workspace) => interactorFactory .AreCustomColorsEnabledForWorkspace(workspace.Id) .Execute(); Color getRandomColor() { var randomColorIndex = random.Next(0, Helper.Colors.DefaultProjectColors.Length); return(Helper.Colors.DefaultProjectColors[randomColorIndex]); } Color randomColorIfNotDefault(Color lastColor) { var hex = lastColor.ToHexString(); if (DefaultProjectColors.Any(defaultColor => defaultColor == hex)) { return(lastColor); } return(getRandomColor()); } bool checkNameValidity(string name) => !string.IsNullOrWhiteSpace(name) && name.LengthInBytes() <= Constants.MaxProjectNameLengthInBytes; }