Files
Swiftgram/submodules/TelegramUI/Sources/ChatControllerDisplayDiceTooltip.swift
Ilya Laktyushin 54ec998186 Various fixes
2025-12-27 21:50:29 +04:00

125 lines
6.0 KiB
Swift

import Foundation
import AccountContext
import Postbox
import TelegramCore
import SwiftSignalKit
import Display
import TelegramPresentationData
import PresentationDataUtils
import UndoUI
import EmojiGameStakeScreen
import ChatPresentationInterfaceState
import TelegramStringFormatting
extension ChatControllerImpl {
func presentEmojiGameStake() {
let _ = (self.context.engine.data.get(TelegramEngine.EngineData.Item.Configuration.EmojiGame())
|> deliverOnMainQueue).start(next: { [weak self] gameInfo in
guard let self, case let .available(info) = gameInfo else {
return
}
let controller = EmojiGameStakeScreen(
context: self.context,
gameInfo: info,
completion: { [weak self] stake in
guard let self else {
return
}
self.presentPaidMessageAlertIfNeeded(completion: { [weak self] postpone in
guard let self else {
return
}
self.sendMessages([.message(text: "", attributes: [], inlineStickers: [:], mediaReference: AnyMediaReference.standalone(media: TelegramMediaDice(emoji: "🎲", tonAmount: stake.value > 0 ? stake.value : nil)), threadId: self.chatLocation.threadId, replyToMessageId: nil, replyToStoryId: nil, localGroupingKey: nil, correlationId: nil, bubbleUpEmojiOrStickersets: [])], postpone: postpone)
})
}
)
self.push(controller)
})
}
func displayDiceTooltip(dice: TelegramMediaDice) {
guard let _ = dice.value else {
return
}
self.window?.forEachController({ controller in
if let controller = controller as? UndoOverlayController {
controller.dismissWithCommitAction()
}
})
self.forEachController({ controller in
if let controller = controller as? UndoOverlayController {
controller.dismissWithCommitAction()
}
return true
})
let emoji = dice.emoji.strippedEmoji
let _ = (self.context.engine.data.get(TelegramEngine.EngineData.Item.Configuration.EmojiGame())
|> deliverOnMainQueue).start(next: { [weak self] gameInfo in
guard let self else {
return
}
let canSendMessages = canSendMessagesToChat(self.presentationInterfaceState)
let value: String?
var changeAction: String?
var tonAmount: Int64?
if canSendMessages, emoji == "🎲", case let .available(info) = gameInfo {
let currentStake = info.previousStake
value = "\(self.presentationData.strings.Conversation_Dice_Stake) $ \(formatTonAmountText(currentStake, dateTimeFormat: self.presentationData.dateTimeFormat))"
changeAction = self.presentationData.strings.Conversation_Dice_Change
tonAmount = info.previousStake
} else {
switch emoji {
case "🎲":
value = self.presentationData.strings.Conversation_Dice_u1F3B2
case "🎯":
value = self.presentationData.strings.Conversation_Dice_u1F3AF
case "🏀":
value = self.presentationData.strings.Conversation_Dice_u1F3C0
case "":
value = self.presentationData.strings.Conversation_Dice_u26BD
case "🎰":
value = self.presentationData.strings.Conversation_Dice_u1F3B0
case "🎳":
value = self.presentationData.strings.Conversation_Dice_u1F3B3
default:
let emojiHex = emoji.unicodeScalars.map({ String(format:"%02x", $0.value) }).joined().uppercased()
let key = "Conversation.Dice.u\(emojiHex)"
if let string = self.presentationData.strings.primaryComponent.dict[key] {
value = string
} else if let string = self.presentationData.strings.secondaryComponent?.dict[key] {
value = string
} else {
value = nil
}
}
}
if let value = value {
self.present(UndoOverlayController(presentationData: self.presentationData, content: .dice(dice: dice, context: self.context, text: value, action: canSendMessages ? self.presentationData.strings.Conversation_SendDice : nil, changeAction: changeAction), elevatedLayout: false, action: { [weak self] action in
if let self, canSendMessagesToChat(self.presentationInterfaceState) {
switch action {
case .undo:
self.presentPaidMessageAlertIfNeeded(completion: { [weak self] postpone in
guard let self else {
return
}
self.sendMessages([.message(text: "", attributes: [], inlineStickers: [:], mediaReference: AnyMediaReference.standalone(media: TelegramMediaDice(emoji: dice.emoji, tonAmount: tonAmount)), threadId: self.chatLocation.threadId, replyToMessageId: nil, replyToStoryId: nil, localGroupingKey: nil, correlationId: nil, bubbleUpEmojiOrStickersets: [])], postpone: postpone)
})
case .info:
if let _ = changeAction {
self.presentEmojiGameStake()
}
default:
break
}
}
return false
}), in: .current)
}
})
}
}