Repository: wordpress-mobile/WordPress-iOS
Pull request #24183: Remove more dead code
Author: login: kean
Labels: name: General
Created: 2025-03-11T00:10:12Z | Merged: 2025-03-11T01:36:08Z

Everything under `blockOfKind(.comment)` can be removed. The comment notification details are only shown in the new-ish `NotificationCommentDetailViewController`. Nobody removed the code that was replaced by it.

To test:

## Regression Notes
1. Potential unintended areas of impact


2. What I did to test those areas of impact (or what existing automated tests I relied on)


3. What automated tests I added (or what prevented me from doing so)

PR submission checklist:

- [ ] I have completed the Regression Notes.
- [ ] I have considered adding unit tests for my changes.
- [ ] I have considered adding accessibility improvements for my changes.
- [ ] I have considered if this change warrants user-facing release notes and have added them to `RELEASE-NOTES.txt` if necessary.

Testing checklist:
- [ ] WordPress.com sites and self-hosted Jetpack sites.
- [ ] Portrait and landscape orientations.
- [ ] Light and dark modes.
- [ ] Fonts: Larger, smaller and bold text.
- [ ] High contrast.
- [ ] VoiceOver.
- [ ] Languages with large words or with letters/accents not frequently used in English.
- [ ] Right-to-left languages. (Even if translation isn’t complete, formatting should still respect the right-to-left layout)
- [ ] iPhone and iPad. 
- [ ] Multi-tasking: Split view and Slide over. (iPad)



Diff:
diff --git a/WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationDetailsViewController.swift b/WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationDetailsViewController.swift
index ba0d55b15fe4..570a174b0ff1 100644
--- a/WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationDetailsViewController.swift
+++ b/WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationDetailsViewController.swift
@@ -358,7 +358,6 @@ extension NotificationDetailsViewController {
         let cellClassNames: [NoteBlockTableViewCell.Type] = [
             NoteBlockHeaderTableViewCell.self,
             NoteBlockTextTableViewCell.self,
-            NoteBlockActionsTableViewCell.self,
             NoteBlockCommentTableViewCell.self,
             NoteBlockImageTableViewCell.self,
             NoteBlockUserTableViewCell.self,
@@ -482,8 +481,6 @@ private extension NotificationDetailsViewController {
             return NoteBlockTextTableViewCell.reuseIdentifier()
         case .comment:
             return NoteBlockCommentTableViewCell.reuseIdentifier()
-        case .actions:
-            return NoteBlockActionsTableViewCell.reuseIdentifier()
         case .image:
             return NoteBlockImageTableViewCell.reuseIdentifier()
         case .user:
@@ -517,8 +514,6 @@ private extension NotificationDetailsViewController {
             setupUserCell(cell, blockGroup: blockGroup)
         case let cell as NoteBlockCommentTableViewCell:
             setupCommentCell(cell, blockGroup: blockGroup, at: indexPath)
-        case let cell as NoteBlockActionsTableViewCell:
-            setupActionsCell(cell, blockGroup: blockGroup)
         case let cell as NoteBlockImageTableViewCell:
             setupImageCell(cell, blockGroup: blockGroup)
         case let cell as NoteBlockTextTableViewCell:
@@ -662,58 +657,6 @@ private extension NotificationDetailsViewController {
         cell.downloadGravatarWithURL(mediaURL)
     }
 
-    func setupActionsCell(_ cell: NoteBlockActionsTableViewCell, blockGroup: FormattableContentGroup) {
-        guard let commentBlock: FormattableCommentContent = blockGroup.blockOfKind(.comment) else {
-            assertionFailure("Missing Comment Block for Notification \(note.notificationId)")
-            return
-        }
-
-        // Setup: Properties
-        // Note: Approve Action is actually a synonym for 'Edit' (Based on Calypso's basecode)
-        //
-        cell.isReplyEnabled = UIDevice.isPad() && commentBlock.isActionOn(id: ReplyToCommentAction.actionIdentifier())
-        cell.isLikeEnabled = commentBlock.isActionEnabled(id: LikeCommentAction.actionIdentifier())
-        cell.isApproveEnabled = commentBlock.isActionEnabled(id: ApproveCommentAction.actionIdentifier())
-        cell.isTrashEnabled = commentBlock.isActionEnabled(id: TrashCommentAction.actionIdentifier())
-        cell.isSpamEnabled = commentBlock.isActionEnabled(id: MarkAsSpamAction.actionIdentifier())
-        cell.isEditEnabled = commentBlock.isActionOn(id: ApproveCommentAction.actionIdentifier())
-        cell.isLikeOn = commentBlock.isActionOn(id: LikeCommentAction.actionIdentifier())
-        cell.isApproveOn = commentBlock.isActionOn(id: ApproveCommentAction.actionIdentifier())
-
-        // Setup: Callbacks
-        cell.onReplyClick = { _ in
-            wpAssertionFailure("no longer used")
-        }
-
-        cell.onLikeClick = { [weak self] _ in
-            self?.likeCommentWithBlock(commentBlock)
-        }
-
-        cell.onUnlikeClick = { [weak self] _ in
-            self?.unlikeCommentWithBlock(commentBlock)
-        }
-
-        cell.onApproveClick = { [weak self] _ in
-            self?.approveCommentWithBlock(commentBlock)
-        }
-
-        cell.onUnapproveClick = { [weak self] _ in
-            self?.unapproveCommentWithBlock(commentBlock)
-        }
-
-        cell.onTrashClick = { [weak self] _ in
-            self?.trashCommentWithBlock(commentBlock)
-        }
-
-        cell.onSpamClick = { [weak self] _ in
-            self?.spamCommentWithBlock(commentBlock)
-        }
-
-        cell.onEditClick = { [weak self] _ in
-            wpAssertionFailure("unused")
-        }
-    }
-
     func setupImageCell(_ cell: NoteBlockImageTableViewCell, blockGroup: FormattableContentGroup) {
         guard let imageBlock = blockGroup.blocks.first as? NotificationTextContent else {
             assertionFailure("Missing Image Block for Notification [\(note.notificationId)")
@@ -912,144 +855,6 @@ private extension NotificationDetailsViewController {
         actionsService.unfollowSiteWithBlock(block)
         WPAppAnalytics.track(.notificationsSiteUnfollowAction, withBlogID: block.metaSiteID)
     }
-
-    func likeCommentWithBlock(_ block: FormattableCommentContent) {
-        guard let likeAction = block.action(id: LikeCommentAction.actionIdentifier()) else {
-            return
-        }
-        let actionContext = ActionContext(block: block)
-        likeAction.execute(context: actionContext)
-        WPAppAnalytics.track(.notificationsCommentLiked, withBlogID: block.metaSiteID)
-    }
-
-    func unlikeCommentWithBlock(_ block: FormattableCommentContent) {
-        guard let likeAction = block.action(id: LikeCommentAction.actionIdentifier()) else {
-            return
-        }
-        let actionContext = ActionContext(block: block)
-        likeAction.execute(context: actionContext)
-        WPAppAnalytics.track(.notificationsCommentUnliked, withBlogID: block.metaSiteID)
-    }
-
-    func approveCommentWithBlock(_ block: FormattableCommentContent) {
-        guard let approveAction = block.action(id: ApproveCommentAction.actionIdentifier()) else {
-            return
-        }
-
-        let actionContext = ActionContext(block: block)
-        approveAction.execute(context: actionContext)
-        WPAppAnalytics.track(.notificationsCommentApproved, withBlogID: block.metaSiteID)
-    }
-
-    func unapproveCommentWithBlock(_ block: FormattableCommentContent) {
-        guard let approveAction = block.action(id: ApproveCommentAction.actionIdentifier()) else {
-            return
-        }
-
-        let actionContext = ActionContext(block: block)
-        approveAction.execute(context: actionContext)
-        WPAppAnalytics.track(.notificationsCommentUnapproved, withBlogID: block.metaSiteID)
-    }
-
-    func spamCommentWithBlock(_ block: FormattableCommentContent) {
-        guard onDeletionRequestCallback != nil else {
-            // callback probably missing due to state restoration. at least by
-            // not crashing the user can tap the back button and try again
-            return
-        }
-
-        guard let spamAction = block.action(id: MarkAsSpamAction.actionIdentifier()) else {
-            return
-        }
-
-        let actionContext = ActionContext(block: block, completion: { [weak self] (request, success) in
-            WPAppAnalytics.track(.notificationsCommentFlaggedAsSpam, withBlogID: block.metaSiteID)
-            guard let request else {
-                return
-            }
-            self?.onDeletionRequestCallback?(request)
-        })
-
-        spamAction.execute(context: actionContext)
-
-        // We're thru
-        _ = navigationController?.popToRootViewController(animated: true)
-    }
-
-    func trashCommentWithBlock(_ block: FormattableCommentContent) {
-        guard onDeletionRequestCallback != nil else {
-            // callback probably missing due to state restoration. at least by
-            // not crashing the user can tap the back button and try again
-            return
-        }
-
-        guard let trashAction = block.action(id: TrashCommentAction.actionIdentifier()) else {
-            return
-        }
-
-        let actionContext = ActionContext(block: block, completion: { [weak self] (request, success) in
-            WPAppAnalytics.track(.notificationsCommentTrashed, withBlogID: block.metaSiteID)
-            guard let request else {
-                return
-            }
-            self?.onDeletionRequestCallback?(request)
-        })
-
-        trashAction.execute(context: actionContext)
-
-        // We're thru
-        _ = navigationController?.popToRootViewController(animated: true)
-    }
-
-    func updateCommentWithBlock(_ block: FormattableCommentContent, content: String) {
-        guard let editCommentAction = block.action(id: EditCommentAction.actionIdentifier()) else {
-            return
-        }
-
-        let generator = UINotificationFeedbackGenerator()
-        generator.prepare()
-        generator.notificationOccurred(.success)
-
-        let actionContext = ActionContext(block: block, content: content) { [weak self] (request, success) in
-            guard success == false else {
-                CommentAnalytics.trackCommentEdited(block: block)
-                return
-            }
-
-            generator.notificationOccurred(.error)
-            self?.displayCommentUpdateErrorWithBlock(block, content: content)
-        }
-
-        editCommentAction.execute(context: actionContext)
-    }
-}
-
-// MARK: - Editing Comments
-//
-private extension NotificationDetailsViewController {
-
-    func updateComment(with commentContent: FormattableCommentContent, content: String) {
-            self.updateCommentWithBlock(commentContent, content: content)
-    }
-
-    func displayCommentUpdateErrorWithBlock(_ block: FormattableCommentContent, content: String) {
-        let message     = NSLocalizedString("There has been an unexpected error while updating your comment",
-                                            comment: "Displayed whenever a Comment Update Fails")
-        let cancelTitle = NSLocalizedString("Give Up", comment: "Cancel")
-        let retryTitle  = NSLocalizedString("Try Again", comment: "Retry")
-
-        let alertController = UIAlertController(title: nil, message: message, preferredStyle: .alert)
-        alertController.addCancelActionWithTitle(cancelTitle) { action in
-            block.textOverride = nil
-            self.refreshInterface()
-        }
-        alertController.addDefaultActionWithTitle(retryTitle) { action in
-            self.updateComment(with: block, content: content)
-        }
-
-        // Note: This viewController might not be visible anymore
-        alertController.presentFromRootViewController()
-    }
 }
 
 // MARK: - Milestone notifications
diff --git a/WordPress/Classes/ViewRelated/Notifications/Style/WPStyleGuide+Notifications.swift b/WordPress/Classes/ViewRelated/Notifications/Style/WPStyleGuide+Notifications.swift
index aaf510f4cc84..d58509086852 100644
--- a/WordPress/Classes/ViewRelated/Notifications/Style/WPStyleGuide+Notifications.swift
+++ b/WordPress/Classes/ViewRelated/Notifications/Style/WPStyleGuide+Notifications.swift
@@ -190,10 +190,6 @@ extension WPStyleGuide {
                      .foregroundColor: blockNoticonColor ]
         }
 
-        // Action Buttons
-        public static let blockActionDisabledColor  = UIColor.secondaryLabel
-        public static let blockActionEnabledColor   = UIAppColor.primary
-
         // RichText Helpers
         public static func blockBackgroundColorForRichText(_ isBadge: Bool) -> UIColor {
             return isBadge ? badgeBackgroundColor : blockBackgroundColor
diff --git a/WordPress/Classes/ViewRelated/Notifications/Views/NoteBlockActionsTableViewCell.swift b/WordPress/Classes/ViewRelated/Notifications/Views/NoteBlockActionsTableViewCell.swift
deleted file mode 100644
index 68fd19998c04..000000000000
--- a/WordPress/Classes/ViewRelated/Notifications/Views/NoteBlockActionsTableViewCell.swift
+++ /dev/null
@@ -1,363 +0,0 @@
-import Foundation
-import WordPressShared
-
-// MARK: - NoteBlockActionsTableViewCell
-//
-class NoteBlockActionsTableViewCell: NoteBlockTableViewCell {
-    typealias EventHandler = ((_ sender: AnyObject) -> Void)
-
-    /// Actions StackView
-    ///
-    @IBOutlet fileprivate var actionsView: UIStackView!
-
-    /// Reply Action Button
-    ///
-    @IBOutlet fileprivate var btnReply: UIButton!
-
-    /// Like Action Button
-    ///
-    @IBOutlet fileprivate var btnLike: UIButton!
-
-    /// Approve Action Button
-    ///
-    @IBOutlet fileprivate var btnApprove: UIButton!
-
-    /// Trash Action Button
-    ///
-    @IBOutlet fileprivate var btnTrash: UIButton!
-
-    /// Spam Action Button
-    ///
-    @IBOutlet fileprivate var btnSpam: UIButton!
-
-    /// Edit Action Button
-    ///
-    @IBOutlet fileprivate var btnEdit: UIButton!
-
-    /// Handler to be executed on Reply event
-    ///
-    @objc var onReplyClick: EventHandler?
-
-    /// Handler to be executed on Like event
-    ///
-    @objc var onLikeClick: EventHandler?
-
-    /// Handler to be executed on Unlike event
-    ///
-    @objc var onUnlikeClick: EventHandler?
-
-    /// Handler to be executed on Approve event
-    ///
-    @objc var onApproveClick: EventHandler?
-
-    /// Handler to be executed on Unapprove event
-    ///
-    @objc var onUnapproveClick: EventHandler?
-
-    /// Handler to be executed on Trash event
-    ///
-    @objc var onTrashClick: EventHandler?
-
-    /// Handler to be executed on Spam event
-    ///
-    @objc var onSpamClick: EventHandler?
-
-    // Handler to be executed on Edition event
-    //
-    @objc var onEditClick: EventHandler?
-
-    /// Indicates whether the Reply Action is enabled, or not
-    ///
-    @objc var isReplyEnabled: Bool = false {
-        didSet {
-            toggleAction(button: btnReply, hidden: !isReplyEnabled)
-        }
-    }
-
-    /// Indicates whether the Like Action is enabled, or not
-    ///
-    @objc var isLikeEnabled: Bool = false {
-        didSet {
-            toggleAction(button: btnLike, hidden: !isLikeEnabled)
-        }
-    }
-
-    /// Indicates whether the Approve Action is enabled, or not
-    ///
-    @objc var isApproveEnabled: Bool = false {
-        didSet {
-            toggleAction(button: btnApprove, hidden: !isApproveEnabled)
-        }
-    }
-
-    /// Indicates whether the Trash Action is enabled, or not
-    ///
-    @objc var isTrashEnabled: Bool = false {
-        didSet {
-            toggleAction(button: btnTrash, hidden: !isTrashEnabled)
-        }
-    }
-
-    /// Indicates whether the Spam Action is enabled, or not
-    ///
-    @objc var isSpamEnabled: Bool = false {
-        didSet {
-            toggleAction(button: btnSpam, hidden: !isSpamEnabled)
-        }
-    }
-
-    /// Indicates whether the Edit Action is enabled, or not
-    ///
-    @objc var isEditEnabled: Bool = false {
-        didSet {
-            toggleAction(button: btnEdit, hidden: !isEditEnabled)
-        }
-    }
-
-    /// Indicates if all actions are disabled.
-    ///
-    @objc var allActionsDisabled: Bool {
-        return !isReplyEnabled &&
-            !isLikeEnabled &&
-            !isApproveEnabled &&
-            !isTrashEnabled &&
-            !isSpamEnabled &&
-            !isEditEnabled
-    }
-
-    /// Indicates whether Like is in it's "Selected" state, or not
-    ///
-    @objc var isLikeOn: Bool {
-        set {
-            btnLike.isSelected = newValue
-            btnLike.accessibilityLabel = likeAccesibilityLabel
-            btnLike.accessibilityHint = likeAccessibilityHint
-            // Force button trait to avoid automatic "Selected" trait
-            btnLike.accessibilityTraits = UIAccessibilityTraits.button
-        }
-        get {
-            return btnLike.isSelected
-        }
-    }
-
-    /// Indicates whether Approve is in it's "Selected" state, or not
-    ///
-    @objc var isApproveOn: Bool {
-        set {
-            btnApprove.isSelected = newValue
-            btnApprove.accessibilityLabel = approveAccesibilityLabel
-            btnApprove.accessibilityHint = approveAccesibilityHint
-            // Force button trait to avoid automatic "Selected" trait
-            btnApprove.accessibilityTraits = UIAccessibilityTraits.button
-        }
-        get {
-            return btnApprove.isSelected
-        }
-    }
-
-    /// Returns the required button spacing
-    ///
-    fileprivate var buttonSpacingForCurrentTraits: CGFloat {
-        let isHorizontallyCompact = traitCollection.horizontalSizeClass == .compact
-        return isHorizontallyCompact ? Constants.buttonSpacingCompact : Constants.buttonSpacing
-    }
-
-    /// Returns the accessibility label for the Approve Button
-    ///
-    fileprivate var approveAccesibilityLabel: String {
-        return isApproveOn ? ApproveComment.TitleStrings.unapprove : ApproveComment.TitleStrings.approve
-    }
-
-    /// Returns the accessibility hint for the Approve Button
-    ///
-    fileprivate var approveAccesibilityHint: String {
-        return isApproveOn ? ApproveComment.TitleHints.unapprove : ApproveComment.TitleHints.approve
-    }
-
-    /// Returns the accessibility label for the Like Button
-    ///
-    fileprivate var likeAccesibilityLabel: String {
-        return isLikeOn ? LikeComment.TitleStrings.unlike : LikeComment.TitleStrings.like
-    }
-
-    /// Returns the accessibility hint for the Like Button
-    ///
-    fileprivate var likeAccessibilityHint: String {
-        return isLikeOn ? LikeComment.TitleHints.unlike : LikeComment.TitleHints.like
-    }
-
-    // MARK: - Overriden Methods
-
-    override func awakeFromNib() {
-        super.awakeFromNib()
-
-        selectionStyle = .none
-
-        let textNormalColor = WPStyleGuide.Notifications.blockActionDisabledColor
-        let textSelectedColor = WPStyleGuide.Notifications.blockActionEnabledColor
-
-        btnReply.setTitle(ReplyToComment.title, for: UIControl.State())
-        btnReply.setTitleColor(textNormalColor, for: UIControl.State())
-        btnReply.accessibilityLabel = ReplyToComment.title
-        btnReply.accessibilityHint = ReplyToComment.hint
-        btnReply.accessibilityIdentifier = ReplyToComment.identifier
-
-        btnLike.setTitle(LikeComment.TitleStrings.like, for: UIControl.State())
-        btnLike.setTitle(LikeComment.TitleStrings.unlike, for: .highlighted)
-        btnLike.setTitle(LikeComment.TitleStrings.unlike, for: .selected)
-        btnLike.setTitleColor(textNormalColor, for: UIControl.State())
-        btnLike.setTitleColor(textSelectedColor, for: .highlighted)
-        btnLike.setTitleColor(textSelectedColor, for: .selected)
-
-        btnApprove.setTitle(ApproveComment.TitleStrings.approve, for: UIControl.State())
-        btnApprove.setTitle(ApproveComment.TitleStrings.unapprove, for: .highlighted)
-        btnApprove.setTitle(ApproveComment.TitleStrings.unapprove, for: .selected)
-        btnApprove.setTitleColor(textNormalColor, for: UIControl.State())
-        btnApprove.setTitleColor(textSelectedColor, for: .highlighted)
-        btnApprove.setTitleColor(textSelectedColor, for: .selected)
-
-        btnEdit.setTitle(EditComment.title, for: UIControl.State())
-        btnEdit.setTitleColor(textNormalColor, for: UIControl.State())
-        btnEdit.tintColor = textNormalColor
-        btnEdit.accessibilityLabel = EditComment.title
-        btnEdit.accessibilityHint = EditComment.hint
-
-        btnSpam.setTitle(MarkAsSpam.title, for: .normal)
-        btnSpam.setTitleColor(textNormalColor, for: UIControl.State())
-        btnSpam.tintColor = textNormalColor
-        btnSpam.accessibilityLabel = MarkAsSpam.title
-        btnSpam.accessibilityHint = MarkAsSpam.hint
-
-        btnTrash.setTitle(TrashComment.title, for: .normal)
-        btnTrash.setTitleColor(textNormalColor, for: UIControl.State())
-        btnTrash.tintColor = textNormalColor
-        btnTrash.accessibilityLabel = TrashComment.title
-        btnTrash.accessibilityHint = TrashComment.hint
-    }
-
-    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
-        super.traitCollectionDidChange(previousTraitCollection)
-        actionsView.spacing = buttonSpacingForCurrentTraits
-    }
-
-    // MARK: - IBActions
-    @IBAction func replyWasPressed(_ sender: AnyObject) {
-        ReachabilityUtils.onAvailableInternetConnectionDo {
-            onReplyClick?(sender)
-        }
-    }
-
-    @IBAction func likeWasPressed(_ sender: AnyObject) {
-        ReachabilityUtils.onAvailableInternetConnectionDo {
-            let onClick = isLikeOn ? onUnlikeClick : onLikeClick
-            isLikeOn = !isLikeOn
-
-            if isLikeOn {
-                UINotificationFeedbackGenerator().notificationOccurred(.success)
-            }
-
-            animateLikeButton(btnLike) {
-                onClick?(sender)
-            }
-        }
-    }
-
-    @IBAction func approveWasPressed(_ sender: AnyObject) {
-        ReachabilityUtils.onAvailableInternetConnectionDo {
-            let onClick = isApproveOn ? onUnapproveClick : onApproveClick
-            isApproveOn = !isApproveOn
-
-            if isApproveOn {
-                UINotificationFeedbackGenerator().notificationOccurred(.success)
-            }
-
-            animateApproveButton(btnApprove) {
-                onClick?(sender)
-            }
-        }
-    }
-
-    @IBAction func trashWasPressed(_ sender: AnyObject) {
-        ReachabilityUtils.onAvailableInternetConnectionDo {
-            onTrashClick?(sender)
-        }
-    }
-
-    @IBAction func spamWasPressed(_ sender: AnyObject) {
-        ReachabilityUtils.onAvailableInternetConnectionDo {
-            onSpamClick?(sender)
-        }
-    }
-
-    @IBAction func editWasPressed(_ sender: AnyObject) {
-        ReachabilityUtils.onAvailableInternetConnectionDo {
-            onEditClick?(sender)
-        }
-    }
-}
-
-// MARK: - Action Button Helpers
-//
-private extension NoteBlockActionsTableViewCell {
-
-    func toggleAction(button: UIButton, hidden: Bool) {
-        button.isHidden = hidden
-        /*
-         * Since these buttons are in a stackView, and since they are
-         * subclasses of `VerticallyStackedButton`, we need to zero the alpha of the button.
-         * This keeps the custom layout in `VerticallyStackedButton` from breaking out
-         * of the constraint-based layout the stackView sets on the button, once hidden.
-         * Note: ideally, we wouldn't be doing custom layout in `VerticallyStackedButton`.
-         * - Brent Feb 15/2017
-         */
-        button.alpha = hidden ? 0.0 : 1.0
-    }
-
-    func animateLikeButton(_ button: UIButton, completion: @escaping (() -> Void)) {
-        guard let overlayImageView = overlayForButton(button, state: .selected) else {
-            return
-        }
-
-        button.addSubview(overlayImageView)
-
-        let animation = button.isSelected ? overlayImageView.fadeInWithRotationAnimation : overlayImageView.fadeOutWithRotationAnimation
-        animation { _ in
-            overlayImageView.removeFromSuperview()
-            completion()
-        }
-    }
-
-    func animateApproveButton(_ button: UIButton, completion: @escaping (() -> Void)) {
-        guard let overlayImageView = overlayForButton(button, state: .selected) else {
-            return
-        }
-
-        button.addSubview(overlayImageView)
-
-        let animation = button.isSelected ? overlayImageView.implodeAnimation : overlayImageView.explodeAnimation
-        animation { _ in
-            overlayImageView.removeFromSuperview()
-            completion()
-        }
-    }
-
-    func overlayForButton(_ button: UIButton, state: UIControl.State) -> UIImageView? {
-        guard let buttonImageView = button.imageView, let targetImage = button.image(for: state) else {
-            return nil
-        }
-
-        let overlayImageView = UIImageView(image: targetImage)
-        overlayImageView.frame = button.convert(buttonImageView.bounds, from: buttonImageView)
-
-        return overlayImageView
-    }
-}
-
-// MARK: - Private Constants
-//
-private extension NoteBlockActionsTableViewCell {
-    struct Constants {
-        static let buttonSpacing = CGFloat(20)
-        static let buttonSpacingCompact = CGFloat(2)
-    }
-}
diff --git a/WordPress/Classes/ViewRelated/Notifications/Views/NoteBlockActionsTableViewCell.xib b/WordPress/Classes/ViewRelated/Notifications/Views/NoteBlockActionsTableViewCell.xib
deleted file mode 100644
index 320795e4e7d2..000000000000
--- a/WordPress/Classes/ViewRelated/Notifications/Views/NoteBlockActionsTableViewCell.xib
+++ /dev/null
@@ -1,142 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES">
-    <device id="retina4_7" orientation="portrait">
-        <adaptation id="fullscreen"/>
-    </device>
-    <dependencies>
-        <deployment identifier="iOS"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/>
-        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
-    </dependencies>
-    <objects>
-        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
-        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
-        <tableViewCell contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" layoutMarginsFollowReadableWidth="YES" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" id="vbp-eh-kPo" userLabel="Actions" customClass="NoteBlockActionsTableViewCell" customModule="WordPress">
-            <rect key="frame" x="0.0" y="0.0" width="389" height="72"/>
-            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
-            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" layoutMarginsFollowReadableWidth="YES" tableViewCell="vbp-eh-kPo" id="g83-Wv-yJ5">
-                <rect key="frame" x="0.0" y="0.0" width="389" height="71.5"/>
-                <autoresizingMask key="autoresizingMask"/>
-                <subviews>
-                    <stackView opaque="NO" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" axis="vertical" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="8I0-Zx-4NW">
-                        <rect key="frame" x="0.0" y="0.0" width="389" height="71.5"/>
-                        <subviews>
-                            <stackView opaque="NO" contentMode="scaleToFill" distribution="fillEqually" alignment="center" translatesAutoresizingMaskIntoConstraints="NO" id="V3D-QS-G4g">
-                                <rect key="frame" x="20" y="11" width="349" height="50"/>
-                                <subviews>
-                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Agc-K2-0vs" userLabel="Approve" customClass="VerticallyStackedButton">
-                                        <rect key="frame" x="0.0" y="8.5" width="58" height="33"/>
-                                        <fontDescription key="fontDescription" type="system" pointSize="11"/>
-                                        <inset key="contentEdgeInsets" minX="0.0" minY="6" maxX="0.0" maxY="6"/>
-                                        <state key="normal" title="Approve" image="notifications-approve">
-                                            <color key="titleColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                            <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                        </state>
-                                        <state key="selected" image="notifications-approved"/>
-                                        <state key="highlighted" image="notifications-approved"/>
-                                        <connections>
-                                            <action selector="approveWasPressed:" destination="vbp-eh-kPo" eventType="touchUpInside" id="SJC-Dn-jzf"/>
-                                        </connections>
-                                    </button>
-                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="hU3-yd-ZtO" userLabel="Spam" customClass="VerticallyStackedButton">
-                                        <rect key="frame" x="58" y="8.5" width="58.5" height="33"/>
-                                        <fontDescription key="fontDescription" type="system" pointSize="11"/>
-                                        <inset key="contentEdgeInsets" minX="0.0" minY="6" maxX="0.0" maxY="6"/>
-                                        <state key="normal" title="Spam" image="notifications-spam">
-                                            <color key="titleColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                            <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                        </state>
-                                        <connections>
-                                            <action selector="spamWasPressed:" destination="vbp-eh-kPo" eventType="touchUpInside" id="pG5-AN-pz0"/>
-                                        </connections>
-                                    </button>
-                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="TYK-fl-vc7" userLabel="Trash" customClass="VerticallyStackedButton">
-                                        <rect key="frame" x="116.5" y="8.5" width="58" height="33"/>
-                                        <fontDescription key="fontDescription" type="system" pointSize="11"/>
-                                        <inset key="contentEdgeInsets" minX="0.0" minY="6" maxX="0.0" maxY="6"/>
-                                        <state key="normal" title="Trash" image="notifications-trash">
-                                            <color key="titleColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                            <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                        </state>
-                                        <connections>
-                                            <action selector="trashWasPressed:" destination="vbp-eh-kPo" eventType="touchUpInside" id="ayd-CK-vjN"/>
-                                        </connections>
-                                    </button>
-                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="e8r-Uo-uFk" userLabel="Like" customClass="VerticallyStackedButton">
-                                        <rect key="frame" x="174.5" y="8.5" width="58" height="33"/>
-                                        <fontDescription key="fontDescription" type="system" pointSize="11"/>
-                                        <inset key="contentEdgeInsets" minX="0.0" minY="6" maxX="0.0" maxY="6"/>
-                                        <state key="normal" title="Like" image="notifications-like">
-                                            <color key="titleColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                            <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                        </state>
-                                        <state key="selected" image="notifications-liked"/>
-                                        <state key="highlighted" image="notifications-liked"/>
-                                        <connections>
-                                            <action selector="likeWasPressed:" destination="vbp-eh-kPo" eventType="touchUpInside" id="Gij-LE-gQ5"/>
-                                        </connections>
-                                    </button>
-                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="LLz-LW-VxX" userLabel="Edit" customClass="VerticallyStackedButton">
-                                        <rect key="frame" x="232.5" y="9" width="58.5" height="32"/>
-                                        <fontDescription key="fontDescription" type="system" pointSize="11"/>
-                                        <inset key="contentEdgeInsets" minX="0.0" minY="6" maxX="0.0" maxY="6"/>
-                                        <state key="normal" title="Edit" image="icon-pencil">
-                                            <color key="titleColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                            <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                        </state>
-                                        <state key="selected" image="icon-pencil"/>
-                                        <state key="highlighted" image="icon-pencil"/>
-                                        <connections>
-                                            <action selector="editWasPressed:" destination="vbp-eh-kPo" eventType="touchUpInside" id="7Vz-WB-sXZ"/>
-                                        </connections>
-                                    </button>
-                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="DXE-y2-DWd" userLabel="Reply" customClass="VerticallyStackedButton">
-                                        <rect key="frame" x="291" y="8.5" width="58" height="33"/>
-                                        <fontDescription key="fontDescription" type="system" pointSize="11"/>
-                                        <inset key="contentEdgeInsets" minX="0.0" minY="6" maxX="0.0" maxY="6"/>
-                                        <state key="normal" title="Reply" image="notifications-reply">
-                                            <color key="titleColor" red="0.0" green="0.47843137250000001" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                            <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
-                                        </state>
-                                        <state key="selected" image="notifications-reply"/>
-                                        <state key="highlighted" image="notifications-reply"/>
-                                        <connections>
-                                            <action selector="replyWasPressed:" destination="vbp-eh-kPo" eventType="touchUpInside" id="llo-Tq-bVM"/>
-                                        </connections>
-                                    </button>
-                                </subviews>
-                            </stackView>
-                        </subviews>
-                        <edgeInsets key="layoutMargins" top="0.0" left="0.0" bottom="0.0" right="0.0"/>
-                    </stackView>
-                </subviews>
-                <constraints>
-                    <constraint firstAttribute="bottom" secondItem="8I0-Zx-4NW" secondAttribute="bottom" id="GOz-AM-781"/>
-                    <constraint firstItem="8I0-Zx-4NW" firstAttribute="top" secondItem="g83-Wv-yJ5" secondAttribute="top" id="Ngd-db-4lD"/>
-                    <constraint firstAttribute="trailing" secondItem="8I0-Zx-4NW" secondAttribute="trailing" id="aLx-rw-4b6"/>
-                    <constraint firstItem="8I0-Zx-4NW" firstAttribute="leading" secondItem="g83-Wv-yJ5" secondAttribute="leading" id="iin-07-emk"/>
-                </constraints>
-            </tableViewCellContentView>
-            <connections>
-                <outlet property="actionsView" destination="V3D-QS-G4g" id="JZg-7z-Y8g"/>
-                <outlet property="btnApprove" destination="Agc-K2-0vs" id="7mX-9C-ieh"/>
-                <outlet property="btnEdit" destination="LLz-LW-VxX" id="nXr-bK-lSP"/>
-                <outlet property="btnLike" destination="e8r-Uo-uFk" id="zQu-vq-aFT"/>
-                <outlet property="btnReply" destination="DXE-y2-DWd" id="a3c-Jw-2bD"/>
-                <outlet property="btnSpam" destination="hU3-yd-ZtO" id="H1K-eP-bp7"/>
-                <outlet property="btnTrash" destination="TYK-fl-vc7" id="amO-Qa-IZv"/>
-            </connections>
-            <point key="canvasLocation" x="104" y="353"/>
-        </tableViewCell>
-    </objects>
-    <resources>
-        <image name="icon-pencil" width="20" height="20"/>
-        <image name="notifications-approve" width="21" height="21"/>
-        <image name="notifications-approved" width="21" height="21"/>
-        <image name="notifications-like" width="21" height="21"/>
-        <image name="notifications-liked" width="21" height="21"/>
-        <image name="notifications-reply" width="21" height="21"/>
-        <image name="notifications-spam" width="21" height="21"/>
-        <image name="notifications-trash" width="21" height="21"/>
-    </resources>
-</document>
diff --git a/WordPress/Classes/ViewRelated/Views/VerticallyStackedButton.h b/WordPress/Classes/ViewRelated/Views/VerticallyStackedButton.h
deleted file mode 100644
index 0633a8e50d17..000000000000
--- a/WordPress/Classes/ViewRelated/Views/VerticallyStackedButton.h
+++ /dev/null
@@ -1,5 +0,0 @@
-#import <UIKit/UIKit.h>
-
-@interface VerticallyStackedButton : UIButton
-
-@end
diff --git a/WordPress/Classes/ViewRelated/Views/VerticallyStackedButton.m b/WordPress/Classes/ViewRelated/Views/VerticallyStackedButton.m
deleted file mode 100644
index c5e1eaa346f9..000000000000
--- a/WordPress/Classes/ViewRelated/Views/VerticallyStackedButton.m
+++ /dev/null
@@ -1,45 +0,0 @@
-#import "VerticallyStackedButton.h"
-
-@import WordPressShared;
-
-static const CGFloat ImageLabelSeparation = 2.f;
-static const CGFloat LabelFontSize = 11.f;
-
-@implementation VerticallyStackedButton
-
-- (instancetype)initWithFrame:(CGRect)frame {
-    self = [super initWithFrame:frame];
-    if (self) {
-        [self.titleLabel setLineBreakMode:NSLineBreakByTruncatingTail];
-        [self setTitleColor:[WPStyleGuide mediumBlue] forState:UIControlStateNormal];
-        [self setTitleColor:[WPStyleGuide darkBlue] forState:UIControlStateHighlighted];
-        [self setTintColor:[WPStyleGuide mediumBlue]];
-    }
-    
-    return self;
-}
-
-- (void)layoutSubviews {
-    [super layoutSubviews];
-    
-    [self.titleLabel setFont:[WPFontManager systemRegularFontOfSize:LabelFontSize]];
-    
-    CGSize imageSize    = self.imageView.image.size;
-    CGSize maxTitleSize = CGSizeMake(CGRectGetWidth(self.frame), CGRectGetHeight(self.frame) - imageSize.height);
-    CGSize titleSize    = [self.titleLabel sizeThatFits:maxTitleSize];
-
-    // Prevent Overflowing the container's area
-    titleSize.width     = MIN(CGRectGetWidth(self.frame), titleSize.width);
-
-    self.imageView.frame = CGRectIntegral(CGRectMake((CGRectGetWidth(self.frame) - imageSize.width) * 0.5f,
-                                                     (CGRectGetHeight(self.frame) - (imageSize.height + titleSize.height)) * 0.5f,
-                                                     imageSize.width,
-                                                     imageSize.height));
-    
-    self.titleLabel.frame = CGRectIntegral(CGRectMake((CGRectGetWidth(self.frame) - titleSize.width) * 0.5f,
-                                                      CGRectGetMaxY(self.imageView.frame) + ImageLabelSeparation,
-                                                      titleSize.width,
-                                                      titleSize.height));
-}
-
-@end


Reviews:
user: login: kean
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-11T00:11:33Z
user: login: mokagio
body: I can't authenticate with App Center to test the prototype build. But this is all removals and CI is green, so I'm happy to approve.

:fire:
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-11T01:08:30Z
user: login: crazytonyli
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-11T01:18:28Z
user: login: kean
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-11T01:40:02Z

Review comments:
diff_hunk: @@ -662,58 +657,6 @@ private extension NotificationDetailsViewController {
         cell.downloadGravatarWithURL(mediaURL)
     }
 
-    func setupActionsCell(_ cell: NoteBlockActionsTableViewCell, blockGroup: FormattableContentGroup) {
-        guard let commentBlock: FormattableCommentContent = blockGroup.blockOfKind(.comment) else {
path: WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationDetailsViewController.swift
user: login: kean
body: This check – `blockOfKind(.comment)` – is a guarantee that this content is never displayed by this screen.
created_at: 2025-03-11T00:10:46Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1,363 +0,0 @@
-import Foundation
-import WordPressShared
-
-// MARK: - NoteBlockActionsTableViewCell
-//
-class NoteBlockActionsTableViewCell: NoteBlockTableViewCell {
-    typealias EventHandler = ((_ sender: AnyObject) -> Void)
-
-    /// Actions StackView
-    ///
-    @IBOutlet fileprivate var actionsView: UIStackView!
-
-    /// Reply Action Button
-    ///
-    @IBOutlet fileprivate var btnReply: UIButton!
-
-    /// Like Action Button
-    ///
-    @IBOutlet fileprivate var btnLike: UIButton!
-
-    /// Approve Action Button
-    ///
-    @IBOutlet fileprivate var btnApprove: UIButton!
-
-    /// Trash Action Button
-    ///
-    @IBOutlet fileprivate var btnTrash: UIButton!
-
-    /// Spam Action Button
-    ///
-    @IBOutlet fileprivate var btnSpam: UIButton!
-
-    /// Edit Action Button
-    ///
-    @IBOutlet fileprivate var btnEdit: UIButton!
-
-    /// Handler to be executed on Reply event
-    ///
-    @objc var onReplyClick: EventHandler?
-
-    /// Handler to be executed on Like event
-    ///
-    @objc var onLikeClick: EventHandler?
-
-    /// Handler to be executed on Unlike event
-    ///
-    @objc var onUnlikeClick: EventHandler?
-
-    /// Handler to be executed on Approve event
-    ///
-    @objc var onApproveClick: EventHandler?
-
-    /// Handler to be executed on Unapprove event
-    ///
-    @objc var onUnapproveClick: EventHandler?
-
-    /// Handler to be executed on Trash event
-    ///
-    @objc var onTrashClick: EventHandler?
-
-    /// Handler to be executed on Spam event
-    ///
-    @objc var onSpamClick: EventHandler?
-
-    // Handler to be executed on Edition event
-    //
-    @objc var onEditClick: EventHandler?
-
-    /// Indicates whether the Reply Action is enabled, or not
-    ///
-    @objc var isReplyEnabled: Bool = false {
-        didSet {
-            toggleAction(button: btnReply, hidden: !isReplyEnabled)
-        }
-    }
-
-    /// Indicates whether the Like Action is enabled, or not
-    ///
-    @objc var isLikeEnabled: Bool = false {
-        didSet {
-            toggleAction(button: btnLike, hidden: !isLikeEnabled)
-        }
-    }
-
-    /// Indicates whether the Approve Action is enabled, or not
-    ///
-    @objc var isApproveEnabled: Bool = false {
-        didSet {
-            toggleAction(button: btnApprove, hidden: !isApproveEnabled)
-        }
-    }
-
-    /// Indicates whether the Trash Action is enabled, or not
-    ///
-    @objc var isTrashEnabled: Bool = false {
-        didSet {
-            toggleAction(button: btnTrash, hidden: !isTrashEnabled)
-        }
-    }
-
-    /// Indicates whether the Spam Action is enabled, or not
-    ///
-    @objc var isSpamEnabled: Bool = false {
-        didSet {
-            toggleAction(button: btnSpam, hidden: !isSpamEnabled)
-        }
-    }
-
-    /// Indicates whether the Edit Action is enabled, or not
-    ///
-    @objc var isEditEnabled: Bool = false {
-        didSet {
-            toggleAction(button: btnEdit, hidden: !isEditEnabled)
-        }
-    }
-
-    /// Indicates if all actions are disabled.
-    ///
-    @objc var allActionsDisabled: Bool {
-        return !isReplyEnabled &&
-            !isLikeEnabled &&
-            !isApproveEnabled &&
-            !isTrashEnabled &&
-            !isSpamEnabled &&
-            !isEditEnabled
-    }
-
-    /// Indicates whether Like is in it's "Selected" state, or not
-    ///
-    @objc var isLikeOn: Bool {
-        set {
-            btnLike.isSelected = newValue
-            btnLike.accessibilityLabel = likeAccesibilityLabel
-            btnLike.accessibilityHint = likeAccessibilityHint
-            // Force button trait to avoid automatic "Selected" trait
-            btnLike.accessibilityTraits = UIAccessibilityTraits.button
-        }
-        get {
-            return btnLike.isSelected
-        }
-    }
-
-    /// Indicates whether Approve is in it's "Selected" state, or not
-    ///
-    @objc var isApproveOn: Bool {
-        set {
-            btnApprove.isSelected = newValue
-            btnApprove.accessibilityLabel = approveAccesibilityLabel
-            btnApprove.accessibilityHint = approveAccesibilityHint
-            // Force button trait to avoid automatic "Selected" trait
-            btnApprove.accessibilityTraits = UIAccessibilityTraits.button
-        }
-        get {
-            return btnApprove.isSelected
-        }
-    }
-
-    /// Returns the required button spacing
-    ///
-    fileprivate var buttonSpacingForCurrentTraits: CGFloat {
-        let isHorizontallyCompact = traitCollection.horizontalSizeClass == .compact
-        return isHorizontallyCompact ? Constants.buttonSpacingCompact : Constants.buttonSpacing
-    }
-
-    /// Returns the accessibility label for the Approve Button
-    ///
-    fileprivate var approveAccesibilityLabel: String {
-        return isApproveOn ? ApproveComment.TitleStrings.unapprove : ApproveComment.TitleStrings.approve
-    }
-
-    /// Returns the accessibility hint for the Approve Button
-    ///
-    fileprivate var approveAccesibilityHint: String {
-        return isApproveOn ? ApproveComment.TitleHints.unapprove : ApproveComment.TitleHints.approve
-    }
-
-    /// Returns the accessibility label for the Like Button
-    ///
-    fileprivate var likeAccesibilityLabel: String {
-        return isLikeOn ? LikeComment.TitleStrings.unlike : LikeComment.TitleStrings.like
-    }
-
-    /// Returns the accessibility hint for the Like Button
-    ///
-    fileprivate var likeAccessibilityHint: String {
-        return isLikeOn ? LikeComment.TitleHints.unlike : LikeComment.TitleHints.like
-    }
-
-    // MARK: - Overriden Methods
-
-    override func awakeFromNib() {
-        super.awakeFromNib()
-
-        selectionStyle = .none
-
-        let textNormalColor = WPStyleGuide.Notifications.blockActionDisabledColor
-        let textSelectedColor = WPStyleGuide.Notifications.blockActionEnabledColor
-
-        btnReply.setTitle(ReplyToComment.title, for: UIControl.State())
-        btnReply.setTitleColor(textNormalColor, for: UIControl.State())
-        btnReply.accessibilityLabel = ReplyToComment.title
-        btnReply.accessibilityHint = ReplyToComment.hint
-        btnReply.accessibilityIdentifier = ReplyToComment.identifier
-
-        btnLike.setTitle(LikeComment.TitleStrings.like, for: UIControl.State())
-        btnLike.setTitle(LikeComment.TitleStrings.unlike, for: .highlighted)
-        btnLike.setTitle(LikeComment.TitleStrings.unlike, for: .selected)
-        btnLike.setTitleColor(textNormalColor, for: UIControl.State())
-        btnLike.setTitleColor(textSelectedColor, for: .highlighted)
-        btnLike.setTitleColor(textSelectedColor, for: .selected)
-
-        btnApprove.setTitle(ApproveComment.TitleStrings.approve, for: UIControl.State())
-        btnApprove.setTitle(ApproveComment.TitleStrings.unapprove, for: .highlighted)
-        btnApprove.setTitle(ApproveComment.TitleStrings.unapprove, for: .selected)
-        btnApprove.setTitleColor(textNormalColor, for: UIControl.State())
-        btnApprove.setTitleColor(textSelectedColor, for: .highlighted)
-        btnApprove.setTitleColor(textSelectedColor, for: .selected)
-
-        btnEdit.setTitle(EditComment.title, for: UIControl.State())
-        btnEdit.setTitleColor(textNormalColor, for: UIControl.State())
-        btnEdit.tintColor = textNormalColor
-        btnEdit.accessibilityLabel = EditComment.title
-        btnEdit.accessibilityHint = EditComment.hint
-
-        btnSpam.setTitle(MarkAsSpam.title, for: .normal)
-        btnSpam.setTitleColor(textNormalColor, for: UIControl.State())
-        btnSpam.tintColor = textNormalColor
-        btnSpam.accessibilityLabel = MarkAsSpam.title
-        btnSpam.accessibilityHint = MarkAsSpam.hint
-
-        btnTrash.setTitle(TrashComment.title, for: .normal)
-        btnTrash.setTitleColor(textNormalColor, for: UIControl.State())
-        btnTrash.tintColor = textNormalColor
-        btnTrash.accessibilityLabel = TrashComment.title
-        btnTrash.accessibilityHint = TrashComment.hint
-    }
-
-    override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
-        super.traitCollectionDidChange(previousTraitCollection)
-        actionsView.spacing = buttonSpacingForCurrentTraits
-    }
-
-    // MARK: - IBActions
-    @IBAction func replyWasPressed(_ sender: AnyObject) {
-        ReachabilityUtils.onAvailableInternetConnectionDo {
-            onReplyClick?(sender)
-        }
-    }
-
-    @IBAction func likeWasPressed(_ sender: AnyObject) {
-        ReachabilityUtils.onAvailableInternetConnectionDo {
-            let onClick = isLikeOn ? onUnlikeClick : onLikeClick
-            isLikeOn = !isLikeOn
-
-            if isLikeOn {
-                UINotificationFeedbackGenerator().notificationOccurred(.success)
-            }
-
-            animateLikeButton(btnLike) {
-                onClick?(sender)
-            }
-        }
-    }
-
-    @IBAction func approveWasPressed(_ sender: AnyObject) {
-        ReachabilityUtils.onAvailableInternetConnectionDo {
-            let onClick = isApproveOn ? onUnapproveClick : onApproveClick
-            isApproveOn = !isApproveOn
-
-            if isApproveOn {
-                UINotificationFeedbackGenerator().notificationOccurred(.success)
-            }
-
-            animateApproveButton(btnApprove) {
-                onClick?(sender)
-            }
-        }
-    }
-
-    @IBAction func trashWasPressed(_ sender: AnyObject) {
-        ReachabilityUtils.onAvailableInternetConnectionDo {
path: WordPress/Classes/ViewRelated/Notifications/Views/NoteBlockActionsTableViewCell.swift
user: login: kean
body: `ReachabilityUtils.onAvailableInternetConnectionDo` – should not exist. There are only 8 more places where it's used.
created_at: 2025-03-11T00:11:29Z
author_association: CONTRIBUTOR
diff_hunk: @@ -482,8 +481,6 @@ private extension NotificationDetailsViewController {
             return NoteBlockTextTableViewCell.reuseIdentifier()
         case .comment:
             return NoteBlockCommentTableViewCell.reuseIdentifier()
-        case .actions:
-            return NoteBlockActionsTableViewCell.reuseIdentifier()
path: WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationDetailsViewController.swift
user: login: crazytonyli
body: From a quick look, `.actions` is still used in this function. I'm not sure when that function will be called. But it does not seem obvious to me that `.actions` is not used.

https://github.com/wordpress-mobile/WordPress-iOS/blob/e51e8479e9a2e9291b7c48a738fc26ece114e155/WordPress/Classes/ViewRelated/Notifications/FormattableContent/Groups/BodyContentGroup.swift#L70
created_at: 2025-03-11T01:18:27Z
author_association: CONTRIBUTOR
diff_hunk: @@ -482,8 +481,6 @@ private extension NotificationDetailsViewController {
             return NoteBlockTextTableViewCell.reuseIdentifier()
         case .comment:
             return NoteBlockCommentTableViewCell.reuseIdentifier()
-        case .actions:
-            return NoteBlockActionsTableViewCell.reuseIdentifier()
path: WordPress/Classes/ViewRelated/Notifications/Controllers/NotificationDetailsViewController.swift
user: login: kean
body: `groupsForCommentBodyBlocks` is called during parsing.  The `NotificationsDetailsScreenVC` is never used for showing comments. It was replaced with `NotificationCommentDetailViewController` – this is 100%. We can be sure that `.comment` group is never displayed by `NotificationsDetailsScreenVC`.

The reason I know `.actions` isn't used for anything other than notification is because `setupActionsCell` that configures it after creating has an assertion for `blockGroup.blockOfKind(.comment)`.

```swift
func setupActionsCell(_ cell: NoteBlockActionsTableViewCell, blockGroup: FormattableContentGroup) {
         guard let commentBlock: FormattableCommentContent = blockGroup.blockOfKind(.comment) else {
             assertionFailure("Missing Comment Block for Notification \(note.notificationId)")
             return
         }
```
created_at: 2025-03-11T01:40:02Z
author_association: CONTRIBUTOR

PR comments:
user: login: dangermattic
created_at: 2025-03-11T00:10:50Z
body: <!--
  0 Errors
  1 Warning: This PR is larger than 500 lin...
  0 Messages
  0 Markdowns
-->
<table>
  <thead>
    <tr>
      <th width="50"></th>
      <th width="100%" data-danger-table="true" data-kind="Warning">
          1 Warning
      </th>
     </tr>
  </thead>
  <tbody>
    <tr>
      <td>:warning:</td>
      <td data-sticky="false">This PR is larger than 500 lines of changes. Please consider splitting it into smaller PRs for easier and faster reviews.</td>
    </tr>
  </tbody>
</table>

<p align="right" data-meta="generated_by_pr-check">
  Generated by :no_entry_sign: <a href="https://danger.systems/">Danger</a>
</p>

author_association: COLLABORATOR
user: login: wpmobilebot
created_at: 2025-03-11T00:24:03Z
body: <!-- REUSE_ID: prototype-build-link-WPiOS-One-Offs -->

<details><summary><img alt='WordPress Alpha' align='top' src='https://raw.githubusercontent.com/buildkite/emojis/main/img-buildkite-64/wordpress.png' width='20px' />📲 You can test the changes from this Pull Request in <b>WordPress Alpha</b> by scanning the QR code below to install the corresponding build.</summary>
<table>
<tr>
  <td rowspan='7' width='260px'><img src='https://api.qrserver.com/v1/create-qr-code/?size=500x500&qzone=4&data=https%3A%2F%2Finstall.appcenter.ms%2Forgs%2Fautomattic%2Fapps%2FWPiOS-One-Offs%2Freleases%2F11622' width='250' height='250' /></td>
  <td><b>App Name</b></td><td><img alt='WordPress Alpha' align='top' src='https://raw.githubusercontent.com/buildkite/emojis/main/img-buildkite-64/wordpress.png' width='20px' /> WordPress Alpha</td>
</tr>
<tr><td><b>Configuration</b></td><td>Release-Alpha</td></tr>
<tr><td><b>Build Number</b></td><td>pr24183-db09e72</td></tr>
<tr><td><b>Version</b></td><td>25.8</td></tr>
<tr><td><b>Bundle ID</b></td><td>org.wordpress.alpha</td></tr>
<tr><td><b>Commit</b></td><td>db09e72c0b9714882d982e5175ec024f1606abd4</td></tr>
<tr><td><b>App Center Build</b></td><td><a href='https://install.appcenter.ms/orgs/automattic/apps/WPiOS-One-Offs/releases/11622'>WPiOS - One-Offs #11622</a></td></tr>
</table>
<em>Automatticians: You can use our internal self-serve MC tool to give yourself access to App Center if needed.</em>
</details>

author_association: CONTRIBUTOR
user: login: wpmobilebot
created_at: 2025-03-11T00:24:33Z
body: <!-- REUSE_ID: prototype-build-link-jetpack-installable-builds -->

<details><summary><img alt='Jetpack Alpha' align='top' src='https://raw.githubusercontent.com/buildkite/emojis/main/img-buildkite-64/jetpack.png' width='20px' />📲 You can test the changes from this Pull Request in <b>Jetpack Alpha</b> by scanning the QR code below to install the corresponding build.</summary>
<table>
<tr>
  <td rowspan='7' width='260px'><img src='https://api.qrserver.com/v1/create-qr-code/?size=500x500&qzone=4&data=https%3A%2F%2Finstall.appcenter.ms%2Forgs%2Fautomattic%2Fapps%2Fjetpack-installable-builds%2Freleases%2F10653' width='250' height='250' /></td>
  <td><b>App Name</b></td><td><img alt='Jetpack Alpha' align='top' src='https://raw.githubusercontent.com/buildkite/emojis/main/img-buildkite-64/jetpack.png' width='20px' /> Jetpack Alpha</td>
</tr>
<tr><td><b>Configuration</b></td><td>Release-Alpha</td></tr>
<tr><td><b>Build Number</b></td><td>pr24183-db09e72</td></tr>
<tr><td><b>Version</b></td><td>25.8</td></tr>
<tr><td><b>Bundle ID</b></td><td>com.jetpack.alpha</td></tr>
<tr><td><b>Commit</b></td><td>db09e72c0b9714882d982e5175ec024f1606abd4</td></tr>
<tr><td><b>App Center Build</b></td><td><a href='https://install.appcenter.ms/orgs/automattic/apps/jetpack-installable-builds/releases/10653'>jetpack-installable-builds #10653</a></td></tr>
</table>
<em>Automatticians: You can use our internal self-serve MC tool to give yourself access to App Center if needed.</em>
</details>

author_association: CONTRIBUTOR