// // InviteJoinVC.swift // QuickLocation // // Created by 八条 on 2026/6/1. // import UIKit import ObjectMapper import RxSwift import RxCocoa import Kingfisher import Photos class InviteJoinVC: BaseViewController { fileprivate var rootView: InviteJoinView! override func loadView() { rootView = InviteJoinView(frame: UIScreen.main.bounds) view = rootView } private let groupInModel: GroupInfoModel? override func viewDidLoad() { super.viewDidLoad() // 分享邀请卡片到微信 rootView.shareBtn.rx.tap.subscribe(onNext: { [weak self] in self?.shareInviteCard() }).disposed(by: disposeBag) // 下载图片到相册 rootView.downloadBtn.rx.tap.subscribe(onNext: { [weak self] in self?.downloadInviteCard() }).disposed(by: disposeBag) guard let model = groupInModel else { return } rootView.configure(model: model) requestOperateGroup(key: model.group_key) } // MARK: - Share / Download private func shareInviteCard() { guard let config = AppContextManager.shared.systemConfig, let shareConfig = config.shareConfig else { return } DLToast.showLoading() let fallbackImage = UIImage(named: "Common/logo108") let imageURL: URL? = { if shareConfig.image.isEmpty { return nil } return URL(string: shareConfig.image) }() let sendMessage: (UIImage?) -> Void = { [weak self] thumbImage in guard let self = self else { return } DLToast.dismiss() guard let screenshot = self.rootView.inviteCardView.takeScreenshot(), let imageData = screenshot.pngData() else { DLToast.showError(text: "分享失败") return } let message = WXMediaMessage() message.title = "邀请加入圈子" message.description = shareConfig.content if let thumb = thumbImage { message.setThumbImage(thumb) } let imageObject = WXImageObject() imageObject.imageData = imageData message.mediaObject = imageObject let req = SendMessageToWXReq() req.bText = false req.message = message req.scene = 0 WXApi.send(req) } if let url = imageURL { KingfisherManager.shared.retrieveImage(with: url) { result in switch result { case .success(let value): sendMessage(value.image) case .failure: sendMessage(fallbackImage) } } } else { sendMessage(fallbackImage) } } private func downloadInviteCard() { guard let screenshot = rootView.inviteCardView.takeScreenshot() else { DLToast.showError(text: "保存失败") return } let save = { [weak self] in guard let self = self else { return } UIImageWriteToSavedPhotosAlbum( screenshot, self, #selector(self.image(_:didFinishSavingWithError:contextInfo:)), nil ) } if #available(iOS 14, *) { PHPhotoLibrary.requestAuthorization(for: .addOnly) { status in DispatchQueue.main.async { if status == .authorized || status == .limited { save() } else { Permission.openAppSetting( title: "无法访问相册", message: "请在设置中允许访问相册以保存邀请图片" ) } } } } else { Permission.photosAuthorizationStatus { granted in if granted { save() } else { Permission.openAppSetting( title: "无法访问相册", message: "请在设置中允许访问相册以保存邀请图片" ) } } } } @objc private func image(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) { if error != nil { DLToast.showError(text: "保存失败") } else { DLToast.showSuccess(text: "已保存") } } // MARK: - API private func requestOperateGroup(key: String) { DLToast.showLoading() GroupService.operate(opType: "share", requestData: ["group_key": key]).subscribe(onNext: { [weak self] response in guard let self = self, let data = response.data, let code = data["share_code"] as? String else { return } self.rootView.inviteCodeLab.text = code self.rootView.qrCodeImgView.image = code.createQRCode(size: CGSize(width: 120, height: 120)) }, onError: { _ in DLToast.show(text: "获取错误,请重试") { AppRouter.shared.popOrDismiss() } }).disposed(by: disposeBag) } // MARK: - Init init(groupInfo: [String: Any]) { self.groupInModel = GroupInfoModel.init(JSON: groupInfo) super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } }