diff --git a/Session/Conversations/Context Menu/ContextMenuVC+Action.swift b/Session/Conversations/Context Menu/ContextMenuVC+Action.swift index d7eaaae65..4b324c522 100644 --- a/Session/Conversations/Context Menu/ContextMenuVC+Action.swift +++ b/Session/Conversations/Context Menu/ContextMenuVC+Action.swift @@ -95,5 +95,7 @@ protocol ContextMenuActionDelegate : AnyObject { func save(_ viewItem: ConversationViewItem) func ban(_ viewItem: ConversationViewItem) func banAndDeleteAllMessages(_ viewItem: ConversationViewItem) + func react(_ viewItem: ConversationViewItem, with emoji: String) + func showFullEmojiKeyboard(_ viewItem: ConversationViewItem) func contextMenuDismissed() } diff --git a/Session/Conversations/Context Menu/ContextMenuVC+EmojiReactsView.swift b/Session/Conversations/Context Menu/ContextMenuVC+EmojiReactsView.swift index 691d9a0e9..83adfd966 100644 --- a/Session/Conversations/Context Menu/ContextMenuVC+EmojiReactsView.swift +++ b/Session/Conversations/Context Menu/ContextMenuVC+EmojiReactsView.swift @@ -4,14 +4,16 @@ extension ContextMenuVC { final class EmojiReactsView: UIView { private let emoji: String private let dismiss: () -> Void + private let work: () -> Void // MARK: Settings private static let size: CGFloat = 40 // MARK: Lifecycle - init(for emoji: String, dismiss: @escaping () -> Void) { + init(for emoji: String, dismiss: @escaping () -> Void, work: @escaping () -> Void) { self.emoji = emoji self.dismiss = dismiss + self.work = work super.init(frame: CGRect.zero) setUpViewHierarchy() } @@ -38,20 +40,23 @@ extension ContextMenuVC { // MARK: Interaction @objc private func handleTap() { + work() dismiss() } } final class EmojiPlusButton: UIView { private let dismiss: () -> Void + private let work: () -> Void // MARK: Settings public static let size: CGFloat = 28 private let iconSize: CGFloat = 14 // MARK: Lifecycle - init(dismiss: @escaping () -> Void) { + init(dismiss: @escaping () -> Void, work: @escaping () -> Void) { self.dismiss = dismiss + self.work = work super.init(frame: CGRect.zero) setUpViewHierarchy() } @@ -84,6 +89,7 @@ extension ContextMenuVC { // MARK: Interaction @objc private func handleTap() { dismiss() + work() } } diff --git a/Session/Conversations/Context Menu/ContextMenuVC.swift b/Session/Conversations/Context Menu/ContextMenuVC.swift index d1d7a2dd2..7aee8bdc5 100644 --- a/Session/Conversations/Context Menu/ContextMenuVC.swift +++ b/Session/Conversations/Context Menu/ContextMenuVC.swift @@ -20,7 +20,7 @@ final class ContextMenuVC : UIViewController { }() 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(.height, to: EmojiPlusButton.size) 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.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) emojiBarStackView.axis = .horizontal emojiBarStackView.spacing = Values.smallSpacing diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index bffe01694..eb1208b39 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -819,6 +819,16 @@ extension ConversationVC : InputViewDelegate, MessageCellDelegate, ContextMenuAc 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() { recoverInputView() } diff --git a/SessionUtilitiesKit/General/SNUserDefaults.swift b/SessionUtilitiesKit/General/SNUserDefaults.swift index 351c64cfc..6288744db 100644 --- a/SessionUtilitiesKit/General/SNUserDefaults.swift +++ b/SessionUtilitiesKit/General/SNUserDefaults.swift @@ -33,6 +33,10 @@ public enum SNUserDefaults { public enum String : Swift.String { case deviceToken } + + public enum Array : Swift.String { + case recentlyUsedEmojis + } } public extension UserDefaults { @@ -61,4 +65,29 @@ public extension UserDefaults { get { return self.string(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 + } }