mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			150 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Swift
		
	
			
		
		
	
	
			150 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Swift
		
	
| //
 | |
| //  Copyright (c) 2018 Open Whisper Systems. All rights reserved.
 | |
| //
 | |
| 
 | |
| import Foundation
 | |
| 
 | |
| @objc(OWSTypingIndicatorCell)
 | |
| public class TypingIndicatorCell: ConversationViewCell {
 | |
| 
 | |
|     @objc
 | |
|     public static let cellReuseIdentifier = "TypingIndicatorCell"
 | |
| 
 | |
|     @available(*, unavailable, message:"use other constructor instead.")
 | |
|     @objc
 | |
|     public required init(coder aDecoder: NSCoder) {
 | |
|         notImplemented()
 | |
|     }
 | |
| 
 | |
|     private let kAvatarSize: CGFloat = 36
 | |
|     private let kAvatarHSpacing: CGFloat = 8
 | |
| 
 | |
| //    private let avatarView = AvatarImageView()
 | |
|     private let bubbleView = OWSBubbleView()
 | |
|     private let typingIndicatorView = TypingIndicatorView()
 | |
|     private var viewConstraints = [NSLayoutConstraint]()
 | |
| 
 | |
|     override init(frame: CGRect) {
 | |
|         super.init(frame: frame)
 | |
| 
 | |
|         commonInit()
 | |
|     }
 | |
| 
 | |
|     private func commonInit() {
 | |
|         self.layoutMargins = .zero
 | |
|         self.contentView.layoutMargins = .zero
 | |
| 
 | |
|         bubbleView.layoutMargins = .zero
 | |
| 
 | |
|         bubbleView.addSubview(typingIndicatorView)
 | |
|         contentView.addSubview(bubbleView)
 | |
| 
 | |
| //        avatarView.autoSetDimension(.width, toSize: kAvatarSize)
 | |
| //        avatarView.autoSetDimension(.height, toSize: kAvatarSize)
 | |
|     }
 | |
| 
 | |
|     @objc
 | |
|     public override func loadForDisplay() {
 | |
|         guard let conversationStyle = self.conversationStyle else {
 | |
|             owsFailDebug("Missing conversationStyle")
 | |
|             return
 | |
|         }
 | |
| 
 | |
|         bubbleView.bubbleColor = conversationStyle.bubbleColor(isIncoming: true)
 | |
|         typingIndicatorView.startAnimation()
 | |
| 
 | |
|         viewConstraints.append(contentsOf: [
 | |
|             bubbleView.autoPinEdge(toSuperviewEdge: .leading, withInset: conversationStyle.gutterLeading),
 | |
|             bubbleView.autoPinEdge(toSuperviewEdge: .trailing, withInset: conversationStyle.gutterTrailing, relation: .greaterThanOrEqual),
 | |
|             bubbleView.autoPinTopToSuperviewMargin(withInset: 0),
 | |
|             bubbleView.autoPinBottomToSuperviewMargin(withInset: 0),
 | |
| 
 | |
|             typingIndicatorView.autoPinEdge(toSuperviewEdge: .leading, withInset: conversationStyle.textInsetHorizontal),
 | |
|             typingIndicatorView.autoPinEdge(toSuperviewEdge: .trailing, withInset: conversationStyle.textInsetHorizontal),
 | |
|             typingIndicatorView.autoPinTopToSuperviewMargin(withInset: conversationStyle.textInsetTop),
 | |
|             typingIndicatorView.autoPinBottomToSuperviewMargin(withInset: conversationStyle.textInsetBottom)
 | |
|             ])
 | |
| 
 | |
| //        if let avatarView = configureAvatarView() {
 | |
| //            contentView.addSubview(avatarView)
 | |
| //            viewConstraints.append(contentsOf: [
 | |
| //                bubbleView.autoPinLeading(toTrailingEdgeOf: avatarView, offset: kAvatarHSpacing),
 | |
| //                bubbleView.autoAlignAxis(.horizontal, toSameAxisOf: avatarView)
 | |
| //                ])
 | |
| //
 | |
| //        } else {
 | |
| //            avatarView.removeFromSuperview()
 | |
| //        }
 | |
|     }
 | |
| 
 | |
|     private func configureAvatarView() -> UIView? {
 | |
|         guard let viewItem = self.viewItem else {
 | |
|             owsFailDebug("Missing viewItem")
 | |
|             return nil
 | |
|         }
 | |
|         guard let typingIndicators = viewItem.interaction as? TypingIndicatorInteraction else {
 | |
|             owsFailDebug("Missing typingIndicators")
 | |
|             return nil
 | |
|         }
 | |
|         guard shouldShowAvatar() else {
 | |
|             return nil
 | |
|         }
 | |
|         guard let colorName = viewItem.authorConversationColorName else {
 | |
|             owsFailDebug("Missing authorConversationColorName")
 | |
|             return nil
 | |
|         }
 | |
| //        guard let authorAvatarImage =
 | |
| //            OWSContactAvatarBuilder(signalId: typingIndicators.recipientId,
 | |
| //                                    colorName: ConversationColorName(rawValue: colorName),
 | |
| //                                    diameter: UInt(kAvatarSize)).build() else {
 | |
| //                                        owsFailDebug("Could build avatar image")
 | |
| //                                        return nil
 | |
| //        }
 | |
| //        avatarView.image = authorAvatarImage
 | |
| //        return avatarView
 | |
|         return UIView()
 | |
|     }
 | |
| 
 | |
|     private func shouldShowAvatar() -> Bool {
 | |
|         guard let viewItem = self.viewItem else {
 | |
|             owsFailDebug("Missing viewItem")
 | |
|             return false
 | |
|         }
 | |
|         return viewItem.isGroupThread
 | |
|     }
 | |
| 
 | |
|     @objc
 | |
|     public override func cellSize() -> CGSize {
 | |
|         guard let conversationStyle = self.conversationStyle else {
 | |
|             owsFailDebug("Missing conversationStyle")
 | |
|             return .zero
 | |
|         }
 | |
| 
 | |
|         let insetsSize = CGSize(width: conversationStyle.textInsetHorizontal * 2,
 | |
|                                 height: conversationStyle.textInsetTop + conversationStyle.textInsetBottom)
 | |
|         let typingIndicatorSize = typingIndicatorView.sizeThatFits(.zero)
 | |
|         let bubbleSize = CGSizeAdd(insetsSize, typingIndicatorSize)
 | |
| 
 | |
|         if shouldShowAvatar() {
 | |
|             return CGSizeCeil(CGSize(width: kAvatarSize + kAvatarHSpacing + bubbleSize.width,
 | |
|                                      height: max(kAvatarSize, bubbleSize.height)))
 | |
|         } else {
 | |
|             return CGSizeCeil(CGSize(width: bubbleSize.width,
 | |
|                                      height: max(kAvatarSize, bubbleSize.height)))
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     @objc
 | |
|     public override func prepareForReuse() {
 | |
|         super.prepareForReuse()
 | |
| 
 | |
|         NSLayoutConstraint.deactivate(viewConstraints)
 | |
|         viewConstraints = [NSLayoutConstraint]()
 | |
| 
 | |
| //        avatarView.image = nil
 | |
| //        avatarView.removeFromSuperview()
 | |
| 
 | |
|         typingIndicatorView.stopAnimation()
 | |
|     }
 | |
| }
 |