feature/extend-tauri-generated-xcode-project-for-tvos-target
swift 78 lines 2.37 KB
Raw
1 import SwiftRs
2 import Tauri
3 import UIKit
4 import WebKit
5
6 class OpenArgs: Decodable {
7 let url: String
8 let title: String?
9 }
10
11 class IosWindow: Plugin {
12
13 // Keep track of the presented navigation controller
14 private static var presentedNavController: UINavigationController?
15
16 @objc public func open(_ invoke: Invoke) throws {
17 let args = try invoke.parseArgs(OpenArgs.self)
18
19 guard let viewController = manager.viewController else {
20 invoke.reject("Cannot get root view controller.")
21 return
22 }
23
24 // Resolve immediately before presenting
25 invoke.resolve()
26
27 // Present on main thread
28 DispatchQueue.main.async {
29 // Create the new view controller
30 let newVC = NewViewController()
31 newVC.url = args.url
32 newVC.windowTitle = args.title ?? "Sign in"
33
34 // Wrap in navigation controller for proper presentation
35 let navController = UINavigationController(rootViewController: newVC)
36
37 // Configure as popover on iPad, modal on iPhone
38 navController.modalPresentationStyle = .popover
39 navController.preferredContentSize = CGSize(width: 400, height: 600)
40
41 if let popover = navController.popoverPresentationController {
42 popover.sourceView = viewController.view
43 popover.sourceRect = CGRect(
44 x: viewController.view.bounds.midX,
45 y: viewController.view.bounds.midY,
46 width: 0,
47 height: 0
48 )
49 popover.permittedArrowDirections = [.up, .down]
50 }
51
52 // Present the popover
53 viewController.present(navController, animated: true)
54
55 // Store reference for programmatic dismissal
56 IosWindow.presentedNavController = navController
57 }
58 }
59
60 @objc public func close(_ invoke: Invoke) throws {
61 // Resolve immediately
62 invoke.resolve()
63
64 // Dismiss on main thread
65 DispatchQueue.main.async {
66 if let navController = IosWindow.presentedNavController {
67 navController.dismiss(animated: true) {
68 IosWindow.presentedNavController = nil
69 }
70 }
71 }
72 }
73 }
74
75 @_cdecl("init_plugin_ios_window")
76 func initPlugin() -> Plugin {
77 return IosWindow()
78 }