From e8992dac95ea819162bdfbf2d10258542cd311ab Mon Sep 17 00:00:00 2001
From: Maurice Parker <mo@vincode.io>
Date: Wed, 5 Jun 2019 17:42:35 -0500
Subject: [PATCH] Fix issue where deletes were crashing the app.  Issue #702

---
 Shared/Commands/DeleteCommand.swift           | 24 +++++++++++++++++--
 iOS/MasterFeed/MasterFeedViewController.swift | 21 +++++++++++-----
 2 files changed, 37 insertions(+), 8 deletions(-)

diff --git a/Shared/Commands/DeleteCommand.swift b/Shared/Commands/DeleteCommand.swift
index 6a8a15a5d..cb7f6f3cc 100644
--- a/Shared/Commands/DeleteCommand.swift
+++ b/Shared/Commands/DeleteCommand.swift
@@ -46,12 +46,30 @@ final class DeleteCommand: UndoableCommand {
 	func perform() {
 
 		BatchUpdate.shared.perform {
-			itemSpecifiers.forEach { $0.delete() }
+			itemSpecifiers.forEach { $0.delete() {} }
 			treeController.rebuild()
 		}
 		registerUndo()
 	}
 
+	func perform(completion: @escaping () -> Void) {
+		
+		let group = DispatchGroup()
+		group.enter()
+		itemSpecifiers.forEach {
+			$0.delete() {
+				group.leave()
+			}
+		}
+		treeController.rebuild()
+	
+		group.notify(queue: DispatchQueue.main) {
+			self.registerUndo()
+			completion()
+		}
+		
+	}
+	
 	func undo() {
 
 		BatchUpdate.shared.perform {
@@ -132,18 +150,20 @@ private struct SidebarItemSpecifier {
 		self.path = ContainerPath(account: account!, folders: node.containingFolders())
 	}
 
-	func delete() {
+	func delete(completion: @escaping () -> Void) {
 
 		if let feed = feed {
 			BatchUpdate.shared.start()
 			account?.removeFeed(feed, from: path.resolveContainer()) { result in
 				BatchUpdate.shared.end()
+				completion()
 				self.checkResult(result)
 			}
 		} else if let folder = folder {
 			BatchUpdate.shared.start()
 			account?.removeFolder(folder) { result in
 				BatchUpdate.shared.end()
+				completion()
 				self.checkResult(result)
 			}
 		}
diff --git a/iOS/MasterFeed/MasterFeedViewController.swift b/iOS/MasterFeed/MasterFeedViewController.swift
index 4f01ed04d..809666f11 100644
--- a/iOS/MasterFeed/MasterFeedViewController.swift
+++ b/iOS/MasterFeed/MasterFeedViewController.swift
@@ -526,14 +526,23 @@ class MasterFeedViewController: ProgressTableViewController, UndoableCommandRunn
 				else {
 					return
 		}
-		
-		navState.beginUpdates()
 
-		runCommand(deleteCommand)
-		navState.rebuildShadowTable()
-		tableView.deleteRows(at: [indexPath], with: .automatic)
+		var deleteIndexPaths = [indexPath]
+		if navState.isExpanded(deleteNode) {
+			for i in 0..<deleteNode.numberOfChildNodes {
+				deleteIndexPaths.append(IndexPath(row: indexPath.row + 1 + i, section: indexPath.section))
+			}
+		}
 		
-		navState.endUpdates()
+		pushUndoableCommand(deleteCommand)
+
+		navState.beginUpdates()
+		deleteCommand.perform {
+			self.navState.treeController.rebuild()
+			self.navState.rebuildShadowTable()
+			self.tableView.deleteRows(at: deleteIndexPaths, with: .automatic)
+			self.navState.endUpdates()
+		}
 		
 	}