jsdw_ios/QuickLocation/Section/Group/InviteJoin/InviteJoinVC.swift

177 lines
5.5 KiB
Swift

//
// 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")
}
}