|  |  |  | import UIKit | 
					
						
							|  |  |  | import SessionUIKit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | final class SimplifiedConversationCell : UITableViewCell { | 
					
						
							|  |  |  |     var threadViewModel: ThreadViewModel! { didSet { update() } } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     // MARK: - Initialization | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { | 
					
						
							|  |  |  |         super.init(style: style, reuseIdentifier: reuseIdentifier) | 
					
						
							|  |  |  |         setUpViewHierarchy() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     required init?(coder: NSCoder) { | 
					
						
							|  |  |  |         super.init(coder: coder) | 
					
						
							|  |  |  |         setUpViewHierarchy() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     // MARK: - UI | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     private lazy var stackView: UIStackView = { | 
					
						
							|  |  |  |         let stackView: UIStackView = UIStackView() | 
					
						
							|  |  |  |         stackView.translatesAutoresizingMaskIntoConstraints = false | 
					
						
							|  |  |  |         stackView.axis = .horizontal | 
					
						
							|  |  |  |         stackView.alignment = .center | 
					
						
							|  |  |  |         stackView.spacing = Values.mediumSpacing | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         return stackView | 
					
						
							|  |  |  |     }() | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     private lazy var accentLineView: UIView = { | 
					
						
							|  |  |  |         let result = UIView() | 
					
						
							|  |  |  |         result.translatesAutoresizingMaskIntoConstraints = false | 
					
						
							|  |  |  |         result.backgroundColor = Colors.destructive | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         return result | 
					
						
							|  |  |  |     }() | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     private lazy var profilePictureView: ProfilePictureView = { | 
					
						
							|  |  |  |         let view: ProfilePictureView = ProfilePictureView() | 
					
						
							|  |  |  |         view.translatesAutoresizingMaskIntoConstraints = false | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         return view | 
					
						
							|  |  |  |     }() | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     private lazy var displayNameLabel: UILabel = { | 
					
						
							|  |  |  |         let result = UILabel() | 
					
						
							|  |  |  |         result.font = .boldSystemFont(ofSize: Values.mediumFontSize) | 
					
						
							|  |  |  |         result.textColor = Colors.text | 
					
						
							|  |  |  |         result.lineBreakMode = .byTruncatingTail | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         return result | 
					
						
							|  |  |  |     }() | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     // MARK: - Initialization | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     private func setUpViewHierarchy() { | 
					
						
							|  |  |  |         backgroundColor = Colors.cellBackground | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         let selectedBackgroundView = UIView() | 
					
						
							|  |  |  |         selectedBackgroundView.backgroundColor = Colors.cellSelected | 
					
						
							|  |  |  |         self.selectedBackgroundView = selectedBackgroundView | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         addSubview(stackView) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         stackView.addArrangedSubview(accentLineView) | 
					
						
							|  |  |  |         stackView.addArrangedSubview(profilePictureView) | 
					
						
							|  |  |  |         stackView.addArrangedSubview(displayNameLabel) | 
					
						
							|  |  |  |         stackView.addArrangedSubview(UIView.hSpacer(0)) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         setupLayout() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     // MARK: - Layout | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     private func setupLayout() { | 
					
						
							|  |  |  |         accentLineView.set(.width, to: Values.accentLineThickness) | 
					
						
							|  |  |  |         accentLineView.set(.height, to: 68) | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         let profilePictureViewSize = Values.mediumProfilePictureSize | 
					
						
							|  |  |  |         profilePictureView.set(.width, to: profilePictureViewSize) | 
					
						
							|  |  |  |         profilePictureView.set(.height, to: profilePictureViewSize) | 
					
						
							|  |  |  |         profilePictureView.size = profilePictureViewSize | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         stackView.pin(to: self) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     // MARK: - Content | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     private func update() { | 
					
						
							|  |  |  |         AssertIsOnMainThread() | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         guard let thread = threadViewModel?.threadRecord else { return } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         let isBlocked: Bool | 
					
						
							|  |  |  |         if let thread = thread as? TSContactThread { | 
					
						
							|  |  |  |             isBlocked = SSKEnvironment.shared.blockingManager.isRecipientIdBlocked(thread.contactSessionID()) | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             isBlocked = false | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         accentLineView.alpha = (isBlocked ? 1 : 0) | 
					
						
							|  |  |  |         profilePictureView.update(for: thread) | 
					
						
							|  |  |  |         displayNameLabel.text = getDisplayName() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     private func getDisplayName() -> String { | 
					
						
							|  |  |  |         if threadViewModel.isGroupThread { | 
					
						
							|  |  |  |             if threadViewModel.name.isEmpty { | 
					
						
							|  |  |  |                 // TODO: Localization | 
					
						
							|  |  |  |                 return "Unknown Group" | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             return threadViewModel.name | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         if threadViewModel.threadRecord.isNoteToSelf() { | 
					
						
							|  |  |  |             return "NOTE_TO_SELF".localized() | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         guard let hexEncodedPublicKey: String = threadViewModel.contactSessionID else { | 
					
						
							|  |  |  |             // TODO: Localization | 
					
						
							|  |  |  |             return "Unknown" | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         return ( | 
					
						
							|  |  |  |             Storage.shared.getContact(with: hexEncodedPublicKey)?.displayName(for: .regular) ?? | 
					
						
							|  |  |  |             hexEncodedPublicKey | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |