public GistCreateViewModel(IApplicationService applicationService, IAlertDialogFactory alertDialogFactory) { _applicationService = applicationService; CurrentAccount = applicationService.Account; Title = "Create Gist"; IsPublic = true; var files = new ReactiveList <Tuple <string, string> >(); Files = files.CreateDerivedCollection(x => { var item = new GistFileItemViewModel(x.Item1, x.Item2); item.EditCommand.Subscribe(_ => NavigateTo(new GistFileEditViewModel(y => { var i = files.IndexOf(x); files.Remove(x); files.Insert(i, y); return(Task.FromResult(0)); }) { Filename = x.Item1, Description = x.Item2 })); item.DeleteCommand.Subscribe(_ => files.Remove(x)); return(item); }); SaveCommand = ReactiveCommand.CreateAsyncTask(Files.CountChanged.Select(x => x > 0), async t => { var createGist = new GistCreateModel { Description = Description, Public = IsPublic, Files = Files.ToDictionary(x => x.Name, x => new GistCreateModel.File { Content = x.Content }) }; var request = _applicationService.Client.AuthenticatedUser.Gists.CreateGist(createGist); using (alertDialogFactory.Activate("Creating Gist...")) return((await _applicationService.Client.ExecuteAsync(request)).Data); }); SaveCommand.Subscribe(_ => Dismiss()); AddGistFileCommand = ReactiveCommand.Create() .WithSubscription(_ => NavigateTo(new GistFileAddViewModel(x => { if (Files.Any(y => y.Name == x.Item1)) { throw new Exception("Gist already contains a file with that name!"); } files.Add(x); return(Task.FromResult(0)); }))); }
protected GistModifyViewModel() { Files = InternalFiles.CreateDerivedCollection(x => { var item = new GistFileItemViewModel(x.Item1, x.Item2); item.EditCommand.Subscribe(_ => NavigateTo(new GistFileEditViewModel(y => { var i = InternalFiles.IndexOf(x); InternalFiles.Remove(x); InternalFiles.Insert(i, Tuple.Create(y.Item1.Trim(), y.Item2)); return(Task.FromResult(0)); }) { Filename = x.Item1, Description = x.Item2 })); item.DeleteCommand.Subscribe(_ => InternalFiles.Remove(x)); return(item); }); var canSave = new BehaviorSubject <bool>(false); Files.IsEmptyChanged.Select(x => !x).Subscribe(canSave.OnNext); SaveCommand = ReactiveCommand.CreateAsyncTask(canSave, _ => SaveGist()); SaveCommand.Subscribe(_ => Dismiss()); AddGistFileCommand = ReactiveCommand.Create(); AddGistFileCommand.Subscribe(_ => NavigateTo(new GistFileAddViewModel(x => { if (Files.Any(y => y.Name == x.Item1)) { throw new Exception("Gist already contains a file with that name!"); } InternalFiles.Add(Tuple.Create(x.Item1.Trim(), x.Item2)); return(Task.FromResult(0)); }))); DismissCommand = ReactiveCommand.CreateAsyncTask(t => Discard()); DismissCommand.Where(x => x).Subscribe(_ => Dismiss()); }
protected GistModifyViewModel() { Files = InternalFiles.CreateDerivedCollection(x => { var item = new GistFileItemViewModel(x.Item1, x.Item2); item.EditCommand.Subscribe(_ => NavigateTo(new GistFileEditViewModel(y => { var i = InternalFiles.IndexOf(x); InternalFiles.Remove(x); InternalFiles.Insert(i, Tuple.Create(y.Item1.Trim(), y.Item2)); return Task.FromResult(0); }) { Filename = x.Item1, Description = x.Item2 })); item.DeleteCommand.Subscribe(_ => InternalFiles.Remove(x)); return item; }); var canSave = new BehaviorSubject<bool>(false); Files.IsEmptyChanged.Select(x => !x).Subscribe(canSave.OnNext); SaveCommand = ReactiveCommand.CreateAsyncTask(canSave, _ => SaveGist()); SaveCommand.Subscribe(_ => Dismiss()); AddGistFileCommand = ReactiveCommand.Create(); AddGistFileCommand.Subscribe(_ => NavigateTo(new GistFileAddViewModel(x => { if (Files.Any(y => y.Name == x.Item1)) throw new Exception("Gist already contains a file with that name!"); InternalFiles.Add(Tuple.Create(x.Item1.Trim(), x.Item2)); return Task.FromResult(0); }))); DismissCommand = ReactiveCommand.CreateAsyncTask(t => Discard()); DismissCommand.Where(x => x).Subscribe(_ => Dismiss()); }