private void WriteComment_SizeChanged(object sender,
                                              SizeChangedEventArgs e)
        {
            var actualHeight = ActualHeight;

            var verticalOffset     = PostScrollViewer.VerticalOffset;
            var scrollableHeight   = PostScrollViewer.ScrollableHeight;
            var writeCommentHeight = Math.Clamp(
                (int)e.NewSize.Height + (((int)e.NewSize.Height).IsEven() ? 0 : 1),
                _writeCommentMinHeight, _writeCommentMaxHeight);
            var scrollViewerHeight = actualHeight - writeCommentHeight;

            writeCommentHeight  = Math.Floor(writeCommentHeight);
            scrollViewerHeight  = Math.Ceiling(scrollViewerHeight);
            scrollViewerHeight += actualHeight - writeCommentHeight - scrollViewerHeight;

            PostGrid.RowDefinitions[0].Height = new GridLength(
                scrollViewerHeight);
            PostGrid.RowDefinitions[1].Height = new GridLength(
                writeCommentHeight);

            WriteCommentStackPanel.Height = writeCommentHeight;

            if (verticalOffset >= scrollableHeight - 20)
            {
                PostScrollViewer.ScrollToEnd();
            }
        }
        protected override async void OnEnter(object sender,
                                              RoutedEventArgs e)
        {
            base.OnEnter(sender, e);

            CommentsList.UpdateLayout();
            UpdateLayout();
            GC.WaitForPendingFinalizers();
            GC.Collect();

            if (!IsOnEnterActive)
            {
                e.Handled = true;
                return;
            }

            PostScrollViewer
            .ScrollToVerticalOffset(0.0);

            await UpdatePost()
            .ConfigureAwait(true);

            var draft = await StorageManager.GetPostCommentDraft(
                SettingsManager.PersistentSettings.CurrentUser.Id,
                ViewModel.CurrentPostData.Id)
                        .ConfigureAwait(true);

            WriteComment.CommentText = draft.CommentText;
            WriteComment.IsAnonymous = draft.IsAnonymous;

            WriteComment.ContentTextBox.ScrollToEnd();
            WriteComment.ContentTextBox.CaretIndex = draft.CommentText.Length;
            WriteComment.ContentTextBox.Focus();

            if (PostScrollViewer.VerticalOffset >= PostScrollViewer.ScrollableHeight - 20)
            {
                PostScrollViewer.ScrollToVerticalOffset(0.0);
            }
        }
        private async void CommentsList_CommentReply(object sender,
                                                     RoutedEventArgs e)
        {
            if (!(sender is CommentsList))
            {
                return;
            }
            if (!(e.OriginalSource is Comment comment))
            {
                return;
            }

            var verticalOffset   = PostScrollViewer.VerticalOffset;
            var scrollableHeight = PostScrollViewer.ScrollableHeight;
            var userNickname     = !string.IsNullOrEmpty(comment.CurrentCommentData.User.Nickname)
                ? comment.CurrentCommentData.User.Nickname
                : "Unknown";

            string replyText;

            switch (SettingsManager.AppSettings.CommentReplyModeEnum)
            {
            case CommentReplyModeType.Experimental:
                replyText =
                    $">>> {userNickname}:\n\n"
                    + $"{comment.CurrentCommentData.Text}\n\n"
                    + ">>>\n\n";
                break;

            case CommentReplyModeType.Legacy:
            default:
                replyText =
                    $"{userNickname}, ";
                break;
            }

            var oldCaretIndex = WriteComment.ContentTextBox.CaretIndex;

            WriteComment.CommentText = replyText + WriteComment.CommentText;
            WriteComment.ContentTextBox.CaretIndex = replyText.Length + oldCaretIndex;
            WriteComment.ContentTextBox.ScrollToEnd();
            WriteComment.ContentTextBox.Focus();

            if (verticalOffset >= scrollableHeight - 20)
            {
                PostScrollViewer.ScrollToEnd();
            }

            if (comment.CurrentCommentData.User.Id.HasValue &&
                comment.CurrentCommentData.User.Id == SettingsManager.PersistentSettings.CurrentUser.Id)
            {
                return;
            }

            for (var i = 0; i < 2; ++i)
            {
                if (comment.CurrentCommentData.Likes.MyCount == 0)
                {
                    await PostApi.AddLikeComment(
                        SettingsManager.PersistentSettings.CurrentUser.Token,
                        comment.CurrentCommentData.Id)
                    .ConfigureAwait(true);
                }
                else
                {
                    await PostApi.RemoveLikeComment(
                        SettingsManager.PersistentSettings.CurrentUser.Token,
                        comment.CurrentCommentData.Id)
                    .ConfigureAwait(true);
                }

                if (comment.CurrentCommentData.Likes.MyCount == 0)
                {
                    ++comment.CurrentCommentData.Likes.MyCount;
                }
                else
                {
                    --comment.CurrentCommentData.Likes.MyCount;
                }
            }
        }