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