/// <summary> /// Initializes a new instance of the <see cref="CommentViewModel"/> class. /// </summary> /// <param name="commentService">The comment service</param> /// <param name="thread">The thread that the comment is a part of.</param> /// <param name="currentUser">The current user.</param> /// <param name="pullRequestId">The pull request id of the comment.</param> /// <param name="commentId">The GraphQL ID of the comment.</param> /// <param name="databaseId">The database id of the comment.</param> /// <param name="body">The comment body.</param> /// <param name="state">The comment edit state.</param> /// <param name="author">The author of the comment.</param> /// <param name="updatedAt">The modified date of the comment.</param> /// <param name="webUrl"></param> protected CommentViewModel( ICommentService commentService, ICommentThreadViewModel thread, IActorViewModel currentUser, int pullRequestId, string commentId, int databaseId, string body, CommentEditState state, IActorViewModel author, DateTimeOffset updatedAt, Uri webUrl) { this.commentService = commentService; Guard.ArgumentNotNull(thread, nameof(thread)); Guard.ArgumentNotNull(currentUser, nameof(currentUser)); Guard.ArgumentNotNull(author, nameof(author)); Thread = thread; CurrentUser = currentUser; Id = commentId; DatabaseId = databaseId; PullRequestId = pullRequestId; Body = body; EditState = state; Author = author; UpdatedAt = updatedAt; WebUrl = webUrl; var canDeleteObservable = this.WhenAnyValue( x => x.EditState, x => x == CommentEditState.None && author.Login == currentUser.Login); canDelete = canDeleteObservable.ToProperty(this, x => x.CanDelete); Delete = ReactiveCommand.CreateAsyncTask(canDeleteObservable, DoDelete); var canEdit = this.WhenAnyValue( x => x.EditState, x => x == CommentEditState.Placeholder || (x == CommentEditState.None && author.Login == currentUser.Login)); BeginEdit = ReactiveCommand.Create(canEdit); BeginEdit.Subscribe(DoBeginEdit); AddErrorHandler(BeginEdit); CommitEdit = ReactiveCommand.CreateAsyncTask( Observable.CombineLatest( this.WhenAnyValue(x => x.IsReadOnly), this.WhenAnyValue(x => x.Body, x => !string.IsNullOrWhiteSpace(x)), this.WhenAnyObservable(x => x.Thread.PostComment.CanExecuteObservable), (readOnly, hasBody, canPost) => !readOnly && hasBody && canPost), DoCommitEdit); AddErrorHandler(CommitEdit); CancelEdit = ReactiveCommand.Create(CommitEdit.IsExecuting.Select(x => !x)); CancelEdit.Subscribe(DoCancelEdit); AddErrorHandler(CancelEdit); OpenOnGitHub = ReactiveCommand.Create(this.WhenAnyValue(x => x.Id).Select(x => x != null)); }
/// <summary> /// Initializes a new instance of the <see cref="CommentViewModel"/> class. /// </summary> /// <param name="thread">The thread that the comment is a part of.</param> /// <param name="currentUser">The current user.</param> /// <param name="commentId">The ID of the comment.</param> /// <param name="commentNodeId">The GraphQL ID of the comment.</param> /// <param name="body">The comment body.</param> /// <param name="state">The comment edit state.</param> /// <param name="user">The author of the comment.</param> /// <param name="updatedAt">The modified date of the comment.</param> protected CommentViewModel( ICommentThreadViewModel thread, IAccount currentUser, int commentId, string commentNodeId, string body, CommentEditState state, IAccount user, DateTimeOffset updatedAt) { Guard.ArgumentNotNull(thread, nameof(thread)); Guard.ArgumentNotNull(currentUser, nameof(currentUser)); Guard.ArgumentNotNull(body, nameof(body)); Guard.ArgumentNotNull(user, nameof(user)); Thread = thread; CurrentUser = currentUser; Id = commentId; NodeId = commentNodeId; Body = body; EditState = state; User = user; UpdatedAt = updatedAt; var canDelete = this.WhenAnyValue( x => x.EditState, x => x == CommentEditState.None && user.Login.Equals(currentUser.Login)); canDelete.ToProperty(this, x => x.CanDelete); Delete = ReactiveCommand.CreateAsyncTask(canDelete, DoDelete); var canEdit = this.WhenAnyValue( x => x.EditState, x => x == CommentEditState.Placeholder || (x == CommentEditState.None && user.Login.Equals(currentUser.Login))); BeginEdit = ReactiveCommand.Create(canEdit); BeginEdit.Subscribe(DoBeginEdit); AddErrorHandler(BeginEdit); CommitEdit = ReactiveCommand.CreateAsyncTask( Observable.CombineLatest( this.WhenAnyValue(x => x.IsReadOnly), this.WhenAnyValue(x => x.Body, x => !string.IsNullOrWhiteSpace(x)), this.WhenAnyObservable(x => x.Thread.PostComment.CanExecuteObservable), (readOnly, hasBody, canPost) => !readOnly && hasBody && canPost), DoCommitEdit); AddErrorHandler(CommitEdit); CancelEdit = ReactiveCommand.Create(CommitEdit.IsExecuting.Select(x => !x)); CancelEdit.Subscribe(DoCancelEdit); AddErrorHandler(CancelEdit); OpenOnGitHub = ReactiveCommand.Create(this.WhenAnyValue(x => x.Id, x => x != 0)); }