diff --git a/P2PShopping/P2PShopping.xcodeproj/project.xcworkspace/xcuserdata/georgesandu.xcuserdatad/UserInterfaceState.xcuserstate b/P2PShopping/P2PShopping.xcodeproj/project.xcworkspace/xcuserdata/georgesandu.xcuserdatad/UserInterfaceState.xcuserstate index a756c11..e098860 100644 Binary files a/P2PShopping/P2PShopping.xcodeproj/project.xcworkspace/xcuserdata/georgesandu.xcuserdatad/UserInterfaceState.xcuserstate and b/P2PShopping/P2PShopping.xcodeproj/project.xcworkspace/xcuserdata/georgesandu.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/P2PShopping/P2PShopping/Bridge/LocationBridgeHandler.swift b/P2PShopping/P2PShopping/Bridge/LocationBridgeHandler.swift new file mode 100644 index 0000000..60ce35a --- /dev/null +++ b/P2PShopping/P2PShopping/Bridge/LocationBridgeHandler.swift @@ -0,0 +1,34 @@ +import Foundation +import WebKit + +/// Issue #27 - [Bridge] Expose requestLocationPermission() to JS (iOS) +class LocationBridgeHandler: NSObject, WKScriptMessageHandler { + + private let permissionManager: LocationPermissionManager + + init(permissionManager: LocationPermissionManager) { + self.permissionManager = permissionManager + } + + /// Called when JS calls: window.webkit.messageHandlers.locationBridge.postMessage("requestLocationPermission") + func userContentController( + _ userContentController: WKUserContentController, + didReceive message: WKScriptMessage + ) { + guard message.name == "locationBridge", + let action = message.body as? String, + action == "requestLocationPermission" else { return } + + Task { @MainActor in + self.permissionManager.requestWhenInUsePermission() + + // Wait for the permission result then send it back to JS + try? await Task.sleep(nanoseconds: 1_000_000_000) + + let result = self.permissionManager.permissionGranted ? "Granted" : "Denied" + + let js = "window.onLocationPermissionResult('\(result)')" + message.webView?.evaluateJavaScript(js, completionHandler: nil) + } + } +} diff --git a/P2PShopping/P2PShopping/ContentView.swift b/P2PShopping/P2PShopping/ContentView.swift index 21cc622..342ce50 100644 --- a/P2PShopping/P2PShopping/ContentView.swift +++ b/P2PShopping/P2PShopping/ContentView.swift @@ -1,7 +1,7 @@ import SwiftUI struct ContentView: View { - @StateObject private var locationManager = LocationPermissionManager() + @EnvironmentObject private var locationManager: LocationPermissionManager var body: some View { VStack(spacing: 24) { diff --git a/P2PShopping/P2PShopping/P2PShoppingApp.swift b/P2PShopping/P2PShopping/P2PShoppingApp.swift index 1a6f9cd..0fd4895 100644 --- a/P2PShopping/P2PShopping/P2PShoppingApp.swift +++ b/P2PShopping/P2PShopping/P2PShoppingApp.swift @@ -6,12 +6,26 @@ // import SwiftUI +import WebKit @main struct P2PShoppingApp: App { + + @StateObject private var locationManager = LocationPermissionManager() + var body: some Scene { WindowGroup { ContentView() + .environmentObject(locationManager) + .onAppear { + setupBridge() + } } } + + private func setupBridge() { + let contentController = WKUserContentController() + let bridgeHandler = LocationBridgeHandler(permissionManager: locationManager) + contentController.add(bridgeHandler, name: "locationBridge") + } }