From 1a80467e862bb5ea798aeebf62cd0f7da71db595 Mon Sep 17 00:00:00 2001 From: Johnny Date: Tue, 11 Apr 2017 15:30:12 -0700 Subject: [PATCH 1/3] message deletion timer --- .../GroupChannel/SnapChatViewController.swift | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/sample-swift/SendBird-iOS/GroupChannel/SnapChatViewController.swift b/sample-swift/SendBird-iOS/GroupChannel/SnapChatViewController.swift index 2cf6497..bdf8c2f 100644 --- a/sample-swift/SendBird-iOS/GroupChannel/SnapChatViewController.swift +++ b/sample-swift/SendBird-iOS/GroupChannel/SnapChatViewController.swift @@ -2,7 +2,8 @@ import UIKit import SendBirdSDK class SnapChatViewController: GroupChannelChattingViewController, SBDChannelDelegate { - // JC TODO: Create timer to message deletion after a message is read by the recipient + // JC TODO: Create timer to message deletion after a message is read by the recipient. + var timer: Timer = Timer() override func viewDidLoad() { super.viewDidLoad() @@ -32,6 +33,15 @@ class SnapChatViewController: GroupChannelChattingViewController, SBDChannelDele // JC TODO: Message read by recipient, start timer to delete message // To get the last message, use sender.lastMessage + guard let lastMessage = sender.lastMessage else { + return + } + + timer = Timer.scheduledTimer(withTimeInterval: 30, repeats: false, block: { (timer) in + sender.delete(lastMessage) { (error) in + NSLog("message delete") + } + }) } func channelDidUpdateTypingStatus(_ sender: SBDGroupChannel) { From d4d1b2064fd7718021c7328fffeb9fdd458526ed Mon Sep 17 00:00:00 2001 From: Johnny Date: Tue, 11 Apr 2017 17:31:14 -0700 Subject: [PATCH 2/3] timer and ui for message deletion --- .../SendBird-iOS/Chatting/ChattingView.swift | 14 +++++++++- .../OutgoingUserMessageTableViewCell.swift | 28 ++++++++++++++++++- .../OutgoingUserMessageTableViewCell.xib | 20 +++++++++++-- .../SendBird-iOS/Common/Constants.swift | 2 ++ .../GroupChannel/SnapChatViewController.swift | 27 ++++++++++++++---- 5 files changed, 80 insertions(+), 11 deletions(-) diff --git a/sample-swift/SendBird-iOS/Chatting/ChattingView.swift b/sample-swift/SendBird-iOS/Chatting/ChattingView.swift index 0650920..1b6e8a9 100644 --- a/sample-swift/SendBird-iOS/Chatting/ChattingView.swift +++ b/sample-swift/SendBird-iOS/Chatting/ChattingView.swift @@ -140,7 +140,7 @@ class ChattingView: ReusableViewFromXib, UITableViewDelegate, UITableViewDataSou self.outgoingVideoFileMessageSizingTableViewCell?.isHidden = true self.addSubview(self.outgoingVideoFileMessageSizingTableViewCell!) } - + func scrollToBottom(animated: Bool, force: Bool) { if self.messages.count == 0 { return @@ -152,6 +152,18 @@ class ChattingView: ReusableViewFromXib, UITableViewDelegate, UITableViewDataSou self.chattingTableView.scrollToRow(at: IndexPath.init(row: self.messages.count - 1, section: 0), at: UITableViewScrollPosition.bottom, animated: false) } + + func startDeletionCountdown(timeInterval: TimeInterval) { + if chattingTableView.visibleCells.count <= 0 { + return + } + + guard let cell = chattingTableView.visibleCells.last as? OutgoingUserMessageTableViewCell else { + return + } + + cell.startDeletionTimer(timeInterval: timeInterval) + } func scrollToPosition(position: Int) { if self.messages.count == 0 { diff --git a/sample-swift/SendBird-iOS/Chatting/ViewCell/OutgoingUserMessageTableViewCell.swift b/sample-swift/SendBird-iOS/Chatting/ViewCell/OutgoingUserMessageTableViewCell.swift index 33aa4c9..8829e1a 100644 --- a/sample-swift/SendBird-iOS/Chatting/ViewCell/OutgoingUserMessageTableViewCell.swift +++ b/sample-swift/SendBird-iOS/Chatting/ViewCell/OutgoingUserMessageTableViewCell.swift @@ -22,7 +22,8 @@ class OutgoingUserMessageTableViewCell: UITableViewCell { @IBOutlet weak var dateSeperatorLabel: UILabel! @IBOutlet weak var messageContainerView: UIView! @IBOutlet weak var sendStatusLabel: UILabel! - + @IBOutlet weak var deletionCountdownLabel: UILabel! + @IBOutlet weak var dateContainerHeight: NSLayoutConstraint! @IBOutlet weak var dateContainerTopMargin: NSLayoutConstraint! @IBOutlet weak var dateContainerBottomMargin: NSLayoutConstraint! @@ -37,6 +38,9 @@ class OutgoingUserMessageTableViewCell: UITableViewCell { private var message: SBDUserMessage! private var prevMessage: SBDBaseMessage! + + var timer = Timer() + var deletionTime: TimeInterval = 30 static func nib() -> UINib { return UINib(nibName: String(describing: self), bundle: Bundle(for: self)) @@ -46,6 +50,10 @@ class OutgoingUserMessageTableViewCell: UITableViewCell { return String(describing: self) } + override func awakeFromNib() { + deletionCountdownLabel.isHidden = true + } + @objc private func clickUserMessage() { if self.delegate != nil { self.delegate?.clickMessage(view: self, message: self.message!) @@ -63,6 +71,24 @@ class OutgoingUserMessageTableViewCell: UITableViewCell { self.delegate?.clickDelete(view: self, message: self.message!) } } + + func startDeletionTimer(timeInterval: TimeInterval) { + deletionCountdownLabel.isHidden = false + deletionCountdownLabel.text = String(Int(timeInterval)) + deletionTime = timeInterval + Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (timer) in + if self.deletionTime <= 0 { + timer.invalidate() + NotificationCenter.default.post(name: NSNotification.Name(rawValue: Constants.deleteMessage), + object: nil, + userInfo: ["message": self.message]) + return + } + + self.deletionTime -= 1 + self.deletionCountdownLabel.text = String(Int(self.deletionTime)) + } + } func setModel(aMessage: SBDUserMessage) { self.message = aMessage diff --git a/sample-swift/SendBird-iOS/Chatting/ViewCell/OutgoingUserMessageTableViewCell.xib b/sample-swift/SendBird-iOS/Chatting/ViewCell/OutgoingUserMessageTableViewCell.xib index afcbbf2..73006a6 100644 --- a/sample-swift/SendBird-iOS/Chatting/ViewCell/OutgoingUserMessageTableViewCell.xib +++ b/sample-swift/SendBird-iOS/Chatting/ViewCell/OutgoingUserMessageTableViewCell.xib @@ -1,10 +1,11 @@ - + - + + @@ -14,7 +15,7 @@ - + @@ -69,9 +70,21 @@ + + + @@ -151,6 +164,7 @@ + diff --git a/sample-swift/SendBird-iOS/Common/Constants.swift b/sample-swift/SendBird-iOS/Common/Constants.swift index 75be64e..79dc102 100644 --- a/sample-swift/SendBird-iOS/Common/Constants.swift +++ b/sample-swift/SendBird-iOS/Common/Constants.swift @@ -9,6 +9,8 @@ import UIKit class Constants: NSObject { + static let deleteMessage = "deleteMessage" + static func navigationBarTitleColor() -> UIColor { return UIColor(red: 128.0/255.0, green: 90.0/255.0, blue: 255.0/255.0, alpha: 1) } diff --git a/sample-swift/SendBird-iOS/GroupChannel/SnapChatViewController.swift b/sample-swift/SendBird-iOS/GroupChannel/SnapChatViewController.swift index bdf8c2f..f6baf2a 100644 --- a/sample-swift/SendBird-iOS/GroupChannel/SnapChatViewController.swift +++ b/sample-swift/SendBird-iOS/GroupChannel/SnapChatViewController.swift @@ -9,8 +9,27 @@ class SnapChatViewController: GroupChannelChattingViewController, SBDChannelDele super.viewDidLoad() SBDMain.add(self as SBDChannelDelegate, identifier: self.delegateIdentifier) + + NotificationCenter.default.addObserver(self, + selector: #selector(deleteMessage(notification:)), + name: NSNotification.Name(rawValue: Constants.deleteMessage), + object: nil) } + deinit { + NotificationCenter.default.removeObserver(self) + } + + func deleteMessage(notification: Notification) { + guard let message = notification.userInfo?["message"] as? SBDBaseMessage else { + return + } + + groupChannel.delete(message) { (error) in + NSLog("message deleted") + } + } + // MARK: SBDChannelDelegate func channel(_ sender: SBDBaseChannel, didReceive message: SBDBaseMessage) { if sender == self.groupChannel { @@ -33,15 +52,11 @@ class SnapChatViewController: GroupChannelChattingViewController, SBDChannelDele // JC TODO: Message read by recipient, start timer to delete message // To get the last message, use sender.lastMessage - guard let lastMessage = sender.lastMessage else { + guard let chattingView = chattingView else { return } - timer = Timer.scheduledTimer(withTimeInterval: 30, repeats: false, block: { (timer) in - sender.delete(lastMessage) { (error) in - NSLog("message delete") - } - }) + chattingView.startDeletionCountdown(timeInterval: 10) } func channelDidUpdateTypingStatus(_ sender: SBDGroupChannel) { From a99c12bd4667c4829286b2996b80a59b34ca058b Mon Sep 17 00:00:00 2001 From: Johnny Date: Tue, 11 Apr 2017 17:58:43 -0700 Subject: [PATCH 3/3] move timer to incoming message --- .../SendBird-iOS/Chatting/ChattingView.swift | 2 +- .../IncomingUserMessageTableViewCell.swift | 26 ++++++++++++++ .../IncomingUserMessageTableViewCell.xib | 19 +++++++++-- .../OutgoingUserMessageTableViewCell.swift | 23 +------------ .../OutgoingUserMessageTableViewCell.xib | 2 +- .../GroupChannel/SnapChatViewController.swift | 34 +++++++++++++------ 6 files changed, 69 insertions(+), 37 deletions(-) diff --git a/sample-swift/SendBird-iOS/Chatting/ChattingView.swift b/sample-swift/SendBird-iOS/Chatting/ChattingView.swift index 1b6e8a9..e284a43 100644 --- a/sample-swift/SendBird-iOS/Chatting/ChattingView.swift +++ b/sample-swift/SendBird-iOS/Chatting/ChattingView.swift @@ -158,7 +158,7 @@ class ChattingView: ReusableViewFromXib, UITableViewDelegate, UITableViewDataSou return } - guard let cell = chattingTableView.visibleCells.last as? OutgoingUserMessageTableViewCell else { + guard let cell = chattingTableView.visibleCells.last as? IncomingUserMessageTableViewCell else { return } diff --git a/sample-swift/SendBird-iOS/Chatting/ViewCell/IncomingUserMessageTableViewCell.swift b/sample-swift/SendBird-iOS/Chatting/ViewCell/IncomingUserMessageTableViewCell.swift index 06936d8..6e40031 100644 --- a/sample-swift/SendBird-iOS/Chatting/ViewCell/IncomingUserMessageTableViewCell.swift +++ b/sample-swift/SendBird-iOS/Chatting/ViewCell/IncomingUserMessageTableViewCell.swift @@ -19,6 +19,7 @@ class IncomingUserMessageTableViewCell: UITableViewCell { @IBOutlet weak var messageLabel: UILabel! @IBOutlet weak var messageDateLabel: UILabel! @IBOutlet weak var messageContainerView: UIView! + @IBOutlet weak var deletionCountdownLabel: UILabel! @IBOutlet weak var dateLabelContainerHeight: NSLayoutConstraint! @IBOutlet weak var messageDateLabelWidth: NSLayoutConstraint! @@ -37,6 +38,9 @@ class IncomingUserMessageTableViewCell: UITableViewCell { private var message: SBDUserMessage! private var prevMessage: SBDBaseMessage! private var displayNickname: Bool = true + + var timer = Timer() + var deletionTime: TimeInterval = 30 static func nib() -> UINib { return UINib(nibName: String(describing: self), bundle: Bundle(for: self)) @@ -45,6 +49,10 @@ class IncomingUserMessageTableViewCell: UITableViewCell { static func cellReuseIdentifier() -> String { return String(describing: self) } + + override func awakeFromNib() { + deletionCountdownLabel.isHidden = true + } @objc private func clickProfileImage() { if self.delegate != nil { @@ -57,6 +65,24 @@ class IncomingUserMessageTableViewCell: UITableViewCell { self.delegate?.clickMessage(view: self, message: self.message!) } } + + func startDeletionTimer(timeInterval: TimeInterval) { + deletionCountdownLabel.isHidden = false + deletionCountdownLabel.text = String(Int(timeInterval)) + deletionTime = timeInterval + Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (timer) in + if self.deletionTime <= 0 { + timer.invalidate() + NotificationCenter.default.post(name: NSNotification.Name(rawValue: Constants.deleteMessage), + object: nil, + userInfo: ["message": self.message]) + return + } + + self.deletionTime -= 1 + self.deletionCountdownLabel.text = String(Int(self.deletionTime)) + } + } func setModel(aMessage: SBDUserMessage) { self.message = aMessage diff --git a/sample-swift/SendBird-iOS/Chatting/ViewCell/IncomingUserMessageTableViewCell.xib b/sample-swift/SendBird-iOS/Chatting/ViewCell/IncomingUserMessageTableViewCell.xib index 44b5776..f374e37 100644 --- a/sample-swift/SendBird-iOS/Chatting/ViewCell/IncomingUserMessageTableViewCell.xib +++ b/sample-swift/SendBird-iOS/Chatting/ViewCell/IncomingUserMessageTableViewCell.xib @@ -1,11 +1,11 @@ - + - + @@ -15,7 +15,7 @@ - + @@ -97,6 +97,16 @@ +