Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion WorkflowModals/Sources/AnyModalToastContainer.swift
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,6 @@ public final class AnyModalToastContainerViewController: ScreenViewController<An
}

guard let host = modalHost else {

// If we're not installed the view controller hierarchy, we don't expect to find a
// host, but if we are and we don't have a modal host, that's a programmer error
// since we cannot present our modals.
Expand All @@ -196,6 +195,10 @@ public final class AnyModalToastContainerViewController: ScreenViewController<An
return
}

guard parent != nil else {
return
}

guard view.window != nil else {
return
}
Expand Down
63 changes: 63 additions & 0 deletions WorkflowModals/Tests/ModalContainerTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,69 @@ final class ModalContainerTests: XCTestCase {
}
}
}

func test_modal_host_update_defers_when_view_has_window_without_parent() throws {
class HostViewController: UIViewController, ModalHost {

var updateModalsCount = 0
var aggregatedModalCount = 0

func setNeedsModalUpdate() {
updateModalsCount += 1
aggregatedModalCount = aggregateModals().modals.count
}
}

let modalScreen = ModalContainer<EmptyScreen, EmptyScreen>(
base: EmptyScreen(),
modals: []
)

let description = modalScreen.viewControllerDescription(environment: .empty)
let viewController = try XCTUnwrap(description.buildViewController() as? AnyModalToastContainerViewController)

let host = HostViewController()

show(vc: host) { host in
viewController.view.frame = host.view.bounds
host.view.addSubview(viewController.view)

XCTAssertNil(viewController.parent)
XCTAssertNotNil(viewController.view.window)

let updatedScreen = ModalContainer(
base: EmptyScreen(),
modals: [
Modal(
key: "first-modal",
style: FullScreenModalStyle(),
content: EmptyScreen()
),
]
)

updatedScreen.viewControllerDescription(environment: .empty)
.update(viewController: viewController)
viewController.view.layoutIfNeeded()

XCTAssertEqual(host.updateModalsCount, 0)

viewController.view.removeFromSuperview()
host.addChild(viewController)
host.view.addSubview(viewController.view)
viewController.didMove(toParent: host)

viewController.view.setNeedsLayout()
viewController.view.layoutIfNeeded()

XCTAssertEqual(host.updateModalsCount, 1)
XCTAssertEqual(host.aggregatedModalCount, 1)

viewController.willMove(toParent: nil)
viewController.view.removeFromSuperview()
viewController.removeFromParent()
}
}
}

extension ModalContainerTests {
Expand Down
Loading