Implement frequency tracking for frequently used emojis

This commit is contained in:
Stefan Ceriu 2024-12-16 17:42:33 +02:00 committed by Stefan Ceriu
parent e04c87445e
commit 60e94120cc
3 changed files with 23 additions and 6 deletions

View File

@ -232,7 +232,7 @@ final class AppSettings {
@UserPreference(key: UserDefaultsKeys.hasRunIdentityConfirmationOnboarding, defaultValue: false, storageType: .userDefaults(store))
var hasRunIdentityConfirmationOnboarding
@UserPreference(key: UserDefaultsKeys.frequentlyUsedSystemEmojis, defaultValue: [String](), storageType: .userDefaults(store))
@UserPreference(key: UserDefaultsKeys.frequentlyUsedSystemEmojis, defaultValue: [FrequentlyUsedEmoji](), storageType: .userDefaults(store))
var frequentlyUsedSystemEmojis
// MARK: - Home Screen

View File

@ -7,7 +7,6 @@
import Emojibase
import Foundation
import OrderedCollections
class EmojiProvider: EmojiProviderProtocol {
private let maxFrequentEmojis = 20
@ -61,7 +60,7 @@ class EmojiProvider: EmojiProviderProtocol {
return []
}
return appSettings.frequentlyUsedSystemEmojis
return appSettings.frequentlyUsedSystemEmojis.map(\.key)
}
func markEmojiAsFrequentlyUsed(_ emoji: String) {
@ -69,10 +68,19 @@ class EmojiProvider: EmojiProviderProtocol {
return
}
var uniqueOrderedRecents = OrderedSet(appSettings.frequentlyUsedSystemEmojis)
uniqueOrderedRecents.insert(emoji, at: 0)
let frequentlyUsed = if !frequentlyUsedSystemEmojis().contains(emoji) {
appSettings.frequentlyUsedSystemEmojis + [.init(count: 0, key: emoji)]
} else {
appSettings.frequentlyUsedSystemEmojis.map { frequentlyUsedEmoji in
if frequentlyUsedEmoji.key == emoji {
return FrequentlyUsedEmoji(count: frequentlyUsedEmoji.count + 1, key: emoji)
}
return frequentlyUsedEmoji
}
}
appSettings.frequentlyUsedSystemEmojis = Array(uniqueOrderedRecents)
appSettings.frequentlyUsedSystemEmojis = frequentlyUsed.sorted { $0.count > $1.count }
}
// MARK: - Private

View File

@ -31,6 +31,15 @@ enum EmojiProviderState {
case loaded([EmojiCategory])
}
struct FrequentlyUsedEmoji: Codable, Hashable {
let count: UInt
let key: String
static func == (lhs: FrequentlyUsedEmoji, rhs: FrequentlyUsedEmoji) -> Bool {
lhs.key == rhs.key
}
}
@MainActor
protocol EmojiProviderProtocol {
var state: EmojiProviderState { get }