add action to emoji reacts

pull/638/head
Ryan Zhao 3 years ago
parent fe1b8ebb93
commit 965c1c48e5

@ -95,5 +95,7 @@ protocol ContextMenuActionDelegate : AnyObject {
func save(_ viewItem: ConversationViewItem) func save(_ viewItem: ConversationViewItem)
func ban(_ viewItem: ConversationViewItem) func ban(_ viewItem: ConversationViewItem)
func banAndDeleteAllMessages(_ viewItem: ConversationViewItem) func banAndDeleteAllMessages(_ viewItem: ConversationViewItem)
func react(_ viewItem: ConversationViewItem, with emoji: String)
func showFullEmojiKeyboard(_ viewItem: ConversationViewItem)
func contextMenuDismissed() func contextMenuDismissed()
} }

@ -4,14 +4,16 @@ extension ContextMenuVC {
final class EmojiReactsView: UIView { final class EmojiReactsView: UIView {
private let emoji: String private let emoji: String
private let dismiss: () -> Void private let dismiss: () -> Void
private let work: () -> Void
// MARK: Settings // MARK: Settings
private static let size: CGFloat = 40 private static let size: CGFloat = 40
// MARK: Lifecycle // MARK: Lifecycle
init(for emoji: String, dismiss: @escaping () -> Void) { init(for emoji: String, dismiss: @escaping () -> Void, work: @escaping () -> Void) {
self.emoji = emoji self.emoji = emoji
self.dismiss = dismiss self.dismiss = dismiss
self.work = work
super.init(frame: CGRect.zero) super.init(frame: CGRect.zero)
setUpViewHierarchy() setUpViewHierarchy()
} }
@ -38,20 +40,23 @@ extension ContextMenuVC {
// MARK: Interaction // MARK: Interaction
@objc private func handleTap() { @objc private func handleTap() {
work()
dismiss() dismiss()
} }
} }
final class EmojiPlusButton: UIView { final class EmojiPlusButton: UIView {
private let dismiss: () -> Void private let dismiss: () -> Void
private let work: () -> Void
// MARK: Settings // MARK: Settings
public static let size: CGFloat = 28 public static let size: CGFloat = 28
private let iconSize: CGFloat = 14 private let iconSize: CGFloat = 14
// MARK: Lifecycle // MARK: Lifecycle
init(dismiss: @escaping () -> Void) { init(dismiss: @escaping () -> Void, work: @escaping () -> Void) {
self.dismiss = dismiss self.dismiss = dismiss
self.work = work
super.init(frame: CGRect.zero) super.init(frame: CGRect.zero)
setUpViewHierarchy() setUpViewHierarchy()
} }
@ -84,6 +89,7 @@ extension ContextMenuVC {
// MARK: Interaction // MARK: Interaction
@objc private func handleTap() { @objc private func handleTap() {
dismiss() dismiss()
work()
} }
} }

@ -20,7 +20,7 @@ final class ContextMenuVC : UIViewController {
}() }()
private lazy var emojiPlusButton: EmojiPlusButton = { private lazy var emojiPlusButton: EmojiPlusButton = {
let result = EmojiPlusButton(dismiss: snDismiss) let result = EmojiPlusButton(dismiss: snDismiss) { self.delegate?.showFullEmojiKeyboard(self.viewItem) }
result.set(.width, to: EmojiPlusButton.size) result.set(.width, to: EmojiPlusButton.size)
result.set(.height, to: EmojiPlusButton.size) result.set(.height, to: EmojiPlusButton.size)
result.layer.cornerRadius = EmojiPlusButton.size / 2 result.layer.cornerRadius = EmojiPlusButton.size / 2
@ -106,7 +106,11 @@ final class ContextMenuVC : UIViewController {
emojiPlusButton.pin(.right, to: .right, of: emojiBar, withInset: -Values.smallSpacing) emojiPlusButton.pin(.right, to: .right, of: emojiBar, withInset: -Values.smallSpacing)
emojiPlusButton.center(.vertical, in: emojiBar) emojiPlusButton.center(.vertical, in: emojiBar)
let emojiLabels = ["🙈", "🙉", "🙊", "😈", "🥸", "🐀"].map { EmojiReactsView(for: $0, dismiss: snDismiss) } let emojiLabels = UserDefaults.standard.getRecentlyUsedEmojis().map { emoji -> EmojiReactsView in
EmojiReactsView(for: emoji, dismiss: snDismiss) {
self.delegate?.react(self.viewItem, with: emoji)
}
}
let emojiBarStackView = UIStackView(arrangedSubviews: emojiLabels) let emojiBarStackView = UIStackView(arrangedSubviews: emojiLabels)
emojiBarStackView.axis = .horizontal emojiBarStackView.axis = .horizontal
emojiBarStackView.spacing = Values.smallSpacing emojiBarStackView.spacing = Values.smallSpacing

@ -819,6 +819,16 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc
presentAlert(alert) presentAlert(alert)
} }
func react(_ viewItem: ConversationViewItem, with emoji: String) {
print("Ryan Test: \(emoji)")
// TODO: send emoji react message
UserDefaults.standard.addNewRecentlyUsedEmoji(emoji)
}
func showFullEmojiKeyboard(_ viewItem: ConversationViewItem) {
// TODO: to be implemented
}
func contextMenuDismissed() { func contextMenuDismissed() {
recoverInputView() recoverInputView()
} }

@ -33,6 +33,10 @@ public enum SNUserDefaults {
public enum String : Swift.String { public enum String : Swift.String {
case deviceToken case deviceToken
} }
public enum Array : Swift.String {
case recentlyUsedEmojis
}
} }
public extension UserDefaults { public extension UserDefaults {
@ -61,4 +65,29 @@ public extension UserDefaults {
get { return self.string(forKey: string.rawValue) } get { return self.string(forKey: string.rawValue) }
set { set(newValue, forKey: string.rawValue) } set { set(newValue, forKey: string.rawValue) }
} }
subscript(array: SNUserDefaults.Array) -> [String] {
get { return self.stringArray(forKey: array.rawValue) ?? []}
set { set(newValue, forKey: array.rawValue) }
}
func getRecentlyUsedEmojis() -> [String] {
let result = self[.recentlyUsedEmojis]
if result.isEmpty {
return ["🙈", "🙉", "🙊", "😈", "🥸", "🐀"]
}
return result
}
func addNewRecentlyUsedEmoji(_ emoji: String) {
var recentlyUsedEmojis = getRecentlyUsedEmojis()
if let index = recentlyUsedEmojis.firstIndex(of: emoji) {
recentlyUsedEmojis.remove(at: index)
}
if recentlyUsedEmojis.count >= 6 {
recentlyUsedEmojis.remove(at: 5)
}
recentlyUsedEmojis.insert(emoji, at: 0)
self[.recentlyUsedEmojis] = recentlyUsedEmojis
}
} }

Loading…
Cancel
Save