// // ViewModel.swift // BreastFeedingDemo // // Created by Jay Zhang on 2022/6/5. // import Foundation import Flutter class ViewModel { enum Posture: Int { case cradle = 0 case lying = 1 } /// 语言枚举,enum代表语言包文件名,rawValue代表语言选项 enum Language: String, CaseIterable { case english = "English" case french = "Français" case spanish = "Español" } var env: String = "testing" var apiKey: String = "DLAB-customername-12345687" var region: String = "apac" var language: Language = .english { didSet { setupText() } } var posture: Posture = .cradle var string: StringModel! var isFirstLoad: Bool = true var languagePack: [String: Any] { let languageFile = "\(language)".appending(".json") let path: String = Bundle.main.path(forResource: languageFile, ofType: nil)! let nsUrl = URL(fileURLWithPath: path) let nsData = try! Data(contentsOf: nsUrl) let json = try! JSONSerialization.jsonObject(with: nsData) as! [String: Any] return json } var flutterArguments: String { let arguments: [String: Any] = [ "lying": posture.rawValue, "languagePack": languagePack, "env": env, "apiKey": apiKey, "region": region, ] let data = try? JSONSerialization.data(withJSONObject: arguments, options: []) let str = String(data: data!, encoding: String.Encoding.utf8) return str! } var methodChannel: FlutterMethodChannel! var completeHandler: (()->())? var teachingEndHandler: (()->())? init() { language = .english setupText() methodChannel = setupFlutter() } func setupFlutter() -> FlutterMethodChannel { let flutterEngine = (UIApplication.shared.delegate as? AppDelegate)?.flutterEngine let methodChannel = FlutterMethodChannel(name: "com.wmdigit.breastcoachai.native", binaryMessenger: flutterEngine!.binaryMessenger) methodChannel.setMethodCallHandler { [weak self] (call: FlutterMethodCall, result: @escaping FlutterResult) in if let strongSelf = self { switch call.method { case "init": result(viewModel.flutterArguments) case "teachingEnd": strongSelf.methodChannel.invokeMethod("dispose", arguments: nil) // ["totalDuration": 3, "reasonText": Concern about my personal privacy, "status": incomplete, "incompleteReasonCode": 2] let argument: [String: Any] = try! JSONSerialization.jsonObject(with: (call.arguments as! String).data(using: .utf8)!) as! [String: Any] let status: String = argument["status"] as! String if status == "complete" { strongSelf.completeHandler?() return } strongSelf.teachingEndHandler?() default: // Unrecognized method name print("Unrecognized method name: \(call.method)") } } } return methodChannel } fileprivate func setupText() { let languageFile = "string_\(language)".appending(".json") let path: String = Bundle.main.path(forResource: languageFile, ofType: nil)! let nsUrl = URL(fileURLWithPath: path) let nsData = try! Data(contentsOf: nsUrl) let json = try! JSONSerialization.jsonObject(with: nsData) as! [String: Any] string = .init(fromDictionary: json) } }