1 // Copyright 2015-present 650 Industries. All rights reserved. 2 3 import Foundation 4 5 @objc 6 public class EXDevLauncherErrorViewController: UIViewController, UITableViewDataSource { 7 internal weak var manager: EXDevLauncherErrorManager? 8 var error: EXDevLauncherAppError? 9 10 @IBOutlet weak var errorInformation: UILabel! 11 @IBOutlet weak var errorStack: UITableView! 12 reloadnull13 @IBAction func reload(_ sender: Any) { 14 guard let appUrl = manager?.controller?.appManifestURLWithFallback() else { 15 // We don't have app url. So we fallback to launcher. 16 // Shoudn't happen. 17 navigateToLauncher() 18 return 19 } 20 21 manager?.controller?.loadApp(appUrl, onSuccess: nil, onError: { [weak self] _ in 22 self?.navigateToLauncher() 23 }) 24 } 25 goToHomenull26 @IBAction func goToHome(_ sender: Any) { 27 navigateToLauncher() 28 } 29 viewDidLoadnull30 public override func viewDidLoad() { 31 error = manager?.consumeError() 32 33 errorInformation.text = error?.message ?? "Unknown error" 34 errorStack?.dataSource = self 35 } 36 tableViewnull37 public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 38 return error?.stack?.count ?? 0 39 } 40 tableViewnull41 public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 42 let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! EXDevLauncherStackTrace 43 let frame = error!.stack![indexPath.item] 44 cell.function.text = frame.methodName 45 cell.file.text = frame.file 46 return cell 47 } 48 49 @objc createnull50 public static func create(forManager manager: EXDevLauncherErrorManager) -> EXDevLauncherErrorViewController? { 51 guard let bundle = EXDevLauncherUtils.resourcesBundle() else { 52 return nil 53 } 54 55 let storyboard = UIStoryboard(name: "EXDevLauncherErrorView", bundle: bundle) 56 let vc = storyboard.instantiateViewController(withIdentifier: "EXDevLauncherErrorView") as? EXDevLauncherErrorViewController 57 58 vc?.manager = manager 59 return vc 60 } 61 navigateToLaunchernull62 private func navigateToLauncher() { 63 RCTExecuteOnMainQueue { [self] 64 self.manager?.controller?.navigateToLauncher() 65 } 66 } 67 } 68