103 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Swift
		
	
	
	
		
		
			
		
	
	
			103 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Swift
		
	
	
	
|  | // | ||
|  | //  URLNavigator.swift | ||
|  | //  Crush | ||
|  | // | ||
|  | //  Created by Leon on 2025/7/13. | ||
|  | // | ||
|  | 
 | ||
|  | import Foundation | ||
|  | import UIKit | ||
|  | import URLMatcher | ||
|  | import URLNavigator | ||
|  | 
 | ||
|  | enum NavigationMap { | ||
|  |     static func initialize(navigator: NavigatorProtocol) { | ||
|  |         navigator.register("http://<path:_>", webViewControllerFactory) | ||
|  |         navigator.register("https://<path:_>", webViewControllerFactory) | ||
|  |          | ||
|  |         navigator.handle("\(AppConst.schemePrefix)alert", alert(navigator: navigator)) | ||
|  | 
 | ||
|  |         navigator.handle("\(AppConst.schemePrefix)aichat/<aiId>") { url, values, _ -> Bool in | ||
|  |             dlog("[Navigator] NavigationMap.\(url) \(#function):\(#line) - global fallback function is called") | ||
|  |             guard let userIdStr = values["aiId"] as? String, let userId = Int(userIdStr) else { | ||
|  |                 return false | ||
|  |             } | ||
|  | 
 | ||
|  | //            let tmpUrl = url.urlStringValue.replacingOccurrences(of: AppConst.schemePrefix, with: "https://") | ||
|  | //            if let url = URL(string: tmpUrl), let components = URLComponents(url: url, resolvingAgainstBaseURL: true) { | ||
|  | //                if let queryItems = components.queryItems { | ||
|  | //                    for item in queryItems { | ||
|  | //                        // print("\(item.name): \(String(describing: item.value))") | ||
|  | //                        if item.name == "productId", let idStr = item.value, let id = Int(idStr) { | ||
|  | //                            // .. | ||
|  | //                        } | ||
|  | //                    } | ||
|  | //                } | ||
|  | //            } | ||
|  |             if UserCore.shared.isLogin(){ | ||
|  |                 AppRouter.goChatVC(aiId: userId) | ||
|  |             }else{ | ||
|  |                 AppRouter.goAIRoleHome(aiId: userId) | ||
|  |             } | ||
|  | 
 | ||
|  |             // AppRouter.goPersonalPageController(userId: userId, productId: productId) | ||
|  |             return true | ||
|  |         } | ||
|  | 
 | ||
|  |         navigator.handle("\(AppConst.schemePrefix)route/<uri>") { (url, values: [String: Any], _) -> Bool in | ||
|  |             dlog("[Navigator] NavigationMap.\(url) \(#function):\(#line) - global fallback function is called") | ||
|  |             guard let uri = values["uri"] as? String else { | ||
|  |                 return false | ||
|  |             } | ||
|  |             if uri == "report" { | ||
|  |                 // ... | ||
|  |             } | ||
|  | 
 | ||
|  |             return true | ||
|  |         } | ||
|  |     } | ||
|  | 
 | ||
|  |     // MARK: -  helper | ||
|  | 
 | ||
|  |     func convertQueryParams(urlstr: URLConvertible) -> [URLQueryItem] { | ||
|  |         guard let urlPath = urlstr.urlStringValue as? String else { | ||
|  |             return [] | ||
|  |         } | ||
|  |         // var dict: Dictionary? | ||
|  |         var allkeysValues = [String: Any]() | ||
|  |         if let url = URL(string: urlPath), let components = URLComponents(url: url, resolvingAgainstBaseURL: true) { | ||
|  |             if let queryItems = components.queryItems { | ||
|  |                 return queryItems | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         return [] | ||
|  |     } | ||
|  | 
 | ||
|  |     // MARK: - factory | ||
|  | 
 | ||
|  |     private static func webViewControllerFactory( | ||
|  |         url: URLConvertible, | ||
|  |         values: [String: Any], | ||
|  |         context: Any? | ||
|  |     ) -> UIViewController? { | ||
|  |         guard let url = url.urlValue else { return nil } | ||
|  |         let h5 = H5Controller() | ||
|  |         h5.loadURL(url: url) | ||
|  |         return h5 | ||
|  |     } | ||
|  | 
 | ||
|  |     // MARK: - other | ||
|  | 
 | ||
|  |     private static func alert(navigator: NavigatorProtocol) -> URLOpenHandlerFactory { | ||
|  |         return { url, _, _ in | ||
|  |             guard let title = url.queryParameters["title"] else { return false } | ||
|  |             let message = url.queryParameters["message"] | ||
|  |             let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert) | ||
|  |             alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) | ||
|  |             navigator.present(alertController, wrap: nil, from: nil, animated: true, completion: nil) | ||
|  |             return true | ||
|  |         } | ||
|  |     } | ||
|  | } |