ReaderHive/ReaderHive/Base/WebView/NRWebViewController+Script.swift
2025-12-17 18:04:38 +08:00

120 lines
3.8 KiB
Swift

//
// NRWebViewController+Script.swift
// ReaderHive
//
// Created by on 2025/12/4.
//
import UIKit
internal import WebKit
import PhotosUI
///APP
let kNRWebMessageAPP = "js2app"
///
let kNRWebMessageOpenFeedbackList = "openFeedbackList"
///
let kNRWebMessageOpenFeedbackDetail = "openFeedbackDetail"
///
let kNRWebMessageOpenPhotoPicker = "openPhotoPicker"
///
let kNRWebMessageAccountDeletionFinish = "accountLogout"
extension NRWebViewController {
func nr_webViewUserContentController(didReceive message: WKScriptMessage) {
let name = message.name
let body = message.body
switch name {
case kNRWebMessageOpenFeedbackList:
let vc = NRAppWebViewController()
vc.webUrl = kNRFeedBackListWebUrl
self.navigationController?.pushViewController(vc, animated: true)
case kNRWebMessageOpenFeedbackDetail:
guard let body = body as? [String : Any] else { return }
guard let id = body["id"] as? Int else { return }
let vc = NRAppWebViewController()
vc.id = "\(id)"
vc.webUrl = kNRFeedBackDetailWebUrl
self.navigationController?.pushViewController(vc, animated: true)
case kNRWebMessageOpenPhotoPicker:
openPhotoPicker()
// case kNRWebMessageAPP:
// guard let body = message.body as? [String : Any] else { return }
// guard let model = FAWebMessageModel.deserialize(from: body) else { return }
// let type = model.type
// let data = model.data
//
// if type == "login" {
//// let view = FALoginView()
//// view.present(in: nil)
//
// } else {
//
// guard let urlStr = data?.link else { return }
// guard let url = URL(string: urlStr) else { return }
// if UIApplication.shared.canOpenURL(url) {
// UIApplication.shared.open(url)
// }
// }
case kNRWebMessageAccountDeletionFinish:
self.navigationController?.popToRootViewController(animated: true)
NotificationCenter.default.post(name: NRLoginManager.loginStateDidChangeNotification, object: nil)
default:
break
}
}
///
private func openPhotoPicker() {
var config = PHPickerConfiguration()
config.selectionLimit = 1
config.filter = .images
let picker = PHPickerViewController(configuration: config)
picker.delegate = self
self.present(picker, animated: true)
}
}
extension NRWebViewController: PHPickerViewControllerDelegate {
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
picker.dismiss(animated: true)
guard let result = results.first else { return }
let provider = result.itemProvider
guard provider.canLoadObject(ofClass: UIImage.self) else { return }
provider.loadObject(ofClass: UIImage.self) { object, error in
guard let image = object as? UIImage else { return }
DispatchQueue.main.async { [weak self] in
guard let self = self else { return }
self.upload(image)
}
}
}
private func upload(_ image: UIImage) {
guard let imageData = image.jpegData(compressionQuality: 0.8) else { return }
let imageDataStr = imageData.base64EncodedString(options: .endLineWithCarriageReturn)
let js = "uploadConvertImage('\(imageDataStr)')"
self.webView.evaluateJavaScript(js)
}
}