Commit 27ebf5e4 authored by Steven杜宇's avatar Steven杜宇

Merge branch 'dev_1013' of http://gitlab.galaxy-immi.com/mobile-group/galaxy-iOS into dev_1013

parents 7edbff6c e6c0d9f1
...@@ -1180,6 +1180,7 @@ ...@@ -1180,6 +1180,7 @@
047A96902D16AA410033BB4E /* YHGCIncomeRecordWorkExperienceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 047A968B2D16AA410033BB4E /* YHGCIncomeRecordWorkExperienceViewController.swift */; }; 047A96902D16AA410033BB4E /* YHGCIncomeRecordWorkExperienceViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 047A968B2D16AA410033BB4E /* YHGCIncomeRecordWorkExperienceViewController.swift */; };
047A96932D16C0900033BB4E /* YHInfoQuestionSelectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 047A96922D16C0900033BB4E /* YHInfoQuestionSelectionCell.swift */; }; 047A96932D16C0900033BB4E /* YHInfoQuestionSelectionCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 047A96922D16C0900033BB4E /* YHInfoQuestionSelectionCell.swift */; };
0487C1C72E8940D000CE6472 /* YHCustomSearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0487C1C62E8940D000CE6472 /* YHCustomSearchView.swift */; }; 0487C1C72E8940D000CE6472 /* YHCustomSearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0487C1C62E8940D000CE6472 /* YHCustomSearchView.swift */; };
0487C1D82E8B78B600CE6472 /* YHTXIMMessageHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0487C1D72E8B78B600CE6472 /* YHTXIMMessageHandler.swift */; };
048D6ADB2D5E00DE00BC6F4C /* YHMemberCenterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 048D6ADA2D5E00DE00BC6F4C /* YHMemberCenterViewController.swift */; }; 048D6ADB2D5E00DE00BC6F4C /* YHMemberCenterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 048D6ADA2D5E00DE00BC6F4C /* YHMemberCenterViewController.swift */; };
048D6ADD2D5EF0A900BC6F4C /* YHMemberCenterHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 048D6ADC2D5EF0A900BC6F4C /* YHMemberCenterHeaderView.swift */; }; 048D6ADD2D5EF0A900BC6F4C /* YHMemberCenterHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 048D6ADC2D5EF0A900BC6F4C /* YHMemberCenterHeaderView.swift */; };
048D6ADF2D5F0FBE00BC6F4C /* YHMemberCenterHeaderBannerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 048D6ADE2D5F0FBE00BC6F4C /* YHMemberCenterHeaderBannerCell.swift */; }; 048D6ADF2D5F0FBE00BC6F4C /* YHMemberCenterHeaderBannerCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 048D6ADE2D5F0FBE00BC6F4C /* YHMemberCenterHeaderBannerCell.swift */; };
...@@ -2550,6 +2551,7 @@ ...@@ -2550,6 +2551,7 @@
047A968B2D16AA410033BB4E /* YHGCIncomeRecordWorkExperienceViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHGCIncomeRecordWorkExperienceViewController.swift; sourceTree = "<group>"; }; 047A968B2D16AA410033BB4E /* YHGCIncomeRecordWorkExperienceViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHGCIncomeRecordWorkExperienceViewController.swift; sourceTree = "<group>"; };
047A96922D16C0900033BB4E /* YHInfoQuestionSelectionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHInfoQuestionSelectionCell.swift; sourceTree = "<group>"; }; 047A96922D16C0900033BB4E /* YHInfoQuestionSelectionCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHInfoQuestionSelectionCell.swift; sourceTree = "<group>"; };
0487C1C62E8940D000CE6472 /* YHCustomSearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHCustomSearchView.swift; sourceTree = "<group>"; }; 0487C1C62E8940D000CE6472 /* YHCustomSearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHCustomSearchView.swift; sourceTree = "<group>"; };
0487C1D72E8B78B600CE6472 /* YHTXIMMessageHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHTXIMMessageHandler.swift; sourceTree = "<group>"; };
048D6ADA2D5E00DE00BC6F4C /* YHMemberCenterViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMemberCenterViewController.swift; sourceTree = "<group>"; }; 048D6ADA2D5E00DE00BC6F4C /* YHMemberCenterViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMemberCenterViewController.swift; sourceTree = "<group>"; };
048D6ADC2D5EF0A900BC6F4C /* YHMemberCenterHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMemberCenterHeaderView.swift; sourceTree = "<group>"; }; 048D6ADC2D5EF0A900BC6F4C /* YHMemberCenterHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMemberCenterHeaderView.swift; sourceTree = "<group>"; };
048D6ADE2D5F0FBE00BC6F4C /* YHMemberCenterHeaderBannerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMemberCenterHeaderBannerCell.swift; sourceTree = "<group>"; }; 048D6ADE2D5F0FBE00BC6F4C /* YHMemberCenterHeaderBannerCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = YHMemberCenterHeaderBannerCell.swift; sourceTree = "<group>"; };
...@@ -3185,6 +3187,7 @@ ...@@ -3185,6 +3187,7 @@
045C0A612D12CA5E00BD2DC0 /* VM */, 045C0A612D12CA5E00BD2DC0 /* VM */,
045C0A622D12CA5E00BD2DC0 /* YHButlerMessageReportHandler.swift */, 045C0A622D12CA5E00BD2DC0 /* YHButlerMessageReportHandler.swift */,
045C0A632D12CA5E00BD2DC0 /* YHButlerServiceManager.swift */, 045C0A632D12CA5E00BD2DC0 /* YHButlerServiceManager.swift */,
0487C1D72E8B78B600CE6472 /* YHTXIMMessageHandler.swift */,
045C0A642D12CA5E00BD2DC0 /* YHButlerServiceMessageHandler.swift */, 045C0A642D12CA5E00BD2DC0 /* YHButlerServiceMessageHandler.swift */,
043F0EB02DE85717003354EB /* YHTencentDeskManager.swift */, 043F0EB02DE85717003354EB /* YHTencentDeskManager.swift */,
043F0EB12DE85717003354EB /* YHTUIMessageListManager.swift */, 043F0EB12DE85717003354EB /* YHTUIMessageListManager.swift */,
...@@ -8516,6 +8519,7 @@ ...@@ -8516,6 +8519,7 @@
045C12A42D12CA5F00BD2DC0 /* YHEducationInfoCell.swift in Sources */, 045C12A42D12CA5F00BD2DC0 /* YHEducationInfoCell.swift in Sources */,
045C12A52D12CA5F00BD2DC0 /* YHTravelHKDLGuideSheetView.swift in Sources */, 045C12A52D12CA5F00BD2DC0 /* YHTravelHKDLGuideSheetView.swift in Sources */,
045C12A62D12CA5F00BD2DC0 /* YHTravelDocsPreparationTipsCell.swift in Sources */, 045C12A62D12CA5F00BD2DC0 /* YHTravelDocsPreparationTipsCell.swift in Sources */,
0487C1D82E8B78B600CE6472 /* YHTXIMMessageHandler.swift in Sources */,
04AFEF592D6C8CE00007A011 /* YHVipLevelRightHeaderView.swift in Sources */, 04AFEF592D6C8CE00007A011 /* YHVipLevelRightHeaderView.swift in Sources */,
045C12A72D12CA5F00BD2DC0 /* YHMainInfoPreviewModel.swift in Sources */, 045C12A72D12CA5F00BD2DC0 /* YHMainInfoPreviewModel.swift in Sources */,
045C12A82D12CA5F00BD2DC0 /* YHActivityTravelitemView.swift in Sources */, 045C12A82D12CA5F00BD2DC0 /* YHActivityTravelitemView.swift in Sources */,
......
// YHIMMessageHandler.swift
import UIKit
import SafariServices
import TUIConversation
import TUIChat
import IQKeyboardManagerSwift
class YHIMMessageHandler: NSObject {
weak var viewController: UIViewController?
weak var navigationController: UINavigationController?
private lazy var previewFileTool: YHFilePreviewTool = {
guard let vc = viewController else { fatalError("ViewController不能为空") }
return YHFilePreviewTool(targetVC: vc)
}()
init(viewController: UIViewController,
navigationController: UINavigationController?) {
self.viewController = viewController
self.navigationController = navigationController
super.init()
}
}
// MARK: - TUIYHCustomCellClickDelegate
extension YHIMMessageHandler: TUIYHCustomCellClickDelegate {
func didTap(inFileCell cellData: TUIFileMessageCellData) {
var isExist: ObjCBool = false
let path = cellData.getFilePath(&isExist)
if isExist.boolValue {
let url = URL(fileURLWithPath: path)
previewFileTool.openXLSXFile(at: url, fileName: cellData.fileName)
} else {
cellData.downloadFile()
}
}
func didTapCustomOrderCell(_ cellData: TUIOrderCellData) {
let linkAddress = cellData.link ?? ""
// 处理普通URL
if linkAddress.count > 0,
linkAddress.isValidHttpUrl || linkAddress.isValidHttpsUrl || linkAddress.isValidFileUrl,
let url = URL(string: linkAddress) {
showSafari(url: url)
return
}
// 处理自定义消息
handleCustomMessage(linkAddress)
}
private func handleCustomMessage(_ content: String?) {
guard let dicData = content,
!dicData.isEmpty,
let data = dicData.data(using: .utf8),
let jsonObject = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
!jsonObject.isEmpty else {
printLog("消息解析失败")
return
}
let msgType = jsonObject["msg_type"] as? String ?? ""
let navH5Url = jsonObject["nav_h5_url"] as? String ?? ""
let orderID = jsonObject["order_id"] as? Int ?? -1
let type = jsonObject["type"] as? Int ?? -1
let batchId = jsonObject["batch_id"] as? Int ?? 0
if msgType == "card_msg", navH5Url.count > 0 {
let title = jsonObject["title"] as? String ?? ""
showH5Page(baseUrl: navH5Url, title: title)
} else if orderID > -1, type > -1 {
showOrderMessage(type: type, orderId: orderID, batchId: batchId)
}
}
}
// MARK: - 公开方法
extension YHIMMessageHandler {
/// 处理IM消息点击
/// - Parameter conversationData: 会话数据
@MainActor func handleIMMessageTap(conversationData: TUIConversationCellData) {
updateNavigateBarBeforeEnterChatVC()
let params: [String: Any] = [
TUICore_TUIChatObjectFactory_ChatViewController_Title: conversationData.title,
TUICore_TUIChatObjectFactory_ChatViewController_UserID: conversationData.userID,
TUICore_TUIChatObjectFactory_ChatViewController_GroupID: conversationData.groupID,
TUICore_TUIChatObjectFactory_ChatViewController_AvatarImage: conversationData.avatarImage,
TUICore_TUIChatObjectFactory_ChatViewController_AvatarUrl: conversationData.faceUrl,
TUICore_TUIChatObjectFactory_ChatViewController_ConversationID: conversationData.conversationID,
TUICore_TUIChatObjectFactory_ChatViewController_AtTipsStr: conversationData.atTipsStr,
TUICore_TUIChatObjectFactory_ChatViewController_AtMsgSeqs: conversationData.atMsgSeqs,
TUICore_TUIChatObjectFactory_ChatViewController_Draft: conversationData.draftText
]
pushToChatViewController(with: params)
}
/// 处理远程通知
/// - Parameter userInfo: 通知数据
@MainActor func handleRemoteNotification(_ userInfo: [AnyHashable: Any]) {
let extString = userInfo["ext"] as? String ?? "{}"
let extData = extString.data(using: .utf8) ?? Data()
let ext = (try? JSONSerialization.jsonObject(with: extData, options: [])) as? [String: Any] ?? [:]
let entity = ext["entity"] as? [String: Any] ?? [:]
let chatType = entity["chatType"] as? Int ?? 0
let senderID = entity["sender"] as? String ?? ""
let nickName = entity["nickname"] as? String ?? ""
let aps = userInfo["aps"] as? [String: Any] ?? [:]
let alert = aps["alert"] as? [String: Any] ?? [:]
let title = alert["title"] as? String ?? nickName
guard senderID.count > 0 else { return }
updateNavigateBarBeforeEnterChatVC()
var param: [String: Any] = [
TUICore_TUIChatObjectFactory_ChatViewController_Title: title,
TUICore_TUIChatObjectFactory_ChatViewController_AvatarUrl: "",
TUICore_TUIChatObjectFactory_ChatViewController_AtTipsStr: "",
TUICore_TUIChatObjectFactory_ChatViewController_AtMsgSeqs: [],
TUICore_TUIChatObjectFactory_ChatViewController_Draft: ""
]
if chatType == 2 { // 群聊
param[TUICore_TUIChatObjectFactory_ChatViewController_GroupID] = senderID
param[TUICore_TUIChatObjectFactory_ChatViewController_ConversationID] = "group_\(senderID)"
} else { // 单聊
param[TUICore_TUIChatObjectFactory_ChatViewController_UserID] = senderID
param[TUICore_TUIChatObjectFactory_ChatViewController_ConversationID] = "c2c_\(senderID)"
}
pushToChatViewController(with: param)
}
@MainActor func gotoChatVC(senderID: String, isGroupChat: Bool = false) {
guard senderID.count > 0 else { return }
updateNavigateBarBeforeEnterChatVC()
var param: [String: Any] = [
TUICore_TUIChatObjectFactory_ChatViewController_Title: "",
TUICore_TUIChatObjectFactory_ChatViewController_AvatarUrl: "",
TUICore_TUIChatObjectFactory_ChatViewController_AtTipsStr: "",
TUICore_TUIChatObjectFactory_ChatViewController_AtMsgSeqs: [],
TUICore_TUIChatObjectFactory_ChatViewController_Draft: ""
]
if isGroupChat { // 群聊
param[TUICore_TUIChatObjectFactory_ChatViewController_GroupID] = senderID
param[TUICore_TUIChatObjectFactory_ChatViewController_ConversationID] = "group_\(senderID)"
} else { // 单聊
param[TUICore_TUIChatObjectFactory_ChatViewController_UserID] = senderID
param[TUICore_TUIChatObjectFactory_ChatViewController_ConversationID] = "c2c_\(senderID)"
}
pushToChatViewController(with: param)
}
}
// MARK: - 私有方法
extension YHIMMessageHandler {
/// 跳转到聊天页面(统一方法)
private func pushToChatViewController(with params: [String: Any]) {
let vc = navigationController?.push(
TUICore_TUIChatObjectFactory_ChatViewController_Classic,
param: params,
forResult: nil
)
if let chatVC = vc as? TUIBaseChatViewController {
chatVC.navigationItem.rightBarButtonItem = nil
chatVC.navigationItem.rightBarButtonItems = nil
chatVC.yhCustomCellClickDelegate = self
}
}
/// 更新导航栏配置
@MainActor private func updateNavigateBarBeforeEnterChatVC() {
IQKeyboardManager.shared.isEnabled = false
navigationController?.gk_hideNavigationBar = false
navigationController?.isNavigationBarHidden = false
let appearance = UINavigationBarAppearance()
appearance.backgroundColor = .white
appearance.shadowImage = UIImage()
appearance.shadowColor = .clear
navigationController?.navigationBar.tintColor = .black
navigationController?.navigationBar.standardAppearance = appearance
navigationController?.navigationBar.scrollEdgeAppearance = appearance
}
/// 显示Safari浏览器
private func showSafari(url: URL) {
let safariVC = SFSafariViewController(url: url)
safariVC.dismissButtonStyle = .close
safariVC.modalPresentationStyle = .fullScreen
viewController?.present(safariVC, animated: true)
}
/// 显示H5页面(带Token)
private func showH5Page(baseUrl: String, title: String) {
var finalUrl = baseUrl
if YHLoginManager.shared.isLogin() {
let token = YHLoginManager.shared.h5Token
let separator = baseUrl.contains("?") ? "&" : "?"
finalUrl = baseUrl + separator + "param=" + token
}
let webVC = YHH5WebViewVC()
webVC.isFullScreenFlag = false
webVC.navTitle = title
webVC.url = finalUrl
navigationController?.pushViewController(webVC)
}
/// 显示订单消息页面
private func showOrderMessage(type: Int, orderId: Int, batchId: Int) {
YHServiceOrderListViewController.jumpToMessageController(
type: type,
orderId: orderId,
batchId
)
}
}
...@@ -20,6 +20,14 @@ class YHResourceViewController: YHBaseViewController { ...@@ -20,6 +20,14 @@ class YHResourceViewController: YHBaseViewController {
return viewModel return viewModel
}() }()
// 消息处理器
private lazy var messageHandler: YHIMMessageHandler = {
return YHIMMessageHandler(
viewController: self,
navigationController: navigationController
)
}()
// 筛选条件 // 筛选条件
var selectedCategories: [YHResourceCategory] = [] var selectedCategories: [YHResourceCategory] = []
...@@ -279,11 +287,6 @@ private extension YHResourceViewController { ...@@ -279,11 +287,6 @@ private extension YHResourceViewController {
} }
if !result.isEmpty { if !result.isEmpty {
// 计算每个模型的高度参数
for item in result {
item.calHeightParam()
}
self.viewModel.arrResourceData = result self.viewModel.arrResourceData = result
self.updateUI() self.updateUI()
} }
...@@ -469,8 +472,15 @@ private extension YHResourceViewController { ...@@ -469,8 +472,15 @@ private extension YHResourceViewController {
return return
} }
YHGrayCommonAlertView.show("需联系银河管家进行发布信息", "联系银河管家发布企业服务与企业需求,快来与我们联系吧~", "返回", "前往联系", fullGuestureEnable: false) { [weak self] in
guard let self = self else {
return
}
self.messageHandler.gotoChatVC(senderID: "")
} callBack: {
// //
} }
}
func selectFilterType(_ type: YHResourceFilterType) { func selectFilterType(_ type: YHResourceFilterType) {
// 重置所有按钮状态 // 重置所有按钮状态
......
...@@ -14,6 +14,8 @@ class YHResourceListModel: SmartCodable { ...@@ -14,6 +14,8 @@ class YHResourceListModel: SmartCodable {
required init() {} required init() {}
var needNewLine: Bool?
// MARK: - 基本信息 // MARK: - 基本信息
var id: String = "" var id: String = ""
var title: String = "" var title: String = ""
...@@ -162,54 +164,20 @@ class YHResourceListModel: SmartCodable { ...@@ -162,54 +164,20 @@ class YHResourceListModel: SmartCodable {
} }
// MARK: - 计算Cell高度方法 // MARK: - 计算Cell高度方法
func calHeightParam() { func didFinishMapping() {
let screenWidth = KScreenWidth if needNewLine == nil {
let cellWidth = (screenWidth - 47) / 2 needNewLine = calculateNeedNewLine()
}
var totalHeight: CGFloat = 60 + 20 + 44 // 基础高度
}
// 标题高度
if !title.isEmpty { func calculateNeedNewLine() -> Bool {
let titleFont = UIFont.PFSC_M(ofSize: 16) ?? UIFont.systemFont(ofSize: 16) let company = company_name.count > 0 ? company_name : "-"
let maxSize = CGSize(width: cellWidth - 24, height: CGFloat.greatestFiniteMagnitude) let categoryName = category_name.count > 0 ? category_name : "-"
let titleRect = title.boundingRect(
with: maxSize, let companyWidth = YHResourceTableViewCell.getLabelWidth(company)
options: [.usesLineFragmentOrigin, .usesFontLeading], let categoryNameWidth = YHResourceTableViewCell.getLabelWidth(categoryName)
attributes: [.font: titleFont], return companyWidth + categoryNameWidth >= KScreenWidth - YHResourceTableViewCell.logoWidth - YHResourceTableViewCell.logoToRight - YHResourceTableViewCell.arrowWidth - 2 * YHResourceTableViewCell.marginX - YHResourceTableViewCell.widthVLine - YHResourceTableViewCell.marginBetweenVLine * 2
context: nil
)
totalHeight += ceil(titleRect.height) + 8
}
// 内容高度
if !content.isEmpty {
let contentFont = UIFont.PFSC_R(ofSize: 13) ?? UIFont.systemFont(ofSize: 13)
let maxSize = CGSize(width: cellWidth - 24, height: CGFloat.greatestFiniteMagnitude)
let textRect = content.boundingRect(
with: maxSize,
options: [.usesLineFragmentOrigin, .usesFontLeading],
attributes: [.font: contentFont],
context: nil
)
totalHeight += min(ceil(textRect.height), 40) + 8 // 限制最大高度为2行
}
// 图片高度
if !images.isEmpty {
let imageHeight: CGFloat = 100
totalHeight += imageHeight + 8
}
// 标签高度
if !tags.isEmpty {
totalHeight += 20 + 8
}
// 底部信息高度
totalHeight += 30
self.cell_width = cellWidth
self.cell_height = max(totalHeight, 160) // 最小高度160
} }
// MARK: - 便利方法 // MARK: - 便利方法
......
...@@ -267,10 +267,10 @@ extension YHResourceCategoryView: UICollectionViewDataSource, UICollectionViewDe ...@@ -267,10 +267,10 @@ extension YHResourceCategoryView: UICollectionViewDataSource, UICollectionViewDe
selectedCategories.append(category) selectedCategories.append(category)
} }
// 如果没有选中任何分类,自动选中"全部行业" // // 如果没有选中任何分类,自动选中"全部行业"
if selectedCategories.isEmpty { // if selectedCategories.isEmpty {
selectedCategories.append(categories.first!) // selectedCategories.append(categories.first!)
} // }
} }
collectionView.reloadData() collectionView.reloadData()
......
...@@ -12,13 +12,13 @@ import Kingfisher ...@@ -12,13 +12,13 @@ import Kingfisher
class YHResourceTableViewCell: UITableViewCell { class YHResourceTableViewCell: UITableViewCell {
static let labelFont = UIFont.PFSC_R(ofSize: 14) static let labelFont = UIFont.PFSC_R(ofSize: 14)
static let labelHeight: CGFloat = 20.0 static let labelHeight: CGFloat = 20.0
private let marginX: CGFloat = 20.0 static let marginX: CGFloat = 20.0
private let logoWidth: CGFloat = 60.0 static let logoWidth: CGFloat = 60.0
private let logoToRight: CGFloat = 10.0 static let logoToRight: CGFloat = 10.0
private let marginBetweenVLine: CGFloat = 6.0 static let marginBetweenVLine: CGFloat = 6.0
private let widthVLine: CGFloat = 1 static let widthVLine: CGFloat = 1
private let arrowWidth: CGFloat = 24 static let arrowWidth: CGFloat = 24
private let arrowToLeft: CGFloat = 24 static let arrowToLeft: CGFloat = 24
static let cellReuseIdentifier = "YHResourceTableViewCell" static let cellReuseIdentifier = "YHResourceTableViewCell"
...@@ -106,9 +106,9 @@ class YHResourceTableViewCell: UITableViewCell { ...@@ -106,9 +106,9 @@ class YHResourceTableViewCell: UITableViewCell {
} }
// MARK: - 私有方法 // MARK: - 私有方法
private extension YHResourceTableViewCell { extension YHResourceTableViewCell {
func setupUI() { private func setupUI() {
backgroundColor = .white backgroundColor = .white
selectionStyle = .none selectionStyle = .none
...@@ -124,17 +124,17 @@ private extension YHResourceTableViewCell { ...@@ -124,17 +124,17 @@ private extension YHResourceTableViewCell {
setupConstraints() setupConstraints()
} }
func setupConstraints() { private func setupConstraints() {
// LOGO约束 // LOGO约束
logoImageView.snp.makeConstraints { make in logoImageView.snp.makeConstraints { make in
make.left.equalToSuperview().offset(marginX) make.left.equalToSuperview().offset(YHResourceTableViewCell.marginX)
make.top.equalToSuperview().offset(24) make.top.equalToSuperview().offset(24)
make.width.height.equalTo(logoWidth) make.width.height.equalTo(YHResourceTableViewCell.logoWidth)
} }
// 右上角标签约束 // 右上角标签约束
typeTagIcon.snp.makeConstraints { make in typeTagIcon.snp.makeConstraints { make in
make.left.equalTo(logoImageView.snp.right).offset(logoToRight) make.left.equalTo(logoImageView.snp.right).offset(YHResourceTableViewCell.logoToRight)
make.top.equalTo(logoImageView) make.top.equalTo(logoImageView)
make.height.equalTo(16) make.height.equalTo(16)
make.width.equalTo(52) make.width.equalTo(52)
...@@ -142,14 +142,14 @@ private extension YHResourceTableViewCell { ...@@ -142,14 +142,14 @@ private extension YHResourceTableViewCell {
// 主标题约束 // 主标题约束
titleLabel.snp.makeConstraints { make in titleLabel.snp.makeConstraints { make in
make.left.equalTo(logoImageView.snp.right).offset(logoToRight) make.left.equalTo(logoImageView.snp.right).offset(YHResourceTableViewCell.logoToRight)
make.right.equalTo(rightArrow.snp.left) make.right.equalTo(rightArrow.snp.left)
make.top.equalTo(typeTagIcon.snp.bottom).offset(4) make.top.equalTo(typeTagIcon.snp.bottom).offset(4)
} }
rightArrow.snp.makeConstraints { make in rightArrow.snp.makeConstraints { make in
make.right.equalToSuperview().offset(-marginX) make.right.equalToSuperview().offset(-YHResourceTableViewCell.marginX)
make.width.height.equalTo(arrowWidth) make.width.height.equalTo(YHResourceTableViewCell.arrowWidth)
make.top.equalTo(titleLabel) make.top.equalTo(titleLabel)
} }
...@@ -160,7 +160,7 @@ private extension YHResourceTableViewCell { ...@@ -160,7 +160,7 @@ private extension YHResourceTableViewCell {
} }
vSeparatorLine.snp.makeConstraints { make in vSeparatorLine.snp.makeConstraints { make in
make.left.equalTo(companyLabel.snp.right).offset(marginBetweenVLine) make.left.equalTo(companyLabel.snp.right).offset(YHResourceTableViewCell.marginBetweenVLine)
make.centerY.equalTo(companyLabel) make.centerY.equalTo(companyLabel)
make.width.equalTo(1) make.width.equalTo(1)
make.height.equalTo(8) make.height.equalTo(8)
...@@ -168,7 +168,7 @@ private extension YHResourceTableViewCell { ...@@ -168,7 +168,7 @@ private extension YHResourceTableViewCell {
// 行业标签约束 // 行业标签约束
industryLabel.snp.makeConstraints { make in industryLabel.snp.makeConstraints { make in
make.left.equalTo(vSeparatorLine.snp.right).offset(marginBetweenVLine) make.left.equalTo(vSeparatorLine.snp.right).offset(YHResourceTableViewCell.marginBetweenVLine)
make.right.lessThanOrEqualTo(rightArrow.snp.left) make.right.lessThanOrEqualTo(rightArrow.snp.left)
make.top.equalTo(companyLabel) make.top.equalTo(companyLabel)
make.bottom.equalToSuperview().offset(-32) make.bottom.equalToSuperview().offset(-32)
...@@ -182,13 +182,13 @@ private extension YHResourceTableViewCell { ...@@ -182,13 +182,13 @@ private extension YHResourceTableViewCell {
} }
} }
private func getLabelWidth(_ text: String) -> CGFloat { static func getLabelWidth(_ text: String) -> CGFloat {
let attrString = NSAttributedString(string: text, attributes: [.font: YHResourceTableViewCell.labelFont]) let attrString = NSAttributedString(string: text, attributes: [.font: YHResourceTableViewCell.labelFont])
let width = attrString.yh_width(containerHeight: YHResourceTableViewCell.labelHeight) let width = attrString.yh_width(containerHeight: YHResourceTableViewCell.labelHeight)
return width return width
} }
func updateUI() { private func updateUI() {
guard let model = resourceModel else { return } guard let model = resourceModel else { return }
// 设置基本信息 // 设置基本信息
...@@ -198,16 +198,22 @@ private extension YHResourceTableViewCell { ...@@ -198,16 +198,22 @@ private extension YHResourceTableViewCell {
titleLabel.text = title titleLabel.text = title
companyLabel.text = company companyLabel.text = company
industryLabel.text = categoryName industryLabel.text = categoryName
let companyWidth = getLabelWidth(company) var needNext = false
let categoryNameWidth = getLabelWidth(categoryName) if let needNewLine = model.needNewLine {
if companyWidth + categoryNameWidth < KScreenWidth - logoWidth - logoToRight - arrowWidth - 2 * marginX - widthVLine - marginBetweenVLine * 2 { needNext = needNewLine
} else {
let needNewLine = model.calculateNeedNewLine()
model.needNewLine = needNewLine
needNext = needNewLine
}
if !needNext {
companyLabel.snp.remakeConstraints { make in companyLabel.snp.remakeConstraints { make in
make.left.equalTo(titleLabel) make.left.equalTo(titleLabel)
make.top.equalTo(titleLabel.snp.bottom).offset(4) make.top.equalTo(titleLabel.snp.bottom).offset(4)
} }
vSeparatorLine.snp.remakeConstraints { make in vSeparatorLine.snp.remakeConstraints { make in
make.left.equalTo(companyLabel.snp.right).offset(marginBetweenVLine) make.left.equalTo(companyLabel.snp.right).offset(YHResourceTableViewCell.marginBetweenVLine)
make.centerY.equalTo(companyLabel) make.centerY.equalTo(companyLabel)
make.width.equalTo(1) make.width.equalTo(1)
make.height.equalTo(8) make.height.equalTo(8)
...@@ -215,7 +221,7 @@ private extension YHResourceTableViewCell { ...@@ -215,7 +221,7 @@ private extension YHResourceTableViewCell {
// 行业标签约束 // 行业标签约束
industryLabel.snp.remakeConstraints { make in industryLabel.snp.remakeConstraints { make in
make.left.equalTo(vSeparatorLine.snp.right).offset(marginBetweenVLine) make.left.equalTo(vSeparatorLine.snp.right).offset(YHResourceTableViewCell.marginBetweenVLine)
make.right.lessThanOrEqualTo(rightArrow.snp.left) make.right.lessThanOrEqualTo(rightArrow.snp.left)
make.top.equalTo(companyLabel) make.top.equalTo(companyLabel)
make.bottom.equalToSuperview().offset(-32) make.bottom.equalToSuperview().offset(-32)
...@@ -236,7 +242,7 @@ private extension YHResourceTableViewCell { ...@@ -236,7 +242,7 @@ private extension YHResourceTableViewCell {
// 行业标签约束 // 行业标签约束
industryLabel.snp.remakeConstraints { make in industryLabel.snp.remakeConstraints { make in
make.left.equalTo(vSeparatorLine.snp.right).offset(marginBetweenVLine) make.left.equalTo(vSeparatorLine.snp.right).offset(YHResourceTableViewCell.marginBetweenVLine)
make.right.lessThanOrEqualTo(rightArrow.snp.left) make.right.lessThanOrEqualTo(rightArrow.snp.left)
make.top.equalTo(companyLabel.snp.bottom).offset(4) make.top.equalTo(companyLabel.snp.bottom).offset(4)
make.bottom.equalToSuperview().offset(-32) make.bottom.equalToSuperview().offset(-32)
......
...@@ -72,9 +72,6 @@ class YHResourceViewModel: NSObject { ...@@ -72,9 +72,6 @@ class YHResourceViewModel: NSObject {
self.arrResourceData?.append(contentsOf: mockData) self.arrResourceData?.append(contentsOf: mockData)
} }
// 计算每个模型的高度参数
self.arrResourceData?.forEach { $0.calHeightParam() }
self.currentPage += 1 self.currentPage += 1
self.hasMoreForResource = self.currentPage <= 5 // 模拟5页数据 self.hasMoreForResource = self.currentPage <= 5 // 模拟5页数据
......
...@@ -29,9 +29,12 @@ class YHMessageListVC: YHBaseViewController { ...@@ -29,9 +29,12 @@ class YHMessageListVC: YHBaseViewController {
var isNotifyEnabled = false var isNotifyEnabled = false
private lazy var previewFileTool: YHFilePreviewTool = { // 消息处理器
let tool = YHFilePreviewTool(targetVC: self) private lazy var messageHandler: YHIMMessageHandler = {
return tool return YHIMMessageHandler(
viewController: self,
navigationController: navigationController
)
}() }()
lazy var tableView: UITableView = { lazy var tableView: UITableView = {
...@@ -465,46 +468,7 @@ extension YHMessageListVC { ...@@ -465,46 +468,7 @@ extension YHMessageListVC {
} }
func handleRemoteNotification(_ userInfo: [AnyHashable: Any]) { func handleRemoteNotification(_ userInfo: [AnyHashable: Any]) {
let extString = userInfo["ext"] as? String ?? "{}" messageHandler.handleRemoteNotification(userInfo)
let extData = extString.data(using: .utf8) ?? Data()
let ext = (try? JSONSerialization.jsonObject(with: extData, options: [])) as? [String: Any] ?? [:]
let entity = ext["entity"] as? [String: Any] ?? [:]
let chatType = entity["chatType"] as? Int ?? 0 // 1: 单聊, 2: 群聊
let senderID = entity["sender"] as? String ?? ""
let nickName = entity["nickname"] as? String ?? ""
let aps = userInfo["aps"] as? [String: Any] ?? [:]
let alert = aps["alert"] as? [String: Any] ?? [:]
let title = alert["title"] as? String ?? nickName // 备用昵称
guard senderID.count > 0 else {
return
}
updateNavigateBarBeforeEnterChatVC()
var param: [String: Any] = [
TUICore_TUIChatObjectFactory_ChatViewController_Title: title,
TUICore_TUIChatObjectFactory_ChatViewController_AvatarUrl: "", // 通知无头像 URL
TUICore_TUIChatObjectFactory_ChatViewController_AtTipsStr: "",
TUICore_TUIChatObjectFactory_ChatViewController_AtMsgSeqs: [],
TUICore_TUIChatObjectFactory_ChatViewController_Draft: ""
]
// 5. 区分单聊/群聊
if chatType == 2 { // 群聊
param[TUICore_TUIChatObjectFactory_ChatViewController_GroupID] = senderID
param[TUICore_TUIChatObjectFactory_ChatViewController_ConversationID] = "group_\(senderID)"
} else { // 单聊
param[TUICore_TUIChatObjectFactory_ChatViewController_UserID] = senderID
param[TUICore_TUIChatObjectFactory_ChatViewController_ConversationID] = "c2c_\(senderID)"
}
// 3. 跳转
let vc = navigationController?.push(TUICore_TUIChatObjectFactory_ChatViewController_Classic, param: param, forResult: nil)
if let vc = vc as? TUIBaseChatViewController {
vc.navigationItem.rightBarButtonItem = nil
vc.navigationItem.rightBarButtonItems = nil
vc.yhCustomCellClickDelegate = self
}
} }
private func updateNavigateBarBeforeEnterChatVC() { private func updateNavigateBarBeforeEnterChatVC() {
...@@ -566,29 +530,12 @@ extension YHMessageListVC: UITableViewDelegate, UITableViewDataSource { ...@@ -566,29 +530,12 @@ extension YHMessageListVC: UITableViewDelegate, UITableViewDataSource {
} }
return return
} else if msgItem.type == YHMessageType.txIM.rawValue { } else if msgItem.type == YHMessageType.txIM.rawValue {
let item = msgArr[indexPath.row] guard let data = messageListManager.getMessageList()
guard let data = messageListManager.getMessageList().first(where: { $0.conversationID == item.conversationID }) else { .first(where: { $0.conversationID == msgItem.conversationID }) else {
return return
} }
updateNavigateBarBeforeEnterChatVC()
let param: [String: Any] = [
TUICore_TUIChatObjectFactory_ChatViewController_Title: data.title,
TUICore_TUIChatObjectFactory_ChatViewController_UserID: data.userID,
TUICore_TUIChatObjectFactory_ChatViewController_GroupID: data.groupID,
TUICore_TUIChatObjectFactory_ChatViewController_AvatarImage: data.avatarImage,
TUICore_TUIChatObjectFactory_ChatViewController_AvatarUrl: data.faceUrl,
TUICore_TUIChatObjectFactory_ChatViewController_ConversationID: data.conversationID,
TUICore_TUIChatObjectFactory_ChatViewController_AtTipsStr: data.atTipsStr,
TUICore_TUIChatObjectFactory_ChatViewController_AtMsgSeqs: data.atMsgSeqs,
TUICore_TUIChatObjectFactory_ChatViewController_Draft: data.draftText
]
let vc = navigationController?.push(TUICore_TUIChatObjectFactory_ChatViewController_Classic, param: param, forResult: nil)
if let vc = vc as? TUIBaseChatViewController {
vc.navigationItem.rightBarButtonItem = nil
vc.navigationItem.rightBarButtonItems = nil
vc.yhCustomCellClickDelegate = self
} messageHandler.handleIMMessageTap(conversationData: data)
return return
} }
...@@ -722,77 +669,3 @@ extension YHMessageListVC: YHMessageListDelegate { ...@@ -722,77 +669,3 @@ extension YHMessageListVC: YHMessageListDelegate {
} }
} }
extension YHMessageListVC: TUIYHCustomCellClickDelegate {
func didTap(inFileCell cellData: TUIFileMessageCellData) {
var isExist: ObjCBool = false
let path = cellData.getFilePath(&isExist)
if isExist.boolValue {
let url = URL(fileURLWithPath: path)
previewFileTool.openXLSXFile(at: url, fileName: cellData.fileName)
} else {
cellData.downloadFile()
}
}
func didTapCustomOrderCell(_ cellData: TUIOrderCellData) {
let linkAddress = cellData.link ?? ""
guard linkAddress.count > 0, linkAddress.isValidHttpUrl || linkAddress.isValidHttpsUrl || linkAddress.isValidFileUrl, let url = URL(string: linkAddress) else {
handelMessageType(linkAddress)
return
}
let safariViewController = SFSafariViewController(url: url)
safariViewController.dismissButtonStyle = .close
safariViewController.modalPresentationStyle = .fullScreen
UIViewController.current?.present(safariViewController, animated: true, completion: nil)
}
private func handelMessageType(_ content: String?) {
if let dicData = content, dicData.count > 0, let data = dicData.data(using: .utf8) {
do {
if let jsonObject = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
// 转换成功,jsonObject 是一个字典
printLog("JSON字符串转换为字典成功: \(jsonObject)")
/*
"{\"order_id\":151824,\"type\":27}"
*/
if !jsonObject.isEmpty {
let msgType: String = jsonObject["msg_type"] as? String ?? ""
let navH5Url: String = jsonObject["nav_h5_url"] as? String ?? ""
let orderID: Int = jsonObject["order_id"] as? Int ?? -1
let type: Int = jsonObject["type"] as? Int ?? -1
let batchId: Int = jsonObject["batch_id"] as? Int ?? 0
if msgType == "card_msg", navH5Url.count > 0 {
let title = jsonObject["title"] as? String ?? ""
var url = ""
if YHLoginManager.shared.isLogin() {
let token = YHLoginManager.shared.h5Token
if navH5Url.contains("?") {
url = navH5Url + "&param=" + token
} else {
url = navH5Url + "?param=" + token
}
} else {
url = navH5Url
}
let vc = YHH5WebViewVC()
vc.isFullScreenFlag = false
vc.navTitle = title
vc.url = url
UIViewController.current?.navigationController?.pushViewController(vc)
} else if orderID > -1, type > -1 {
YHServiceOrderListViewController.jumpToMessageController(type: type, orderId: orderID, batchId)
}
} else {
printLog("ddddd")
}
} else {
printLog("JSON字符串不是有效的字典格式")
}
} catch {
printLog("JSON解析错误: \(error)")
}
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment