226 lines
6.6 KiB
Swift
226 lines
6.6 KiB
Swift
//
|
||
// ChatListCell.swift
|
||
// yinmeng-ios
|
||
//
|
||
// Created by MaiMang on 2024/2/29.
|
||
//
|
||
|
||
import UIKit
|
||
import Reusable
|
||
import NIMSDK
|
||
import Kingfisher
|
||
|
||
func showTime(msglastTime: TimeInterval, showDetail: Bool) -> String {
|
||
// 今天的时间
|
||
let nowDate = Date()
|
||
let msgDate = Date(timeIntervalSince1970: msglastTime)
|
||
var result: String?
|
||
let components: Set<Calendar.Component> = [.year, .month, .day, .weekday, .hour, .minute]
|
||
let calendar = Calendar.current
|
||
let nowDateComponents = calendar.dateComponents(components, from: nowDate)
|
||
let msgDateComponents = calendar.dateComponents(components, from: msgDate)
|
||
|
||
var hour = msgDateComponents.hour ?? 0
|
||
let oneDayTimeIntervalValue: TimeInterval = 24 * 60 * 60 // 一天的秒数
|
||
|
||
result = getPeriodOfTime(hour: hour, minute: msgDateComponents.minute ?? 0)
|
||
if hour > 12 {
|
||
hour -= 12
|
||
}
|
||
|
||
let isSameMonth = (nowDateComponents.year == msgDateComponents.year) && (nowDateComponents.month == msgDateComponents.month)
|
||
|
||
if isSameMonth && (nowDateComponents.day == msgDateComponents.day) { // 同一天,显示时间
|
||
result = "\(result ?? "") \(hour):\(String(format: "%02d", msgDateComponents.minute ?? 0))"
|
||
} else if isSameMonth && (nowDateComponents.day == (msgDateComponents.day! + 1)) { // 昨天
|
||
result = showDetail ? "昨天\(result ?? "") \(hour):\(String(format: "%02d", msgDateComponents.minute ?? 0))" : "昨天"
|
||
} else if isSameMonth && (nowDateComponents.day == (msgDateComponents.day! + 2)) { // 前天
|
||
result = showDetail ? "前天\(result ?? "") \(hour):\(String(format: "%02d", msgDateComponents.minute ?? 0))" : "前天"
|
||
} else if nowDate.timeIntervalSince(msgDate) < 7 * oneDayTimeIntervalValue { // 一周内
|
||
let weekDay = weekdayStr(msgDateComponents.weekday ?? 1)
|
||
result = showDetail ? "\(weekDay)\(result ?? "") \(hour):\(String(format: "%02d", msgDateComponents.minute ?? 0))" : weekDay
|
||
} else { // 显示日期
|
||
let day = "\(msgDateComponents.year ?? 0)-\(msgDateComponents.month ?? 0)-\(msgDateComponents.day ?? 0)"
|
||
result = showDetail ? "\(day)\(result ?? "") \(hour):\(String(format: "%02d", msgDateComponents.minute ?? 0))" : day
|
||
}
|
||
|
||
return result ?? ""
|
||
}
|
||
|
||
func getPeriodOfTime(hour: Int, minute: Int) -> String {
|
||
var periodOfTime = ""
|
||
|
||
if hour >= 0 && hour < 6 {
|
||
periodOfTime = "凌晨"
|
||
} else if hour >= 6 && hour < 12 {
|
||
periodOfTime = "上午"
|
||
} else if hour == 12 {
|
||
periodOfTime = "中午"
|
||
} else if hour > 12 && hour < 18 {
|
||
periodOfTime = "下午"
|
||
} else if hour >= 18 && hour <= 23 {
|
||
periodOfTime = "晚上"
|
||
}
|
||
|
||
return periodOfTime
|
||
}
|
||
|
||
func weekdayStr(_ weekday: Int) -> String {
|
||
switch weekday {
|
||
case 1:
|
||
return "星期日"
|
||
case 2:
|
||
return "星期一"
|
||
case 3:
|
||
return "星期二"
|
||
case 4:
|
||
return "星期三"
|
||
case 5:
|
||
return "星期四"
|
||
case 6:
|
||
return "星期五"
|
||
case 7:
|
||
return "星期六"
|
||
default:
|
||
return ""
|
||
}
|
||
}
|
||
|
||
|
||
class ChatListCell: UITableViewCell, Reusable {
|
||
|
||
var rescent:NIMRecentSession? {
|
||
didSet {
|
||
if let sessionId = rescent?.session?.sessionId {
|
||
NIMSDK.shared().userManager.fetchUserInfos([sessionId]) { users, error in
|
||
if error == nil {
|
||
let user = users?[safe:0]
|
||
if let url = user?.userInfo?.avatarUrl {
|
||
self.avatarImgView.kf.setImage(with: URL(string: url),
|
||
placeholder: UIImage(named: "public_avatar"))
|
||
}
|
||
|
||
self.nameLb.text = user?.userInfo?.nickName
|
||
}
|
||
}
|
||
|
||
textLb.text = rescent?.lastMessage?.text ?? "消息"
|
||
if let count = rescent?.unreadCount, count > 0 {
|
||
badgeLb.text = "\(count)"
|
||
badgeLb.isHidden = false
|
||
} else {
|
||
badgeLb.isHidden = true
|
||
}
|
||
if let message = rescent?.lastMessage {
|
||
self.dateLb.isHidden = false
|
||
self.dateLb.text = showTime(msglastTime: rescent?.lastMessage?.timestamp ?? 0, showDetail: false)
|
||
} else {
|
||
self.dateLb.isHidden = true
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
|
||
super.init(style: style, reuseIdentifier: reuseIdentifier)
|
||
selectionStyle = .none
|
||
backgroundColor = .clear
|
||
contentView.addSubview(backView)
|
||
backView.addSubview(avatarImgView)
|
||
backView.addSubview(textLb)
|
||
backView.addSubview(nameLb)
|
||
backView.addSubview(dateLb)
|
||
backView.addSubview(badgeLb)
|
||
|
||
backView.snp.makeConstraints { make in
|
||
make.left.right.equalToSuperview().inset(16)
|
||
make.top.equalToSuperview().offset(10)
|
||
make.bottom.equalToSuperview()
|
||
}
|
||
|
||
avatarImgView.snp.makeConstraints { make in
|
||
make.size.equalTo(CGSize(width: 60, height: 60))
|
||
make.centerY.equalToSuperview()
|
||
make.left.equalToSuperview().offset(8)
|
||
}
|
||
|
||
nameLb.snp.makeConstraints { make in
|
||
make.left.equalTo(avatarImgView.snp.right).offset(12)
|
||
make.bottom.equalTo(avatarImgView.snp.centerY).offset(-4)
|
||
make.right.lessThanOrEqualTo(backView).offset(-20)
|
||
}
|
||
|
||
textLb.snp.makeConstraints { make in
|
||
make.left.equalTo(nameLb)
|
||
make.top.equalTo(avatarImgView.snp.centerY).offset(4)
|
||
make.right.lessThanOrEqualTo(backView).offset(-20)
|
||
}
|
||
|
||
dateLb.snp.makeConstraints { make in
|
||
make.centerY.equalTo(nameLb)
|
||
make.right.equalToSuperview().offset(-8)
|
||
}
|
||
|
||
badgeLb.snp.makeConstraints { make in
|
||
make.right.equalTo(dateLb)
|
||
make.centerY.equalTo(textLb)
|
||
make.size.equalTo(CGSize(width: 18, height: 18))
|
||
}
|
||
}
|
||
|
||
private lazy var backView: UIView = {
|
||
let view = UIView()
|
||
view.backgroundColor = ThemeColor(hexStr: "#525566")
|
||
view.layer.masksToBounds = true
|
||
view.addCorner(cornerRadii: UIView.CornerRadii.init(topLeft: 36, topRight: 10, bottomLeft: 36, bottomRight: 10), frame: CGRectMake(0, 0, ScreenWidth - 32, 72))
|
||
return view
|
||
}()
|
||
|
||
private lazy var avatarImgView: UIImageView = {
|
||
let imageView = UIImageView()
|
||
imageView.isUserInteractionEnabled = true
|
||
imageView.layer.masksToBounds = true
|
||
imageView.contentMode = .scaleAspectFill
|
||
imageView.layer.cornerRadius = 30
|
||
return imageView
|
||
}()
|
||
|
||
private lazy var textLb: UILabel = {
|
||
let label = UILabel()
|
||
label.textColor = UIColor(white: 1, alpha: 0.8)
|
||
label.font = UIFont.systemFont(ofSize: 14)
|
||
return label
|
||
}()
|
||
|
||
private lazy var nameLb: UILabel = {
|
||
let label = UILabel()
|
||
label.textColor = .white
|
||
label.font = UIFont.systemFont(ofSize: 15, weight: .medium)
|
||
return label
|
||
}()
|
||
|
||
private lazy var dateLb: UILabel = {
|
||
let label = UILabel()
|
||
label.textColor = ThemeColor(hexStr: "#7D8499")
|
||
label.font = UIFont.systemFont(ofSize: 12, weight: .light)
|
||
return label
|
||
}()
|
||
|
||
private lazy var badgeLb: UILabel = {
|
||
let label = UILabel()
|
||
label.textColor = .white
|
||
label.backgroundColor = .red
|
||
label.textAlignment = .center
|
||
label.font = UIFont.systemFont(ofSize: 11)
|
||
label.layer.cornerRadius = 9
|
||
label.layer.masksToBounds = true
|
||
return label
|
||
}()
|
||
|
||
required init?(coder: NSCoder) {
|
||
fatalError("init(coder:) has not been implemented")
|
||
}
|
||
|
||
}
|