// MIT License // // Copyright (c) 2017-2022 MessageKit // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. import MessageKit import SafariServices import SwiftUI import UIKit final internal class LaunchViewController: UITableViewController { // MARK: Lifecycle // MARK: - View Life Cycle init() { super.init(style: .insetGrouped) } required init?(coder _: NSCoder) { nil } // MARK: Internal override func viewDidLoad() { super.viewDidLoad() title = "MessageKit" navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil) navigationController?.navigationBar.tintColor = .primaryColor tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell") tableView.tableFooterView = UIView() } // MARK: - UITableViewDataSource override func numberOfSections(in _: UITableView) -> Int { sections.count } override func tableView(_: UITableView, numberOfRowsInSection section: Int) -> Int { sections[section].rows.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell") ?? UITableViewCell() cell.textLabel?.text = sections[indexPath.section].rows[indexPath.row].title cell.accessoryType = .disclosureIndicator return cell } // MARK: - UITableViewDelegate // swiftlint:disable cyclomatic_complexity override func tableView(_: UITableView, didSelectRowAt indexPath: IndexPath) { let cell = sections[indexPath.section].rows[indexPath.row] switch cell { case .basic: let viewController = BasicExampleViewController() let detailViewController = UINavigationController(rootViewController: viewController) splitViewController?.showDetailViewController(detailViewController, sender: self) case .advanced: let viewController = AdvancedExampleViewController() let detailViewController = UINavigationController(rootViewController: viewController) splitViewController?.showDetailViewController(detailViewController, sender: self) case .autocomplete: let viewController = AutocompleteExampleViewController() let detailViewController = UINavigationController(rootViewController: viewController) splitViewController?.showDetailViewController(detailViewController, sender: self) case .embedded: splitViewController?.showDetailViewController(MessageContainerController(), sender: self) case .customLayout: splitViewController?.showDetailViewController(CustomLayoutExampleViewController(), sender: self) case .customInputBar: let detailViewController = UINavigationController(rootViewController: CustomInputBarExampleViewController()) splitViewController?.showDetailViewController(detailViewController, sender: self) case .swiftUI: splitViewController?.showDetailViewController(UIHostingController(rootView: SwiftUIExampleView()), sender: self) case .subview: let viewController = MessageSubviewContainerViewController() let detailViewController = UINavigationController(rootViewController: viewController) splitViewController?.showDetailViewController(detailViewController, sender: self) case .settings: let viewController = SettingsViewController() let detailViewController = UINavigationController(rootViewController: viewController) splitViewController?.showDetailViewController(detailViewController, sender: self) case .sourceCode: openURL(URL(string: "https://github.com/MessageKit/MessageKit")!) case .contributors: openURL(URL(string: "https://github.com/MessageKit/MessageKit/graphs/contributors")!) } } func openURL(_ url: URL) { let webViewController = SFSafariViewController(url: url) webViewController.preferredControlTintColor = .primaryColor present(webViewController, animated: true) } // MARK: Private private enum Row { case basic, advanced, autocomplete, embedded, customLayout, subview, customInputBar, swiftUI case settings, sourceCode, contributors // MARK: Internal var title: String { switch self { case .basic: return "Basic Example" case .advanced: return "Advanced Example" case .autocomplete: return "Autocomplete Example" case .embedded: return "Embedded Example" case .customLayout: return "Custom Layout Example" case .subview: return "Subview Example" case .customInputBar: return "Custom InputBar Example" case .swiftUI: return "SwiftUI Example" case .settings: return "Settings" case .sourceCode: return "Source Code" case .contributors: return "Contributors" } } } private struct Section { let title: String let rows: [Row] } private let sections: [Section] = [ .init( title: "Examples", rows: [.basic, .advanced, .autocomplete, .embedded, .customLayout, .subview, .customInputBar, .swiftUI]), .init(title: "Support", rows: [.settings, .sourceCode, .contributors]), ] }