Use shared emoji, reactions and sticker lists in chat

This commit is contained in:
Ali
2023-02-03 20:38:27 +01:00
parent 852c138655
commit 2249261b86
3 changed files with 239 additions and 59 deletions

View File

@@ -175,6 +175,72 @@ public final class AccountContextImpl: AccountContext {
private var animatedEmojiStickersDisposable: Disposable?
public private(set) var animatedEmojiStickers: [String: [StickerPackItem]] = [:]
private let animatedEmojiStickersValue = Promise<[String: [StickerPackItem]]>()
public var animatedEmojiStickersSignal: Signal<[String: [StickerPackItem]], NoError> {
return self.animatedEmojiStickersValue.get()
}
private var additionalAnimatedEmojiStickersValue: Promise<[String: [Int: StickerPackItem]]>?
public var additionalAnimatedEmojiStickers: Signal<[String: [Int: StickerPackItem]], NoError> {
let additionalAnimatedEmojiStickersValue: Promise<[String: [Int: StickerPackItem]]>
if let current = self.additionalAnimatedEmojiStickersValue {
additionalAnimatedEmojiStickersValue = current
} else {
additionalAnimatedEmojiStickersValue = Promise<[String: [Int: StickerPackItem]]>()
self.additionalAnimatedEmojiStickersValue = additionalAnimatedEmojiStickersValue
additionalAnimatedEmojiStickersValue.set(self.engine.stickers.loadedStickerPack(reference: .animatedEmojiAnimations, forceActualized: false)
|> map { animatedEmoji -> [String: [Int: StickerPackItem]] in
let sequence = "0⃣1⃣2⃣3⃣4⃣5⃣6⃣7⃣8⃣9".strippedEmoji
var animatedEmojiStickers: [String: [Int: StickerPackItem]] = [:]
switch animatedEmoji {
case let .result(_, items, _):
for item in items {
let indexKeys = item.getStringRepresentationsOfIndexKeys()
if indexKeys.count > 1, let first = indexKeys.first, let last = indexKeys.last {
let emoji: String?
let indexEmoji: String?
if sequence.contains(first.strippedEmoji) {
emoji = last
indexEmoji = first
} else if sequence.contains(last.strippedEmoji) {
emoji = first
indexEmoji = last
} else {
emoji = nil
indexEmoji = nil
}
if let emoji = emoji?.strippedEmoji, let indexEmoji = indexEmoji?.strippedEmoji.first, let strIndex = sequence.firstIndex(of: indexEmoji) {
let index = sequence.distance(from: sequence.startIndex, to: strIndex)
if animatedEmojiStickers[emoji] != nil {
animatedEmojiStickers[emoji]![index] = item
} else {
animatedEmojiStickers[emoji] = [index: item]
}
}
}
}
default:
break
}
return animatedEmojiStickers
})
}
return additionalAnimatedEmojiStickersValue.get()
}
private var availableReactionsValue: Promise<AvailableReactions?>?
public var availableReactions: Signal<AvailableReactions?, NoError> {
let availableReactionsValue: Promise<AvailableReactions?>
if let current = self.availableReactionsValue {
availableReactionsValue = current
} else {
availableReactionsValue = Promise<AvailableReactions?>()
self.availableReactionsValue = availableReactionsValue
availableReactionsValue.set(self.engine.stickers.availableReactions())
}
return availableReactionsValue.get()
}
private var userLimitsConfigurationDisposable: Disposable?
public private(set) var userLimits: EngineConfiguration.UserLimits
@@ -311,6 +377,7 @@ public final class AccountContextImpl: AccountContext {
return
}
strongSelf.animatedEmojiStickers = stickers
strongSelf.animatedEmojiStickersValue.set(.single(stickers))
})
self.userLimitsConfigurationDisposable = (self.account.postbox.peerView(id: self.account.peerId)