import Messages import SwiftUI import UIKit final class MessagesViewController: MSMessagesAppViewController { private let stickerBrowser = StickerBrowserViewController() private var addPackHostingController: UIHostingController? override func viewDidLoad() { super.viewDidLoad() addStickerBrowser() stickerBrowser.reloadStickers() } override func willBecomeActive(with conversation: MSConversation) { stickerBrowser.reloadStickers() // Prompt user to add a pack on first launch if StickerStore.shared.savedPacks.isEmpty { requestPresentationStyle(.expanded) } } // MARK: - Presentation style transitions override func willTransition(to presentationStyle: MSMessagesAppPresentationStyle) { removeAddPackView() } override func didTransition(to presentationStyle: MSMessagesAppPresentationStyle) { switch presentationStyle { case .expanded: showAddPackView() case .compact: stickerBrowser.reloadStickers() default: break } } // MARK: - Child view controllers private func addStickerBrowser() { addChild(stickerBrowser) stickerBrowser.view.translatesAutoresizingMaskIntoConstraints = false view.addSubview(stickerBrowser.view) NSLayoutConstraint.activate([ stickerBrowser.view.topAnchor.constraint(equalTo: view.topAnchor), stickerBrowser.view.bottomAnchor.constraint(equalTo: view.bottomAnchor), stickerBrowser.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), stickerBrowser.view.trailingAnchor.constraint(equalTo: view.trailingAnchor), ]) stickerBrowser.didMove(toParent: self) } private func showAddPackView() { let addPackView = AddPackView { [weak self] in self?.stickerBrowser.reloadStickers() } let hostingController = UIHostingController(rootView: addPackView) addPackHostingController = hostingController addChild(hostingController) hostingController.view.translatesAutoresizingMaskIntoConstraints = false view.addSubview(hostingController.view) NSLayoutConstraint.activate([ hostingController.view.topAnchor.constraint(equalTo: view.topAnchor), hostingController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor), hostingController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), hostingController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor), ]) hostingController.didMove(toParent: self) } private func removeAddPackView() { guard let hostingController = addPackHostingController else { return } hostingController.willMove(toParent: nil) hostingController.view.removeFromSuperview() hostingController.removeFromParent() addPackHostingController = nil } }