Update friend request view for sent state

pull/14/head
Niels Andriesse 7 years ago
parent f748fbd4cc
commit da967e6586

@ -1,7 +1,11 @@
@objc final class FriendRequestView : UIView {
@objc var message: TSIncomingMessage! { didSet { handleMessageChanged() } }
@objc var message: TSMessage! { didSet { handleMessageChanged() } }
@objc weak var delegate: FriendRequestViewDelegate?
private let kind: Kind
// MARK: Types
enum Kind : String { case incoming, outgoing }
// MARK: Components
private lazy var buttonFont = UIFont.ows_dynamicTypeBodyClamped.ows_mediumWeight()
@ -18,14 +22,22 @@
}()
// MARK: Initialization
init(kind: Kind) {
self.kind = kind
super.init(frame: CGRect.zero)
}
@objc convenience init?(rawKind: String) {
guard let kind = Kind(rawValue: rawKind) else { return nil }
self.init(kind: kind)
}
required init?(coder: NSCoder) {
super.init(coder: coder)
initialize()
fatalError("Using FriendRequestView.init(coder:) isn't allowed. Use FriendRequestView.init(kind:) instead.")
}
override init(frame: CGRect) {
super.init(frame: frame)
initialize()
fatalError("Using FriendRequestView.init(frame:) isn't allowed. Use FriendRequestView.init(kind:) instead.")
}
private func initialize() {
@ -33,44 +45,71 @@
mainStackView.axis = .vertical
mainStackView.distribution = .fill
mainStackView.addArrangedSubview(label)
let buttonStackView = UIStackView()
buttonStackView.axis = .horizontal
buttonStackView.distribution = .fillEqually
mainStackView.addArrangedSubview(buttonStackView)
let acceptButton = OWSFlatButton.button(title: NSLocalizedString("Accept", comment: ""), font: buttonFont, titleColor: .ows_materialBlue, backgroundColor: .white, target: self, selector: #selector(accept))
acceptButton.autoSetDimension(.height, toSize: buttonHeight)
buttonStackView.addArrangedSubview(acceptButton)
let declineButton = OWSFlatButton.button(title: NSLocalizedString("Decline", comment: ""), font: buttonFont, titleColor: .ows_destructiveRed, backgroundColor: .white, target: self, selector: #selector(decline))
declineButton.autoSetDimension(.height, toSize: buttonHeight)
buttonStackView.addArrangedSubview(declineButton)
switch kind {
case .incoming:
let buttonStackView = UIStackView()
buttonStackView.axis = .horizontal
buttonStackView.distribution = .fillEqually
mainStackView.addArrangedSubview(buttonStackView)
let acceptButton = OWSFlatButton.button(title: NSLocalizedString("Accept", comment: ""), font: buttonFont, titleColor: .ows_materialBlue, backgroundColor: .white, target: self, selector: #selector(accept))
acceptButton.autoSetDimension(.height, toSize: buttonHeight)
buttonStackView.addArrangedSubview(acceptButton)
let declineButton = OWSFlatButton.button(title: NSLocalizedString("Decline", comment: ""), font: buttonFont, titleColor: .ows_destructiveRed, backgroundColor: .white, target: self, selector: #selector(decline))
declineButton.autoSetDimension(.height, toSize: buttonHeight)
buttonStackView.addArrangedSubview(declineButton)
case .outgoing: break
}
addSubview(mainStackView)
mainStackView.autoPin(toEdgesOf: self)
}
// MARK: Updating
private func handleMessageChanged() {
assert(message != nil)
label.text = String(format: NSLocalizedString("%@ sent you a friend request", comment: ""), message.authorId)
precondition(message != nil)
switch kind {
case .incoming:
guard let message = message as? TSIncomingMessage else { preconditionFailure() }
label.text = String(format: NSLocalizedString("%@ sent you a friend request", comment: ""), message.authorId)
case .outgoing:
guard let message = message as? TSOutgoingMessage else { preconditionFailure() }
label.text = String(format: NSLocalizedString("You've sent %@ a friend request", comment: ""), message.thread.contactIdentifier()!)
}
}
// MARK: Interaction
@objc private func accept() {
guard let message = message as? TSIncomingMessage else { preconditionFailure() }
delegate?.acceptFriendRequest(message)
}
@objc private func decline() {
guard let message = message as? TSIncomingMessage else { preconditionFailure() }
delegate?.declineFriendRequest(message)
}
// MARK: Measuring
@objc static func calculateHeight(message: TSIncomingMessage, conversationStyle: ConversationStyle) -> CGFloat {
@objc static func calculateHeight(message: TSMessage, conversationStyle: ConversationStyle) -> CGFloat {
let width = conversationStyle.contentWidth
let topSpacing: CGFloat = 12
let dummyFriendRequestView = FriendRequestView()
let kind: Kind = {
switch (message) {
case is TSIncomingMessage: return .incoming
case is TSOutgoingMessage: return .outgoing
default: preconditionFailure()
}
}()
let dummyFriendRequestView = FriendRequestView(kind: kind)
dummyFriendRequestView.message = message
let messageHeight = dummyFriendRequestView.label.sizeThatFits(CGSize(width: width, height: CGFloat.greatestFiniteMagnitude)).height
let buttonHeight = dummyFriendRequestView.buttonHeight
let totalHeight = topSpacing + messageHeight + buttonHeight
let totalHeight: CGFloat = {
switch kind {
case .incoming:
let buttonHeight = dummyFriendRequestView.buttonHeight
return topSpacing + messageHeight + buttonHeight
case .outgoing:
return topSpacing + messageHeight
}
}()
return totalHeight.rounded(.up)
}
}

@ -115,17 +115,14 @@ NS_ASSUME_NONNULL_BEGIN
return self.viewItem.interaction.interactionType == OWSInteractionType_OutgoingMessage;
}
- (BOOL)isIncomingFriendRequest {
if ([self.viewItem.interaction isKindOfClass:TSIncomingMessage.class]) {
// TODO: Enable this when possible
// ========
// TSIncomingMessage *message = (TSIncomingMessage *)self.message;
// return message.isFriendRequest
// ========
return YES;
} else {
return NO;
}
- (TSThreadFriendRequestState)friendRequestState {
return TSThreadFriendRequestStateRequestSent;
// return self.message.thread.friendRequestState;
}
- (BOOL)isFriendRequest {
return YES;
// return self.friendRequestState == TSThreadFriendRequestStateRequestSent || self.friendRequestState == TSThreadFriendRequestStateRequestReceived;
}
- (BOOL)shouldHaveSendFailureBadge
@ -180,20 +177,6 @@ NS_ASSUME_NONNULL_BEGIN
withInset:self.conversationStyle.gutterTrailing
relation:NSLayoutRelationGreaterThanOrEqual],
]];
if (self.isIncomingFriendRequest) { // TODO: message.isFriendRequest
self.friendRequestView = [FriendRequestView new];
self.friendRequestView.message = (TSIncomingMessage *)self.message;
self.friendRequestView.delegate = self.friendRequestViewDelegate;
[self.contentView addSubview:self.friendRequestView];
[self.messageBubbleViewBottomConstraint setActive:NO];
[self.viewConstraints addObjectsFromArray:@[
[self.friendRequestView autoPinEdgeToSuperviewEdge:ALEdgeLeading withInset:self.conversationStyle.gutterLeading],
[self.friendRequestView autoPinEdgeToSuperviewEdge:ALEdgeTrailing withInset:self.conversationStyle.gutterTrailing],
[self.friendRequestView autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:self.messageBubbleView withOffset:12.f],
[self.friendRequestView autoPinEdgeToSuperviewEdge:ALEdgeBottom]
]];
}
} else {
if (self.shouldHaveSendFailureBadge) {
self.sendFailureBadgeView = [UIImageView new];
@ -232,6 +215,29 @@ NS_ASSUME_NONNULL_BEGIN
]];
}
}
if (self.isFriendRequest) {
NSString *rawKind;
switch (self.friendRequestState) {
case TSThreadFriendRequestStateRequestReceived:
rawKind = @"incoming";
break;
case TSThreadFriendRequestStateRequestSent:
rawKind = @"outgoing";
break;
}
self.friendRequestView = [[FriendRequestView alloc] initWithRawKind:rawKind];
self.friendRequestView.message = self.message;
self.friendRequestView.delegate = self.friendRequestViewDelegate;
[self.contentView addSubview:self.friendRequestView];
[self.messageBubbleViewBottomConstraint setActive:NO];
[self.viewConstraints addObjectsFromArray:@[
[self.friendRequestView autoPinEdgeToSuperviewEdge:ALEdgeLeading withInset:self.conversationStyle.gutterLeading],
[self.friendRequestView autoPinEdgeToSuperviewEdge:ALEdgeTrailing withInset:self.conversationStyle.gutterTrailing],
[self.friendRequestView autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:self.messageBubbleView withOffset:12.f],
[self.friendRequestView autoPinEdgeToSuperviewEdge:ALEdgeBottom]
]];
}
if ([self updateAvatarView]) {
[self.viewConstraints addObjectsFromArray:@[
@ -370,8 +376,8 @@ NS_ASSUME_NONNULL_BEGIN
cellSize.width += self.sendFailureBadgeSize + self.sendFailureBadgeSpacing;
}
if (self.isIncomingFriendRequest) {
cellSize.height += [FriendRequestView calculateHeightWithMessage:(TSIncomingMessage *)self.viewItem.interaction conversationStyle:self.conversationStyle];
if (self.isFriendRequest) {
cellSize.height += [FriendRequestView calculateHeightWithMessage:(TSMessage *)self.viewItem.interaction conversationStyle:self.conversationStyle];
}
cellSize = CGSizeCeil(cellSize);
@ -452,7 +458,7 @@ NS_ASSUME_NONNULL_BEGIN
{
OWSAssertDebug(self.delegate);
if (self.isIncomingFriendRequest) {
if (self.isFriendRequest) {
return;
}

Loading…
Cancel
Save