mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-15 21:45:19 +00:00
Merge branch 'master' into modern-build-scripts
This commit is contained in:
commit
1965e01680
@ -177,7 +177,7 @@ private final class ChatListShimmerNode: ASDisplayNode {
|
|||||||
|
|
||||||
let chatListPresentationData = ChatListPresentationData(theme: presentationData.theme, fontSize: presentationData.chatFontSize, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, nameSortOrder: presentationData.nameSortOrder, nameDisplayOrder: presentationData.nameDisplayOrder, disableAnimations: true)
|
let chatListPresentationData = ChatListPresentationData(theme: presentationData.theme, fontSize: presentationData.chatFontSize, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, nameSortOrder: presentationData.nameSortOrder, nameDisplayOrder: presentationData.nameDisplayOrder, disableAnimations: true)
|
||||||
|
|
||||||
let peer1: EnginePeer = .user(TelegramUser(id: EnginePeer.Id(namespace: Namespaces.Peer.CloudUser, id: EnginePeer.Id.Id._internalFromInt64Value(0)), accessHash: nil, firstName: "FirstName", lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let peer1: EnginePeer = .user(TelegramUser(id: EnginePeer.Id(namespace: Namespaces.Peer.CloudUser, id: EnginePeer.Id.Id._internalFromInt64Value(0)), accessHash: nil, firstName: "FirstName", lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
let timestamp1: Int32 = 100000
|
let timestamp1: Int32 = 100000
|
||||||
let peers: [EnginePeer.Id: EnginePeer] = [:]
|
let peers: [EnginePeer.Id: EnginePeer] = [:]
|
||||||
let interaction = ChatListNodeInteraction(context: context, activateSearch: {}, peerSelected: { _, _, _ in }, disabledPeerSelected: { _ in }, togglePeerSelected: { _ in }, togglePeersSelection: { _, _ in }, additionalCategorySelected: { _ in
|
let interaction = ChatListNodeInteraction(context: context, activateSearch: {}, peerSelected: { _, _, _ in }, disabledPeerSelected: { _ in }, togglePeerSelected: { _ in }, togglePeersSelection: { _, _ in }, additionalCategorySelected: { _ in
|
||||||
|
@ -2920,7 +2920,7 @@ private final class ChatListSearchShimmerNode: ASDisplayNode {
|
|||||||
|
|
||||||
let chatListPresentationData = ChatListPresentationData(theme: presentationData.theme, fontSize: presentationData.chatFontSize, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, nameSortOrder: presentationData.nameSortOrder, nameDisplayOrder: presentationData.nameDisplayOrder, disableAnimations: true)
|
let chatListPresentationData = ChatListPresentationData(theme: presentationData.theme, fontSize: presentationData.chatFontSize, strings: presentationData.strings, dateTimeFormat: presentationData.dateTimeFormat, nameSortOrder: presentationData.nameSortOrder, nameDisplayOrder: presentationData.nameDisplayOrder, disableAnimations: true)
|
||||||
|
|
||||||
let peer1: EnginePeer = .user(TelegramUser(id: EnginePeer.Id(namespace: Namespaces.Peer.CloudUser, id: EnginePeer.Id.Id._internalFromInt64Value(0)), accessHash: nil, firstName: "FirstName", lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let peer1: EnginePeer = .user(TelegramUser(id: EnginePeer.Id(namespace: Namespaces.Peer.CloudUser, id: EnginePeer.Id.Id._internalFromInt64Value(0)), accessHash: nil, firstName: "FirstName", lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
let timestamp1: Int32 = 100000
|
let timestamp1: Int32 = 100000
|
||||||
var peers: [EnginePeer.Id: EnginePeer] = [:]
|
var peers: [EnginePeer.Id: EnginePeer] = [:]
|
||||||
peers[peer1.id] = peer1
|
peers[peer1.id] = peer1
|
||||||
|
@ -1517,7 +1517,10 @@ class ChatListItemNode: ItemListRevealOptionsItemNode {
|
|||||||
switch item.content {
|
switch item.content {
|
||||||
case let .peer(messages, _, _, _, _, _, _, _, _, _, _, _, _):
|
case let .peer(messages, _, _, _, _, _, _, _, _, _, _, _, _):
|
||||||
if let peer = messages.last?.author {
|
if let peer = messages.last?.author {
|
||||||
if peer.isScam {
|
if case let .user(user) = peer, let emojiStatus = user.emojiStatus {
|
||||||
|
currentCredibilityIconImage = PresentationResourcesChatList.premiumIcon(item.presentationData.theme)
|
||||||
|
currentCredibilityIconContent = .emojiStatus(status: emojiStatus, placeholderColor: item.presentationData.theme.list.mediaPlaceholderColor)
|
||||||
|
} else if peer.isScam {
|
||||||
currentCredibilityIconImage = PresentationResourcesChatList.scamIcon(item.presentationData.theme, strings: item.presentationData.strings, type: .regular)
|
currentCredibilityIconImage = PresentationResourcesChatList.scamIcon(item.presentationData.theme, strings: item.presentationData.strings, type: .regular)
|
||||||
currentCredibilityIconContent = .scam(color: item.presentationData.theme.chat.message.incoming.scamColor)
|
currentCredibilityIconContent = .scam(color: item.presentationData.theme.chat.message.incoming.scamColor)
|
||||||
} else if peer.isFake {
|
} else if peer.isFake {
|
||||||
@ -1528,19 +1531,17 @@ class ChatListItemNode: ItemListRevealOptionsItemNode {
|
|||||||
currentCredibilityIconContent = .verified(fillColor: item.presentationData.theme.list.itemCheckColors.fillColor, foregroundColor: item.presentationData.theme.list.itemCheckColors.foregroundColor)
|
currentCredibilityIconContent = .verified(fillColor: item.presentationData.theme.list.itemCheckColors.fillColor, foregroundColor: item.presentationData.theme.list.itemCheckColors.foregroundColor)
|
||||||
} else if peer.isPremium && !premiumConfiguration.isPremiumDisabled {
|
} else if peer.isPremium && !premiumConfiguration.isPremiumDisabled {
|
||||||
currentCredibilityIconImage = PresentationResourcesChatList.premiumIcon(item.presentationData.theme)
|
currentCredibilityIconImage = PresentationResourcesChatList.premiumIcon(item.presentationData.theme)
|
||||||
|
currentCredibilityIconContent = .premium(color: item.presentationData.theme.list.itemAccentColor)
|
||||||
if "".isEmpty {
|
|
||||||
currentCredibilityIconContent = .emojiStatus(status: PeerEmojiStatus(fileId: 5431449001532594346), placeholderColor: item.presentationData.theme.list.mediaPlaceholderColor)
|
|
||||||
} else {
|
|
||||||
currentCredibilityIconContent = .premium(color: item.presentationData.theme.list.itemAccentColor)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
} else if case let .chat(itemPeer) = contentPeer, let peer = itemPeer.chatMainPeer {
|
} else if case let .chat(itemPeer) = contentPeer, let peer = itemPeer.chatMainPeer {
|
||||||
if peer.isScam {
|
if case let .user(user) = peer, let emojiStatus = user.emojiStatus {
|
||||||
|
currentCredibilityIconImage = PresentationResourcesChatList.premiumIcon(item.presentationData.theme)
|
||||||
|
currentCredibilityIconContent = .emojiStatus(status: emojiStatus, placeholderColor: item.presentationData.theme.list.mediaPlaceholderColor)
|
||||||
|
} else if peer.isScam {
|
||||||
currentCredibilityIconImage = PresentationResourcesChatList.scamIcon(item.presentationData.theme, strings: item.presentationData.strings, type: .regular)
|
currentCredibilityIconImage = PresentationResourcesChatList.scamIcon(item.presentationData.theme, strings: item.presentationData.strings, type: .regular)
|
||||||
currentCredibilityIconContent = .scam(color: item.presentationData.theme.chat.message.incoming.scamColor)
|
currentCredibilityIconContent = .scam(color: item.presentationData.theme.chat.message.incoming.scamColor)
|
||||||
} else if peer.isFake {
|
} else if peer.isFake {
|
||||||
@ -1551,12 +1552,7 @@ class ChatListItemNode: ItemListRevealOptionsItemNode {
|
|||||||
currentCredibilityIconContent = .verified(fillColor: item.presentationData.theme.list.itemCheckColors.fillColor, foregroundColor: item.presentationData.theme.list.itemCheckColors.foregroundColor)
|
currentCredibilityIconContent = .verified(fillColor: item.presentationData.theme.list.itemCheckColors.fillColor, foregroundColor: item.presentationData.theme.list.itemCheckColors.foregroundColor)
|
||||||
} else if peer.isPremium && !premiumConfiguration.isPremiumDisabled {
|
} else if peer.isPremium && !premiumConfiguration.isPremiumDisabled {
|
||||||
currentCredibilityIconImage = PresentationResourcesChatList.premiumIcon(item.presentationData.theme)
|
currentCredibilityIconImage = PresentationResourcesChatList.premiumIcon(item.presentationData.theme)
|
||||||
|
currentCredibilityIconContent = .premium(color: item.presentationData.theme.list.itemAccentColor)
|
||||||
if "".isEmpty {
|
|
||||||
currentCredibilityIconContent = .emojiStatus(status: PeerEmojiStatus(fileId: 5431449001532594346), placeholderColor: item.presentationData.theme.list.mediaPlaceholderColor)
|
|
||||||
} else {
|
|
||||||
currentCredibilityIconContent = .premium(color: item.presentationData.theme.list.itemAccentColor)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2356,7 +2352,10 @@ class ChatListItemNode: ItemListRevealOptionsItemNode {
|
|||||||
|
|
||||||
var nextTitleIconOrigin: CGFloat = contentRect.origin.x + titleFrame.size.width + 3.0 + titleOffset
|
var nextTitleIconOrigin: CGFloat = contentRect.origin.x + titleFrame.size.width + 3.0 + titleOffset
|
||||||
|
|
||||||
if let credibilityIconNode = self.credibilityIconNode {
|
if let credibilityIconView = self.credibilityIconView {
|
||||||
|
transition.updateFrame(view: credibilityIconView, frame: CGRect(origin: CGPoint(x: nextTitleIconOrigin, y: credibilityIconView.frame.origin.y), size: credibilityIconView.bounds.size))
|
||||||
|
nextTitleIconOrigin += credibilityIconView.bounds.size.width + 5.0
|
||||||
|
} else if let credibilityIconNode = self.credibilityIconNode {
|
||||||
transition.updateFrame(node: credibilityIconNode, frame: CGRect(origin: CGPoint(x: nextTitleIconOrigin, y: credibilityIconNode.frame.origin.y), size: credibilityIconNode.bounds.size))
|
transition.updateFrame(node: credibilityIconNode, frame: CGRect(origin: CGPoint(x: nextTitleIconOrigin, y: credibilityIconNode.frame.origin.y), size: credibilityIconNode.bounds.size))
|
||||||
nextTitleIconOrigin += credibilityIconNode.bounds.size.width + 5.0
|
nextTitleIconOrigin += credibilityIconNode.bounds.size.width + 5.0
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,7 @@ private enum InviteContactsEntry: Comparable, Identifiable {
|
|||||||
} else {
|
} else {
|
||||||
status = .none
|
status = .none
|
||||||
}
|
}
|
||||||
let peer: EnginePeer = .user(TelegramUser(id: EnginePeer.Id(namespace: .max, id: EnginePeer.Id.Id._internalFromInt64Value(0)), accessHash: nil, firstName: contact.firstName, lastName: contact.lastName, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let peer: EnginePeer = .user(TelegramUser(id: EnginePeer.Id(namespace: .max, id: EnginePeer.Id.Id._internalFromInt64Value(0)), accessHash: nil, firstName: contact.firstName, lastName: contact.lastName, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
return ContactsPeerItem(presentationData: ItemListPresentationData(presentationData), sortOrder: nameSortOrder, displayOrder: nameDisplayOrder, context: context, peerMode: .peer, peer: .peer(peer: peer, chatPeer: peer), status: status, enabled: true, selection: selection, editing: ContactsPeerItemEditing(editable: false, editing: false, revealed: false), index: nil, header: ChatListSearchItemHeader(type: .contacts, theme: theme, strings: strings, actionTitle: nil, action: nil), action: { _ in
|
return ContactsPeerItem(presentationData: ItemListPresentationData(presentationData), sortOrder: nameSortOrder, displayOrder: nameDisplayOrder, context: context, peerMode: .peer, peer: .peer(peer: peer, chatPeer: peer), status: status, enabled: true, selection: selection, editing: ContactsPeerItemEditing(editable: false, editing: false, revealed: false), index: nil, header: ChatListSearchItemHeader(type: .contacts, theme: theme, strings: strings, actionTitle: nil, action: nil), action: { _ in
|
||||||
interaction.toggleContact(id)
|
interaction.toggleContact(id)
|
||||||
})
|
})
|
||||||
|
@ -4,8 +4,8 @@ import UIKitRuntimeUtils
|
|||||||
public class PortalView {
|
public class PortalView {
|
||||||
public let view: UIView & UIKitPortalViewProtocol
|
public let view: UIView & UIKitPortalViewProtocol
|
||||||
|
|
||||||
public init?() {
|
public init?(matchPosition: Bool = true) {
|
||||||
guard let view = makePortalView() else {
|
guard let view = makePortalView(matchPosition) else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
self.view = view
|
self.view = view
|
||||||
|
@ -1364,7 +1364,7 @@ final class InstantPageControllerNode: ASDisplayNode, UIScrollViewDelegate {
|
|||||||
}, openUrl: { _ in }, openPeer: { _ in
|
}, openUrl: { _ in }, openPeer: { _ in
|
||||||
}, showAll: false)
|
}, showAll: false)
|
||||||
|
|
||||||
let peer = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(0)), accessHash: nil, firstName: "", lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [])
|
let peer = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(0)), accessHash: nil, firstName: "", lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
let message = Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer.id, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, threadId: nil, timestamp: 0, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer, text: "", attributes: [], media: [map], peers: SimpleDictionary(), associatedMessages: SimpleDictionary(), associatedMessageIds: [], associatedMedia: [:])
|
let message = Message(stableId: 0, stableVersion: 0, id: MessageId(peerId: peer.id, namespace: 0, id: 0), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, threadId: nil, timestamp: 0, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peer, text: "", attributes: [], media: [map], peers: SimpleDictionary(), associatedMessages: SimpleDictionary(), associatedMessageIds: [], associatedMedia: [:])
|
||||||
|
|
||||||
let controller = LocationViewController(context: self.context, subject: message, params: controllerParams)
|
let controller = LocationViewController(context: self.context, subject: message, params: controllerParams)
|
||||||
|
@ -690,7 +690,7 @@ public final class InviteLinkViewController: ViewController {
|
|||||||
if requestsState.importers.isEmpty && requestsState.isLoadingMore {
|
if requestsState.importers.isEmpty && requestsState.isLoadingMore {
|
||||||
count = min(4, state.count)
|
count = min(4, state.count)
|
||||||
loading = true
|
loading = true
|
||||||
let fakeUser = TelegramUser(id: EnginePeer.Id(namespace: .max, id: EnginePeer.Id.Id._internalFromInt64Value(0)), accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [])
|
let fakeUser = TelegramUser(id: EnginePeer.Id(namespace: .max, id: EnginePeer.Id.Id._internalFromInt64Value(0)), accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
for i in 0 ..< count {
|
for i in 0 ..< count {
|
||||||
entries.append(.request(Int32(i), presentationData.theme, presentationData.dateTimeFormat, EnginePeer.user(fakeUser), 0, true))
|
entries.append(.request(Int32(i), presentationData.theme, presentationData.dateTimeFormat, EnginePeer.user(fakeUser), 0, true))
|
||||||
}
|
}
|
||||||
@ -724,7 +724,7 @@ public final class InviteLinkViewController: ViewController {
|
|||||||
if state.importers.isEmpty && state.isLoadingMore {
|
if state.importers.isEmpty && state.isLoadingMore {
|
||||||
count = min(4, state.count)
|
count = min(4, state.count)
|
||||||
loading = true
|
loading = true
|
||||||
let fakeUser = TelegramUser(id: EnginePeer.Id(namespace: .max, id: EnginePeer.Id.Id._internalFromInt64Value(0)), accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [])
|
let fakeUser = TelegramUser(id: EnginePeer.Id(namespace: .max, id: EnginePeer.Id.Id._internalFromInt64Value(0)), accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
for i in 0 ..< count {
|
for i in 0 ..< count {
|
||||||
entries.append(.importer(Int32(i), presentationData.theme, presentationData.dateTimeFormat, EnginePeer.user(fakeUser), 0, true))
|
entries.append(.importer(Int32(i), presentationData.theme, presentationData.dateTimeFormat, EnginePeer.user(fakeUser), 0, true))
|
||||||
}
|
}
|
||||||
|
@ -728,7 +728,7 @@ final class MediaPickerSelectedListNode: ASDisplayNode, UIScrollViewDelegate, UI
|
|||||||
|
|
||||||
let peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(1))
|
let peerId = PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(1))
|
||||||
var peers = SimpleDictionary<PeerId, Peer>()
|
var peers = SimpleDictionary<PeerId, Peer>()
|
||||||
peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [])
|
peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
|
|
||||||
let previewText = groupLayouts.count > 1 ? presentationData.strings.Attachment_MessagesPreview : presentationData.strings.Attachment_MessagePreview
|
let previewText = groupLayouts.count > 1 ? presentationData.strings.Attachment_MessagesPreview : presentationData.strings.Attachment_MessagePreview
|
||||||
|
|
||||||
|
@ -733,7 +733,7 @@ static void copyKeychainKey(NSString * _Nonnull group, NSString * _Nonnull key,
|
|||||||
|
|
||||||
for (id<MTContextChangeListener> listener in currentListeners) {
|
for (id<MTContextChangeListener> listener in currentListeners) {
|
||||||
if ([listener respondsToSelector:@selector(contextDatacenterTransportSchemesUpdated:datacenterId:shouldReset:)])
|
if ([listener respondsToSelector:@selector(contextDatacenterTransportSchemesUpdated:datacenterId:shouldReset:)])
|
||||||
[listener contextDatacenterTransportSchemesUpdated:self datacenterId:datacenterId shouldReset:true];
|
[listener contextDatacenterTransportSchemesUpdated:self datacenterId:datacenterId shouldReset:false];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}];
|
}];
|
||||||
|
@ -2575,9 +2575,11 @@ static bool isDataEqualToDataConstTime(NSData *data1, NSData *data2) {
|
|||||||
resolvedShouldReset = true;
|
resolvedShouldReset = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (resolvedShouldReset) {
|
if ((_mtState & MTProtoStateAwaitingDatacenterAuthorization) == 0 && (_mtState & MTProtoStatePaused) == 0) {
|
||||||
[self resetTransport];
|
if (resolvedShouldReset) {
|
||||||
[self requestTransportTransaction];
|
[self resetTransport];
|
||||||
|
[self requestTransportTransaction];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}];
|
}];
|
||||||
|
@ -652,7 +652,7 @@ private func deviceContactInfoEntries(account: Account, engine: TelegramEngine,
|
|||||||
firstName = presentationData.strings.Message_Contact
|
firstName = presentationData.strings.Message_Contact
|
||||||
}
|
}
|
||||||
|
|
||||||
entries.append(.info(entries.count, presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, peer: peer ?? TelegramUser(id: PeerId(namespace: .max, id: PeerId.Id._internalFromInt64Value(0)), accessHash: nil, firstName: firstName, lastName: isOrganization ? nil : personName.1, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []), state: ItemListAvatarAndNameInfoItemState(editingName: editingName, updatingName: nil), job: isOrganization ? nil : jobSummary, isPlain: !isShare))
|
entries.append(.info(entries.count, presentationData.theme, presentationData.strings, presentationData.dateTimeFormat, peer: peer ?? TelegramUser(id: PeerId(namespace: .max, id: PeerId.Id._internalFromInt64Value(0)), accessHash: nil, firstName: firstName, lastName: isOrganization ? nil : personName.1, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil), state: ItemListAvatarAndNameInfoItemState(editingName: editingName, updatingName: nil), job: isOrganization ? nil : jobSummary, isPlain: !isShare))
|
||||||
|
|
||||||
if !selecting {
|
if !selecting {
|
||||||
if let _ = peer {
|
if let _ = peer {
|
||||||
|
@ -163,8 +163,8 @@ private final class BubbleSettingsControllerNode: ASDisplayNode, UIScrollViewDel
|
|||||||
let otherPeerId = self.context.account.peerId
|
let otherPeerId = self.context.account.peerId
|
||||||
var peers = SimpleDictionary<PeerId, Peer>()
|
var peers = SimpleDictionary<PeerId, Peer>()
|
||||||
var messages = SimpleDictionary<MessageId, Message>()
|
var messages = SimpleDictionary<MessageId, Message>()
|
||||||
peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [])
|
peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
peers[otherPeerId] = TelegramUser(id: otherPeerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [])
|
peers[otherPeerId] = TelegramUser(id: otherPeerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
|
|
||||||
let replyMessageId = MessageId(peerId: peerId, namespace: 0, id: 3)
|
let replyMessageId = MessageId(peerId: peerId, namespace: 0, id: 3)
|
||||||
messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, threadId: nil, timestamp: 66000, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: [], associatedMedia: [:])
|
messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, threadId: nil, timestamp: 66000, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: [], associatedMedia: [:])
|
||||||
|
@ -145,7 +145,7 @@ class ForwardPrivacyChatPreviewItemNode: ListViewItemNode {
|
|||||||
var peers = SimpleDictionary<PeerId, Peer>()
|
var peers = SimpleDictionary<PeerId, Peer>()
|
||||||
let messages = SimpleDictionary<MessageId, Message>()
|
let messages = SimpleDictionary<MessageId, Message>()
|
||||||
|
|
||||||
peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: item.peerName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [])
|
peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: item.peerName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
|
|
||||||
let forwardInfo = MessageForwardInfo(author: item.linkEnabled ? peers[peerId] : nil, source: nil, sourceMessageId: nil, date: 0, authorSignature: item.linkEnabled ? nil : item.peerName, psaType: nil, flags: [])
|
let forwardInfo = MessageForwardInfo(author: item.linkEnabled ? peers[peerId] : nil, source: nil, sourceMessageId: nil, date: 0, authorSignature: item.linkEnabled ? nil : item.peerName, psaType: nil, flags: [])
|
||||||
|
|
||||||
|
@ -218,7 +218,7 @@ class ReactionChatPreviewItemNode: ListViewItemNode {
|
|||||||
var peers = SimpleDictionary<PeerId, Peer>()
|
var peers = SimpleDictionary<PeerId, Peer>()
|
||||||
let messages = SimpleDictionary<MessageId, Message>()
|
let messages = SimpleDictionary<MessageId, Message>()
|
||||||
|
|
||||||
peers[userPeerId] = TelegramUser(id: userPeerId, accessHash: nil, firstName: item.strings.Settings_QuickReactionSetup_DemoMessageAuthor, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [])
|
peers[userPeerId] = TelegramUser(id: userPeerId, accessHash: nil, firstName: item.strings.Settings_QuickReactionSetup_DemoMessageAuthor, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
|
|
||||||
let messageText = item.strings.Settings_QuickReactionSetup_DemoMessageText
|
let messageText = item.strings.Settings_QuickReactionSetup_DemoMessageText
|
||||||
|
|
||||||
|
@ -285,14 +285,14 @@ private final class TextSizeSelectionControllerNode: ASDisplayNode, UIScrollView
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
let selfPeer: EnginePeer = .user(TelegramUser(id: self.context.account.peerId, accessHash: nil, firstName: nil, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let selfPeer: EnginePeer = .user(TelegramUser(id: self.context.account.peerId, accessHash: nil, firstName: nil, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
let peer1: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(1)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let peer1: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(1)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
let peer2: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(2)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_2_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let peer2: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(2)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_2_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
let peer3: EnginePeer = .channel(TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: PeerId.Id._internalFromInt64Value(3)), accessHash: nil, title: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_Name, username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .member, info: .group(.init(flags: [])), flags: [], restrictionInfo: nil, adminRights: nil, bannedRights: nil, defaultBannedRights: nil))
|
let peer3: EnginePeer = .channel(TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: PeerId.Id._internalFromInt64Value(3)), accessHash: nil, title: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_Name, username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .member, info: .group(.init(flags: [])), flags: [], restrictionInfo: nil, adminRights: nil, bannedRights: nil, defaultBannedRights: nil))
|
||||||
let peer3Author: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(4)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_AuthorName, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let peer3Author: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(4)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_AuthorName, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
let peer4: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(4)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_4_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let peer4: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(4)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_4_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
let peer5: EnginePeer = .channel(TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: PeerId.Id._internalFromInt64Value(5)), accessHash: nil, title: self.presentationData.strings.Appearance_ThemePreview_ChatList_5_Name, username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .member, info: .broadcast(.init(flags: [])), flags: [], restrictionInfo: nil, adminRights: nil, bannedRights: nil, defaultBannedRights: nil))
|
let peer5: EnginePeer = .channel(TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: PeerId.Id._internalFromInt64Value(5)), accessHash: nil, title: self.presentationData.strings.Appearance_ThemePreview_ChatList_5_Name, username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .member, info: .broadcast(.init(flags: [])), flags: [], restrictionInfo: nil, adminRights: nil, bannedRights: nil, defaultBannedRights: nil))
|
||||||
let peer6: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.SecretChat, id: PeerId.Id._internalFromInt64Value(5)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_6_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let peer6: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.SecretChat, id: PeerId.Id._internalFromInt64Value(5)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_6_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
|
|
||||||
let timestamp = self.referenceTimestamp
|
let timestamp = self.referenceTimestamp
|
||||||
|
|
||||||
@ -408,8 +408,8 @@ private final class TextSizeSelectionControllerNode: ASDisplayNode, UIScrollView
|
|||||||
let otherPeerId = self.context.account.peerId
|
let otherPeerId = self.context.account.peerId
|
||||||
var peers = SimpleDictionary<PeerId, Peer>()
|
var peers = SimpleDictionary<PeerId, Peer>()
|
||||||
var messages = SimpleDictionary<MessageId, Message>()
|
var messages = SimpleDictionary<MessageId, Message>()
|
||||||
peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [])
|
peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
peers[otherPeerId] = TelegramUser(id: otherPeerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [])
|
peers[otherPeerId] = TelegramUser(id: otherPeerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
|
|
||||||
let replyMessageId = MessageId(peerId: peerId, namespace: 0, id: 3)
|
let replyMessageId = MessageId(peerId: peerId, namespace: 0, id: 3)
|
||||||
messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, threadId: nil, timestamp: 66000, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: [], associatedMedia: [:])
|
messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, threadId: nil, timestamp: 66000, flags: [], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[otherPeerId], text: self.presentationData.strings.Appearance_ThemePreview_Chat_1_Text, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: [], associatedMedia: [:])
|
||||||
|
@ -905,12 +905,12 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
let selfPeer: EnginePeer = .user(TelegramUser(id: self.context.account.peerId, accessHash: nil, firstName: nil, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let selfPeer: EnginePeer = .user(TelegramUser(id: self.context.account.peerId, accessHash: nil, firstName: nil, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
let peer1: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(1)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let peer1: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(1)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
let peer2: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(2)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_2_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let peer2: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(2)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_2_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
let peer3: EnginePeer = .channel(TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: PeerId.Id._internalFromInt64Value(3)), accessHash: nil, title: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_Name, username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .member, info: .group(.init(flags: [])), flags: [], restrictionInfo: nil, adminRights: nil, bannedRights: nil, defaultBannedRights: nil))
|
let peer3: EnginePeer = .channel(TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: PeerId.Id._internalFromInt64Value(3)), accessHash: nil, title: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_Name, username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .member, info: .group(.init(flags: [])), flags: [], restrictionInfo: nil, adminRights: nil, bannedRights: nil, defaultBannedRights: nil))
|
||||||
let peer3Author: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(4)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_AuthorName, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let peer3Author: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(4)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_AuthorName, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
let peer4: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(4)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_4_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let peer4: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(4)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_4_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
|
|
||||||
let timestamp = self.referenceTimestamp
|
let timestamp = self.referenceTimestamp
|
||||||
|
|
||||||
@ -998,8 +998,8 @@ final class ThemeAccentColorControllerNode: ASDisplayNode, UIScrollViewDelegate
|
|||||||
let otherPeerId = self.context.account.peerId
|
let otherPeerId = self.context.account.peerId
|
||||||
var peers = SimpleDictionary<PeerId, Peer>()
|
var peers = SimpleDictionary<PeerId, Peer>()
|
||||||
var messages = SimpleDictionary<MessageId, Message>()
|
var messages = SimpleDictionary<MessageId, Message>()
|
||||||
peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [])
|
peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
peers[otherPeerId] = TelegramUser(id: otherPeerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [])
|
peers[otherPeerId] = TelegramUser(id: otherPeerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
|
|
||||||
var sampleMessages: [Message] = []
|
var sampleMessages: [Message] = []
|
||||||
|
|
||||||
|
@ -430,15 +430,15 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate {
|
|||||||
|
|
||||||
let chatListPresentationData = ChatListPresentationData(theme: self.previewTheme, fontSize: self.presentationData.listsFontSize, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameSortOrder: self.presentationData.nameSortOrder, nameDisplayOrder: self.presentationData.nameDisplayOrder, disableAnimations: true)
|
let chatListPresentationData = ChatListPresentationData(theme: self.previewTheme, fontSize: self.presentationData.listsFontSize, strings: self.presentationData.strings, dateTimeFormat: self.presentationData.dateTimeFormat, nameSortOrder: self.presentationData.nameSortOrder, nameDisplayOrder: self.presentationData.nameDisplayOrder, disableAnimations: true)
|
||||||
|
|
||||||
let selfPeer: EnginePeer = .user(TelegramUser(id: self.context.account.peerId, accessHash: nil, firstName: nil, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let selfPeer: EnginePeer = .user(TelegramUser(id: self.context.account.peerId, accessHash: nil, firstName: nil, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
let peer1: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(1)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let peer1: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(1)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_1_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
let peer2: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(2)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_2_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let peer2: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(2)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_2_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
let peer3: EnginePeer = .channel(TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: PeerId.Id._internalFromInt64Value(3)), accessHash: nil, title: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_Name, username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .member, info: .group(.init(flags: [])), flags: [], restrictionInfo: nil, adminRights: nil, bannedRights: nil, defaultBannedRights: nil))
|
let peer3: EnginePeer = .channel(TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: PeerId.Id._internalFromInt64Value(3)), accessHash: nil, title: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_Name, username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .member, info: .group(.init(flags: [])), flags: [], restrictionInfo: nil, adminRights: nil, bannedRights: nil, defaultBannedRights: nil))
|
||||||
let peer3Author: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(4)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_AuthorName, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let peer3Author: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(4)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_3_AuthorName, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
let peer4: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(4)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_4_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let peer4: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(4)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_4_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
let peer5: EnginePeer = .channel(TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: PeerId.Id._internalFromInt64Value(5)), accessHash: nil, title: self.presentationData.strings.Appearance_ThemePreview_ChatList_5_Name, username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .member, info: .broadcast(.init(flags: [])), flags: [], restrictionInfo: nil, adminRights: nil, bannedRights: nil, defaultBannedRights: nil))
|
let peer5: EnginePeer = .channel(TelegramChannel(id: PeerId(namespace: Namespaces.Peer.CloudChannel, id: PeerId.Id._internalFromInt64Value(5)), accessHash: nil, title: self.presentationData.strings.Appearance_ThemePreview_ChatList_5_Name, username: nil, photo: [], creationDate: 0, version: 0, participationStatus: .member, info: .broadcast(.init(flags: [])), flags: [], restrictionInfo: nil, adminRights: nil, bannedRights: nil, defaultBannedRights: nil))
|
||||||
let peer6: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.SecretChat, id: PeerId.Id._internalFromInt64Value(5)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_6_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let peer6: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.SecretChat, id: PeerId.Id._internalFromInt64Value(5)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_6_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
let peer7: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(6)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_7_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []))
|
let peer7: EnginePeer = .user(TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(6)), accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_ChatList_7_Name, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil))
|
||||||
|
|
||||||
let timestamp = self.referenceTimestamp
|
let timestamp = self.referenceTimestamp
|
||||||
|
|
||||||
@ -559,8 +559,8 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate {
|
|||||||
let otherPeerId = self.context.account.peerId
|
let otherPeerId = self.context.account.peerId
|
||||||
var peers = SimpleDictionary<PeerId, Peer>()
|
var peers = SimpleDictionary<PeerId, Peer>()
|
||||||
var messages = SimpleDictionary<MessageId, Message>()
|
var messages = SimpleDictionary<MessageId, Message>()
|
||||||
peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [])
|
peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
peers[otherPeerId] = TelegramUser(id: otherPeerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [])
|
peers[otherPeerId] = TelegramUser(id: otherPeerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_ThemePreview_Chat_2_ReplyName, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
|
|
||||||
var sampleMessages: [Message] = []
|
var sampleMessages: [Message] = []
|
||||||
|
|
||||||
|
@ -155,11 +155,11 @@ class ThemeSettingsChatPreviewItemNode: ListViewItemNode {
|
|||||||
|
|
||||||
let replyMessageId = MessageId(peerId: peerId, namespace: 0, id: 3)
|
let replyMessageId = MessageId(peerId: peerId, namespace: 0, id: 3)
|
||||||
if let (author, text) = messageItem.reply {
|
if let (author, text) = messageItem.reply {
|
||||||
peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: author, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [])
|
peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: author, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, threadId: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: text, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: [], associatedMedia: [:])
|
messages[replyMessageId] = Message(stableId: 3, stableVersion: 0, id: replyMessageId, globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, threadId: nil, timestamp: 66000, flags: [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: peers[peerId], text: text, attributes: [], media: [], peers: peers, associatedMessages: SimpleDictionary(), associatedMessageIds: [], associatedMedia: [:])
|
||||||
}
|
}
|
||||||
|
|
||||||
let message = Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: messageItem.outgoing ? otherPeerId : peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, threadId: nil, timestamp: 66000, flags: messageItem.outgoing ? [] : [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: messageItem.outgoing ? TelegramUser(id: otherPeerId, accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: []) : nil, text: messageItem.text, attributes: messageItem.reply != nil ? [ReplyMessageAttribute(messageId: replyMessageId, threadMessageId: nil)] : [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: [], associatedMedia: [:])
|
let message = Message(stableId: 1, stableVersion: 0, id: MessageId(peerId: messageItem.outgoing ? otherPeerId : peerId, namespace: 0, id: 1), globallyUniqueId: nil, groupingKey: nil, groupInfo: nil, threadId: nil, timestamp: 66000, flags: messageItem.outgoing ? [] : [.Incoming], tags: [], globalTags: [], localTags: [], forwardInfo: nil, author: messageItem.outgoing ? TelegramUser(id: otherPeerId, accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil) : nil, text: messageItem.text, attributes: messageItem.reply != nil ? [ReplyMessageAttribute(messageId: replyMessageId, threadMessageId: nil)] : [], media: [], peers: peers, associatedMessages: messages, associatedMessageIds: [], associatedMedia: [:])
|
||||||
items.append(item.context.sharedContext.makeChatMessagePreviewItem(context: item.context, messages: [message], theme: item.componentTheme, strings: item.strings, wallpaper: item.wallpaper, fontSize: item.fontSize, chatBubbleCorners: item.chatBubbleCorners, dateTimeFormat: item.dateTimeFormat, nameOrder: item.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil, backgroundNode: currentBackgroundNode, availableReactions: nil, isCentered: false))
|
items.append(item.context.sharedContext.makeChatMessagePreviewItem(context: item.context, messages: [message], theme: item.componentTheme, strings: item.strings, wallpaper: item.wallpaper, fontSize: item.fontSize, chatBubbleCorners: item.chatBubbleCorners, dateTimeFormat: item.dateTimeFormat, nameOrder: item.nameDisplayOrder, forcedResourceStatus: nil, tapMessage: nil, clickThroughMessage: nil, backgroundNode: currentBackgroundNode, availableReactions: nil, isCentered: false))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1033,8 +1033,8 @@ final class WallpaperGalleryItemNode: GalleryItemNode {
|
|||||||
let otherPeerId = self.context.account.peerId
|
let otherPeerId = self.context.account.peerId
|
||||||
var peers = SimpleDictionary<PeerId, Peer>()
|
var peers = SimpleDictionary<PeerId, Peer>()
|
||||||
let messages = SimpleDictionary<MessageId, Message>()
|
let messages = SimpleDictionary<MessageId, Message>()
|
||||||
peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_PreviewReplyAuthor, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [])
|
peers[peerId] = TelegramUser(id: peerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_PreviewReplyAuthor, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
peers[otherPeerId] = TelegramUser(id: otherPeerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_PreviewReplyAuthor, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [])
|
peers[otherPeerId] = TelegramUser(id: otherPeerId, accessHash: nil, firstName: self.presentationData.strings.Appearance_PreviewReplyAuthor, lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
|
|
||||||
var topMessageText = ""
|
var topMessageText = ""
|
||||||
var bottomMessageText = ""
|
var bottomMessageText = ""
|
||||||
|
@ -242,7 +242,10 @@ final class StickerPackEmojisItemNode: GridItemNode {
|
|||||||
|
|
||||||
for index in 0 ..< items.count {
|
for index in 0 ..< items.count {
|
||||||
let item = items[index]
|
let item = items[index]
|
||||||
let itemId = EmojiPagerContentComponent.View.ItemLayer.Key(groupId: 0, itemId: .file(item.file.fileId), staticEmoji: nil)
|
let itemId = EmojiPagerContentComponent.View.ItemLayer.Key(
|
||||||
|
groupId: 0,
|
||||||
|
itemId: .animation(.file(item.file.fileId))
|
||||||
|
)
|
||||||
validIds.insert(itemId)
|
validIds.insert(itemId)
|
||||||
|
|
||||||
let itemDimensions = item.file.dimensions?.cgSize ?? CGSize(width: 512.0, height: 512.0)
|
let itemDimensions = item.file.dimensions?.cgSize ?? CGSize(width: 512.0, height: 512.0)
|
||||||
@ -258,16 +261,22 @@ final class StickerPackEmojisItemNode: GridItemNode {
|
|||||||
updateItemLayerPlaceholder = true
|
updateItemLayerPlaceholder = true
|
||||||
itemTransition = .immediate
|
itemTransition = .immediate
|
||||||
|
|
||||||
|
let animationData = EntityKeyboardAnimationData(file: item.file)
|
||||||
itemLayer = EmojiPagerContentComponent.View.ItemLayer(
|
itemLayer = EmojiPagerContentComponent.View.ItemLayer(
|
||||||
item: EmojiPagerContentComponent.Item(animationData: EntityKeyboardAnimationData(file: item.file), itemFile: item.file, staticEmoji: nil, subgroupId: nil),
|
item: EmojiPagerContentComponent.Item(
|
||||||
|
animationData: animationData,
|
||||||
|
content: .animation(animationData),
|
||||||
|
itemFile: item.file,
|
||||||
|
subgroupId: nil
|
||||||
|
),
|
||||||
context: context,
|
context: context,
|
||||||
attemptSynchronousLoad: attemptSynchronousLoads,
|
attemptSynchronousLoad: attemptSynchronousLoads,
|
||||||
animationData: EntityKeyboardAnimationData(file: item.file),
|
content: .animation(animationData),
|
||||||
staticEmoji: nil,
|
|
||||||
cache: animationCache,
|
cache: animationCache,
|
||||||
renderer: animationRenderer,
|
renderer: animationRenderer,
|
||||||
placeholderColor: theme.chat.inputPanel.primaryTextColor.withMultipliedAlpha(0.1),
|
placeholderColor: theme.chat.inputPanel.primaryTextColor.withMultipliedAlpha(0.1),
|
||||||
blurredBadgeColor: theme.chat.inputPanel.panelBackgroundColor.withMultipliedAlpha(0.5),
|
blurredBadgeColor: theme.chat.inputPanel.panelBackgroundColor.withMultipliedAlpha(0.5),
|
||||||
|
accentIconColor: theme.list.itemAccentColor,
|
||||||
pointSize: itemNativeFitSize,
|
pointSize: itemNativeFitSize,
|
||||||
onUpdateDisplayPlaceholder: { [weak self] displayPlaceholder, duration in
|
onUpdateDisplayPlaceholder: { [weak self] displayPlaceholder, duration in
|
||||||
guard let strongSelf = self else {
|
guard let strongSelf = self else {
|
||||||
|
@ -194,6 +194,8 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
|
|||||||
dict[594408994] = { return Api.EmojiKeyword.parse_emojiKeywordDeleted($0) }
|
dict[594408994] = { return Api.EmojiKeyword.parse_emojiKeywordDeleted($0) }
|
||||||
dict[1556570557] = { return Api.EmojiKeywordsDifference.parse_emojiKeywordsDifference($0) }
|
dict[1556570557] = { return Api.EmojiKeywordsDifference.parse_emojiKeywordsDifference($0) }
|
||||||
dict[-1275374751] = { return Api.EmojiLanguage.parse_emojiLanguage($0) }
|
dict[-1275374751] = { return Api.EmojiLanguage.parse_emojiLanguage($0) }
|
||||||
|
dict[-1835310691] = { return Api.EmojiStatus.parse_emojiStatus($0) }
|
||||||
|
dict[769727150] = { return Api.EmojiStatus.parse_emojiStatusEmpty($0) }
|
||||||
dict[-1519029347] = { return Api.EmojiURL.parse_emojiURL($0) }
|
dict[-1519029347] = { return Api.EmojiURL.parse_emojiURL($0) }
|
||||||
dict[1643173063] = { return Api.EncryptedChat.parse_encryptedChat($0) }
|
dict[1643173063] = { return Api.EncryptedChat.parse_encryptedChat($0) }
|
||||||
dict[505183301] = { return Api.EncryptedChat.parse_encryptedChatDiscarded($0) }
|
dict[505183301] = { return Api.EncryptedChat.parse_encryptedChatDiscarded($0) }
|
||||||
@ -838,7 +840,7 @@ fileprivate let parsers: [Int32 : (BufferReader) -> Any?] = {
|
|||||||
dict[-1886646706] = { return Api.UrlAuthResult.parse_urlAuthResultAccepted($0) }
|
dict[-1886646706] = { return Api.UrlAuthResult.parse_urlAuthResultAccepted($0) }
|
||||||
dict[-1445536993] = { return Api.UrlAuthResult.parse_urlAuthResultDefault($0) }
|
dict[-1445536993] = { return Api.UrlAuthResult.parse_urlAuthResultDefault($0) }
|
||||||
dict[-1831650802] = { return Api.UrlAuthResult.parse_urlAuthResultRequest($0) }
|
dict[-1831650802] = { return Api.UrlAuthResult.parse_urlAuthResultRequest($0) }
|
||||||
dict[1073147056] = { return Api.User.parse_user($0) }
|
dict[1570352622] = { return Api.User.parse_user($0) }
|
||||||
dict[-742634630] = { return Api.User.parse_userEmpty($0) }
|
dict[-742634630] = { return Api.User.parse_userEmpty($0) }
|
||||||
dict[-994968513] = { return Api.UserFull.parse_userFull($0) }
|
dict[-994968513] = { return Api.UserFull.parse_userFull($0) }
|
||||||
dict[-2100168954] = { return Api.UserProfilePhoto.parse_userProfilePhoto($0) }
|
dict[-2100168954] = { return Api.UserProfilePhoto.parse_userProfilePhoto($0) }
|
||||||
@ -1220,6 +1222,8 @@ public extension Api {
|
|||||||
_1.serialize(buffer, boxed)
|
_1.serialize(buffer, boxed)
|
||||||
case let _1 as Api.EmojiLanguage:
|
case let _1 as Api.EmojiLanguage:
|
||||||
_1.serialize(buffer, boxed)
|
_1.serialize(buffer, boxed)
|
||||||
|
case let _1 as Api.EmojiStatus:
|
||||||
|
_1.serialize(buffer, boxed)
|
||||||
case let _1 as Api.EmojiURL:
|
case let _1 as Api.EmojiURL:
|
||||||
_1.serialize(buffer, boxed)
|
_1.serialize(buffer, boxed)
|
||||||
case let _1 as Api.EncryptedChat:
|
case let _1 as Api.EncryptedChat:
|
||||||
|
@ -452,14 +452,14 @@ public extension Api {
|
|||||||
}
|
}
|
||||||
public extension Api {
|
public extension Api {
|
||||||
enum User: TypeConstructorDescription {
|
enum User: TypeConstructorDescription {
|
||||||
case user(flags: Int32, id: Int64, accessHash: Int64?, firstName: String?, lastName: String?, username: String?, phone: String?, photo: Api.UserProfilePhoto?, status: Api.UserStatus?, botInfoVersion: Int32?, restrictionReason: [Api.RestrictionReason]?, botInlinePlaceholder: String?, langCode: String?)
|
case user(flags: Int32, id: Int64, accessHash: Int64?, firstName: String?, lastName: String?, username: String?, phone: String?, photo: Api.UserProfilePhoto?, status: Api.UserStatus?, botInfoVersion: Int32?, restrictionReason: [Api.RestrictionReason]?, botInlinePlaceholder: String?, langCode: String?, emojiStatus: Api.EmojiStatus?)
|
||||||
case userEmpty(id: Int64)
|
case userEmpty(id: Int64)
|
||||||
|
|
||||||
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
||||||
switch self {
|
switch self {
|
||||||
case .user(let flags, let id, let accessHash, let firstName, let lastName, let username, let phone, let photo, let status, let botInfoVersion, let restrictionReason, let botInlinePlaceholder, let langCode):
|
case .user(let flags, let id, let accessHash, let firstName, let lastName, let username, let phone, let photo, let status, let botInfoVersion, let restrictionReason, let botInlinePlaceholder, let langCode, let emojiStatus):
|
||||||
if boxed {
|
if boxed {
|
||||||
buffer.appendInt32(1073147056)
|
buffer.appendInt32(1570352622)
|
||||||
}
|
}
|
||||||
serializeInt32(flags, buffer: buffer, boxed: false)
|
serializeInt32(flags, buffer: buffer, boxed: false)
|
||||||
serializeInt64(id, buffer: buffer, boxed: false)
|
serializeInt64(id, buffer: buffer, boxed: false)
|
||||||
@ -478,6 +478,7 @@ public extension Api {
|
|||||||
}}
|
}}
|
||||||
if Int(flags) & Int(1 << 19) != 0 {serializeString(botInlinePlaceholder!, buffer: buffer, boxed: false)}
|
if Int(flags) & Int(1 << 19) != 0 {serializeString(botInlinePlaceholder!, buffer: buffer, boxed: false)}
|
||||||
if Int(flags) & Int(1 << 22) != 0 {serializeString(langCode!, buffer: buffer, boxed: false)}
|
if Int(flags) & Int(1 << 22) != 0 {serializeString(langCode!, buffer: buffer, boxed: false)}
|
||||||
|
if Int(flags) & Int(1 << 30) != 0 {emojiStatus!.serialize(buffer, true)}
|
||||||
break
|
break
|
||||||
case .userEmpty(let id):
|
case .userEmpty(let id):
|
||||||
if boxed {
|
if boxed {
|
||||||
@ -490,8 +491,8 @@ public extension Api {
|
|||||||
|
|
||||||
public func descriptionFields() -> (String, [(String, Any)]) {
|
public func descriptionFields() -> (String, [(String, Any)]) {
|
||||||
switch self {
|
switch self {
|
||||||
case .user(let flags, let id, let accessHash, let firstName, let lastName, let username, let phone, let photo, let status, let botInfoVersion, let restrictionReason, let botInlinePlaceholder, let langCode):
|
case .user(let flags, let id, let accessHash, let firstName, let lastName, let username, let phone, let photo, let status, let botInfoVersion, let restrictionReason, let botInlinePlaceholder, let langCode, let emojiStatus):
|
||||||
return ("user", [("flags", String(describing: flags)), ("id", String(describing: id)), ("accessHash", String(describing: accessHash)), ("firstName", String(describing: firstName)), ("lastName", String(describing: lastName)), ("username", String(describing: username)), ("phone", String(describing: phone)), ("photo", String(describing: photo)), ("status", String(describing: status)), ("botInfoVersion", String(describing: botInfoVersion)), ("restrictionReason", String(describing: restrictionReason)), ("botInlinePlaceholder", String(describing: botInlinePlaceholder)), ("langCode", String(describing: langCode))])
|
return ("user", [("flags", String(describing: flags)), ("id", String(describing: id)), ("accessHash", String(describing: accessHash)), ("firstName", String(describing: firstName)), ("lastName", String(describing: lastName)), ("username", String(describing: username)), ("phone", String(describing: phone)), ("photo", String(describing: photo)), ("status", String(describing: status)), ("botInfoVersion", String(describing: botInfoVersion)), ("restrictionReason", String(describing: restrictionReason)), ("botInlinePlaceholder", String(describing: botInlinePlaceholder)), ("langCode", String(describing: langCode)), ("emojiStatus", String(describing: emojiStatus))])
|
||||||
case .userEmpty(let id):
|
case .userEmpty(let id):
|
||||||
return ("userEmpty", [("id", String(describing: id))])
|
return ("userEmpty", [("id", String(describing: id))])
|
||||||
}
|
}
|
||||||
@ -530,6 +531,10 @@ public extension Api {
|
|||||||
if Int(_1!) & Int(1 << 19) != 0 {_12 = parseString(reader) }
|
if Int(_1!) & Int(1 << 19) != 0 {_12 = parseString(reader) }
|
||||||
var _13: String?
|
var _13: String?
|
||||||
if Int(_1!) & Int(1 << 22) != 0 {_13 = parseString(reader) }
|
if Int(_1!) & Int(1 << 22) != 0 {_13 = parseString(reader) }
|
||||||
|
var _14: Api.EmojiStatus?
|
||||||
|
if Int(_1!) & Int(1 << 30) != 0 {if let signature = reader.readInt32() {
|
||||||
|
_14 = Api.parse(reader, signature: signature) as? Api.EmojiStatus
|
||||||
|
} }
|
||||||
let _c1 = _1 != nil
|
let _c1 = _1 != nil
|
||||||
let _c2 = _2 != nil
|
let _c2 = _2 != nil
|
||||||
let _c3 = (Int(_1!) & Int(1 << 0) == 0) || _3 != nil
|
let _c3 = (Int(_1!) & Int(1 << 0) == 0) || _3 != nil
|
||||||
@ -543,8 +548,9 @@ public extension Api {
|
|||||||
let _c11 = (Int(_1!) & Int(1 << 18) == 0) || _11 != nil
|
let _c11 = (Int(_1!) & Int(1 << 18) == 0) || _11 != nil
|
||||||
let _c12 = (Int(_1!) & Int(1 << 19) == 0) || _12 != nil
|
let _c12 = (Int(_1!) & Int(1 << 19) == 0) || _12 != nil
|
||||||
let _c13 = (Int(_1!) & Int(1 << 22) == 0) || _13 != nil
|
let _c13 = (Int(_1!) & Int(1 << 22) == 0) || _13 != nil
|
||||||
if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 {
|
let _c14 = (Int(_1!) & Int(1 << 30) == 0) || _14 != nil
|
||||||
return Api.User.user(flags: _1!, id: _2!, accessHash: _3, firstName: _4, lastName: _5, username: _6, phone: _7, photo: _8, status: _9, botInfoVersion: _10, restrictionReason: _11, botInlinePlaceholder: _12, langCode: _13)
|
if _c1 && _c2 && _c3 && _c4 && _c5 && _c6 && _c7 && _c8 && _c9 && _c10 && _c11 && _c12 && _c13 && _c14 {
|
||||||
|
return Api.User.user(flags: _1!, id: _2!, accessHash: _3, firstName: _4, lastName: _5, username: _6, phone: _7, photo: _8, status: _9, botInfoVersion: _10, restrictionReason: _11, botInlinePlaceholder: _12, langCode: _13, emojiStatus: _14)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return nil
|
return nil
|
||||||
|
@ -1055,6 +1055,21 @@ public extension Api.functions.account {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public extension Api.functions.account {
|
||||||
|
static func updateEmojiStatus(emojiStatus: Api.EmojiStatus) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Bool>) {
|
||||||
|
let buffer = Buffer()
|
||||||
|
buffer.appendInt32(-70001045)
|
||||||
|
emojiStatus.serialize(buffer, true)
|
||||||
|
return (FunctionDescription(name: "account.updateEmojiStatus", parameters: [("emojiStatus", String(describing: emojiStatus))]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.Bool? in
|
||||||
|
let reader = BufferReader(buffer)
|
||||||
|
var result: Api.Bool?
|
||||||
|
if let signature = reader.readInt32() {
|
||||||
|
result = Api.parse(reader, signature: signature) as? Api.Bool
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
public extension Api.functions.account {
|
public extension Api.functions.account {
|
||||||
static func updateNotifySettings(peer: Api.InputNotifyPeer, settings: Api.InputPeerNotifySettings) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Bool>) {
|
static func updateNotifySettings(peer: Api.InputNotifyPeer, settings: Api.InputPeerNotifySettings) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.Bool>) {
|
||||||
let buffer = Buffer()
|
let buffer = Buffer()
|
||||||
|
@ -246,6 +246,54 @@ public extension Api {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public extension Api {
|
||||||
|
enum EmojiStatus: TypeConstructorDescription {
|
||||||
|
case emojiStatus(documentId: Int64)
|
||||||
|
case emojiStatusEmpty
|
||||||
|
|
||||||
|
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
||||||
|
switch self {
|
||||||
|
case .emojiStatus(let documentId):
|
||||||
|
if boxed {
|
||||||
|
buffer.appendInt32(-1835310691)
|
||||||
|
}
|
||||||
|
serializeInt64(documentId, buffer: buffer, boxed: false)
|
||||||
|
break
|
||||||
|
case .emojiStatusEmpty:
|
||||||
|
if boxed {
|
||||||
|
buffer.appendInt32(769727150)
|
||||||
|
}
|
||||||
|
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func descriptionFields() -> (String, [(String, Any)]) {
|
||||||
|
switch self {
|
||||||
|
case .emojiStatus(let documentId):
|
||||||
|
return ("emojiStatus", [("documentId", String(describing: documentId))])
|
||||||
|
case .emojiStatusEmpty:
|
||||||
|
return ("emojiStatusEmpty", [])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static func parse_emojiStatus(_ reader: BufferReader) -> EmojiStatus? {
|
||||||
|
var _1: Int64?
|
||||||
|
_1 = reader.readInt64()
|
||||||
|
let _c1 = _1 != nil
|
||||||
|
if _c1 {
|
||||||
|
return Api.EmojiStatus.emojiStatus(documentId: _1!)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static func parse_emojiStatusEmpty(_ reader: BufferReader) -> EmojiStatus? {
|
||||||
|
return Api.EmojiStatus.emojiStatusEmpty
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
public extension Api {
|
public extension Api {
|
||||||
enum EmojiURL: TypeConstructorDescription {
|
enum EmojiURL: TypeConstructorDescription {
|
||||||
case emojiURL(url: String)
|
case emojiURL(url: String)
|
||||||
@ -1290,93 +1338,3 @@ public extension Api {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public extension Api {
|
|
||||||
enum GroupCallParticipantVideoSourceGroup: TypeConstructorDescription {
|
|
||||||
case groupCallParticipantVideoSourceGroup(semantics: String, sources: [Int32])
|
|
||||||
|
|
||||||
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
|
||||||
switch self {
|
|
||||||
case .groupCallParticipantVideoSourceGroup(let semantics, let sources):
|
|
||||||
if boxed {
|
|
||||||
buffer.appendInt32(-592373577)
|
|
||||||
}
|
|
||||||
serializeString(semantics, buffer: buffer, boxed: false)
|
|
||||||
buffer.appendInt32(481674261)
|
|
||||||
buffer.appendInt32(Int32(sources.count))
|
|
||||||
for item in sources {
|
|
||||||
serializeInt32(item, buffer: buffer, boxed: false)
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public func descriptionFields() -> (String, [(String, Any)]) {
|
|
||||||
switch self {
|
|
||||||
case .groupCallParticipantVideoSourceGroup(let semantics, let sources):
|
|
||||||
return ("groupCallParticipantVideoSourceGroup", [("semantics", String(describing: semantics)), ("sources", String(describing: sources))])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static func parse_groupCallParticipantVideoSourceGroup(_ reader: BufferReader) -> GroupCallParticipantVideoSourceGroup? {
|
|
||||||
var _1: String?
|
|
||||||
_1 = parseString(reader)
|
|
||||||
var _2: [Int32]?
|
|
||||||
if let _ = reader.readInt32() {
|
|
||||||
_2 = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self)
|
|
||||||
}
|
|
||||||
let _c1 = _1 != nil
|
|
||||||
let _c2 = _2 != nil
|
|
||||||
if _c1 && _c2 {
|
|
||||||
return Api.GroupCallParticipantVideoSourceGroup.groupCallParticipantVideoSourceGroup(semantics: _1!, sources: _2!)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public extension Api {
|
|
||||||
enum GroupCallStreamChannel: TypeConstructorDescription {
|
|
||||||
case groupCallStreamChannel(channel: Int32, scale: Int32, lastTimestampMs: Int64)
|
|
||||||
|
|
||||||
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
|
||||||
switch self {
|
|
||||||
case .groupCallStreamChannel(let channel, let scale, let lastTimestampMs):
|
|
||||||
if boxed {
|
|
||||||
buffer.appendInt32(-2132064081)
|
|
||||||
}
|
|
||||||
serializeInt32(channel, buffer: buffer, boxed: false)
|
|
||||||
serializeInt32(scale, buffer: buffer, boxed: false)
|
|
||||||
serializeInt64(lastTimestampMs, buffer: buffer, boxed: false)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public func descriptionFields() -> (String, [(String, Any)]) {
|
|
||||||
switch self {
|
|
||||||
case .groupCallStreamChannel(let channel, let scale, let lastTimestampMs):
|
|
||||||
return ("groupCallStreamChannel", [("channel", String(describing: channel)), ("scale", String(describing: scale)), ("lastTimestampMs", String(describing: lastTimestampMs))])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static func parse_groupCallStreamChannel(_ reader: BufferReader) -> GroupCallStreamChannel? {
|
|
||||||
var _1: Int32?
|
|
||||||
_1 = reader.readInt32()
|
|
||||||
var _2: Int32?
|
|
||||||
_2 = reader.readInt32()
|
|
||||||
var _3: Int64?
|
|
||||||
_3 = reader.readInt64()
|
|
||||||
let _c1 = _1 != nil
|
|
||||||
let _c2 = _2 != nil
|
|
||||||
let _c3 = _3 != nil
|
|
||||||
if _c1 && _c2 && _c3 {
|
|
||||||
return Api.GroupCallStreamChannel.groupCallStreamChannel(channel: _1!, scale: _2!, lastTimestampMs: _3!)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -1,3 +1,93 @@
|
|||||||
|
public extension Api {
|
||||||
|
enum GroupCallParticipantVideoSourceGroup: TypeConstructorDescription {
|
||||||
|
case groupCallParticipantVideoSourceGroup(semantics: String, sources: [Int32])
|
||||||
|
|
||||||
|
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
||||||
|
switch self {
|
||||||
|
case .groupCallParticipantVideoSourceGroup(let semantics, let sources):
|
||||||
|
if boxed {
|
||||||
|
buffer.appendInt32(-592373577)
|
||||||
|
}
|
||||||
|
serializeString(semantics, buffer: buffer, boxed: false)
|
||||||
|
buffer.appendInt32(481674261)
|
||||||
|
buffer.appendInt32(Int32(sources.count))
|
||||||
|
for item in sources {
|
||||||
|
serializeInt32(item, buffer: buffer, boxed: false)
|
||||||
|
}
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func descriptionFields() -> (String, [(String, Any)]) {
|
||||||
|
switch self {
|
||||||
|
case .groupCallParticipantVideoSourceGroup(let semantics, let sources):
|
||||||
|
return ("groupCallParticipantVideoSourceGroup", [("semantics", String(describing: semantics)), ("sources", String(describing: sources))])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static func parse_groupCallParticipantVideoSourceGroup(_ reader: BufferReader) -> GroupCallParticipantVideoSourceGroup? {
|
||||||
|
var _1: String?
|
||||||
|
_1 = parseString(reader)
|
||||||
|
var _2: [Int32]?
|
||||||
|
if let _ = reader.readInt32() {
|
||||||
|
_2 = Api.parseVector(reader, elementSignature: -1471112230, elementType: Int32.self)
|
||||||
|
}
|
||||||
|
let _c1 = _1 != nil
|
||||||
|
let _c2 = _2 != nil
|
||||||
|
if _c1 && _c2 {
|
||||||
|
return Api.GroupCallParticipantVideoSourceGroup.groupCallParticipantVideoSourceGroup(semantics: _1!, sources: _2!)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public extension Api {
|
||||||
|
enum GroupCallStreamChannel: TypeConstructorDescription {
|
||||||
|
case groupCallStreamChannel(channel: Int32, scale: Int32, lastTimestampMs: Int64)
|
||||||
|
|
||||||
|
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
||||||
|
switch self {
|
||||||
|
case .groupCallStreamChannel(let channel, let scale, let lastTimestampMs):
|
||||||
|
if boxed {
|
||||||
|
buffer.appendInt32(-2132064081)
|
||||||
|
}
|
||||||
|
serializeInt32(channel, buffer: buffer, boxed: false)
|
||||||
|
serializeInt32(scale, buffer: buffer, boxed: false)
|
||||||
|
serializeInt64(lastTimestampMs, buffer: buffer, boxed: false)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func descriptionFields() -> (String, [(String, Any)]) {
|
||||||
|
switch self {
|
||||||
|
case .groupCallStreamChannel(let channel, let scale, let lastTimestampMs):
|
||||||
|
return ("groupCallStreamChannel", [("channel", String(describing: channel)), ("scale", String(describing: scale)), ("lastTimestampMs", String(describing: lastTimestampMs))])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static func parse_groupCallStreamChannel(_ reader: BufferReader) -> GroupCallStreamChannel? {
|
||||||
|
var _1: Int32?
|
||||||
|
_1 = reader.readInt32()
|
||||||
|
var _2: Int32?
|
||||||
|
_2 = reader.readInt32()
|
||||||
|
var _3: Int64?
|
||||||
|
_3 = reader.readInt64()
|
||||||
|
let _c1 = _1 != nil
|
||||||
|
let _c2 = _2 != nil
|
||||||
|
let _c3 = _3 != nil
|
||||||
|
if _c1 && _c2 && _c3 {
|
||||||
|
return Api.GroupCallStreamChannel.groupCallStreamChannel(channel: _1!, scale: _2!, lastTimestampMs: _3!)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
public extension Api {
|
public extension Api {
|
||||||
enum HighScore: TypeConstructorDescription {
|
enum HighScore: TypeConstructorDescription {
|
||||||
case highScore(pos: Int32, userId: Int64, score: Int32)
|
case highScore(pos: Int32, userId: Int64, score: Int32)
|
||||||
@ -1056,91 +1146,3 @@ public extension Api {
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public extension Api {
|
|
||||||
enum InputClientProxy: TypeConstructorDescription {
|
|
||||||
case inputClientProxy(address: String, port: Int32)
|
|
||||||
|
|
||||||
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
|
||||||
switch self {
|
|
||||||
case .inputClientProxy(let address, let port):
|
|
||||||
if boxed {
|
|
||||||
buffer.appendInt32(1968737087)
|
|
||||||
}
|
|
||||||
serializeString(address, buffer: buffer, boxed: false)
|
|
||||||
serializeInt32(port, buffer: buffer, boxed: false)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public func descriptionFields() -> (String, [(String, Any)]) {
|
|
||||||
switch self {
|
|
||||||
case .inputClientProxy(let address, let port):
|
|
||||||
return ("inputClientProxy", [("address", String(describing: address)), ("port", String(describing: port))])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static func parse_inputClientProxy(_ reader: BufferReader) -> InputClientProxy? {
|
|
||||||
var _1: String?
|
|
||||||
_1 = parseString(reader)
|
|
||||||
var _2: Int32?
|
|
||||||
_2 = reader.readInt32()
|
|
||||||
let _c1 = _1 != nil
|
|
||||||
let _c2 = _2 != nil
|
|
||||||
if _c1 && _c2 {
|
|
||||||
return Api.InputClientProxy.inputClientProxy(address: _1!, port: _2!)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
public extension Api {
|
|
||||||
enum InputContact: TypeConstructorDescription {
|
|
||||||
case inputPhoneContact(clientId: Int64, phone: String, firstName: String, lastName: String)
|
|
||||||
|
|
||||||
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
|
||||||
switch self {
|
|
||||||
case .inputPhoneContact(let clientId, let phone, let firstName, let lastName):
|
|
||||||
if boxed {
|
|
||||||
buffer.appendInt32(-208488460)
|
|
||||||
}
|
|
||||||
serializeInt64(clientId, buffer: buffer, boxed: false)
|
|
||||||
serializeString(phone, buffer: buffer, boxed: false)
|
|
||||||
serializeString(firstName, buffer: buffer, boxed: false)
|
|
||||||
serializeString(lastName, buffer: buffer, boxed: false)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public func descriptionFields() -> (String, [(String, Any)]) {
|
|
||||||
switch self {
|
|
||||||
case .inputPhoneContact(let clientId, let phone, let firstName, let lastName):
|
|
||||||
return ("inputPhoneContact", [("clientId", String(describing: clientId)), ("phone", String(describing: phone)), ("firstName", String(describing: firstName)), ("lastName", String(describing: lastName))])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static func parse_inputPhoneContact(_ reader: BufferReader) -> InputContact? {
|
|
||||||
var _1: Int64?
|
|
||||||
_1 = reader.readInt64()
|
|
||||||
var _2: String?
|
|
||||||
_2 = parseString(reader)
|
|
||||||
var _3: String?
|
|
||||||
_3 = parseString(reader)
|
|
||||||
var _4: String?
|
|
||||||
_4 = parseString(reader)
|
|
||||||
let _c1 = _1 != nil
|
|
||||||
let _c2 = _2 != nil
|
|
||||||
let _c3 = _3 != nil
|
|
||||||
let _c4 = _4 != nil
|
|
||||||
if _c1 && _c2 && _c3 && _c4 {
|
|
||||||
return Api.InputContact.inputPhoneContact(clientId: _1!, phone: _2!, firstName: _3!, lastName: _4!)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -1,3 +1,91 @@
|
|||||||
|
public extension Api {
|
||||||
|
enum InputClientProxy: TypeConstructorDescription {
|
||||||
|
case inputClientProxy(address: String, port: Int32)
|
||||||
|
|
||||||
|
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
||||||
|
switch self {
|
||||||
|
case .inputClientProxy(let address, let port):
|
||||||
|
if boxed {
|
||||||
|
buffer.appendInt32(1968737087)
|
||||||
|
}
|
||||||
|
serializeString(address, buffer: buffer, boxed: false)
|
||||||
|
serializeInt32(port, buffer: buffer, boxed: false)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func descriptionFields() -> (String, [(String, Any)]) {
|
||||||
|
switch self {
|
||||||
|
case .inputClientProxy(let address, let port):
|
||||||
|
return ("inputClientProxy", [("address", String(describing: address)), ("port", String(describing: port))])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static func parse_inputClientProxy(_ reader: BufferReader) -> InputClientProxy? {
|
||||||
|
var _1: String?
|
||||||
|
_1 = parseString(reader)
|
||||||
|
var _2: Int32?
|
||||||
|
_2 = reader.readInt32()
|
||||||
|
let _c1 = _1 != nil
|
||||||
|
let _c2 = _2 != nil
|
||||||
|
if _c1 && _c2 {
|
||||||
|
return Api.InputClientProxy.inputClientProxy(address: _1!, port: _2!)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public extension Api {
|
||||||
|
enum InputContact: TypeConstructorDescription {
|
||||||
|
case inputPhoneContact(clientId: Int64, phone: String, firstName: String, lastName: String)
|
||||||
|
|
||||||
|
public func serialize(_ buffer: Buffer, _ boxed: Swift.Bool) {
|
||||||
|
switch self {
|
||||||
|
case .inputPhoneContact(let clientId, let phone, let firstName, let lastName):
|
||||||
|
if boxed {
|
||||||
|
buffer.appendInt32(-208488460)
|
||||||
|
}
|
||||||
|
serializeInt64(clientId, buffer: buffer, boxed: false)
|
||||||
|
serializeString(phone, buffer: buffer, boxed: false)
|
||||||
|
serializeString(firstName, buffer: buffer, boxed: false)
|
||||||
|
serializeString(lastName, buffer: buffer, boxed: false)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func descriptionFields() -> (String, [(String, Any)]) {
|
||||||
|
switch self {
|
||||||
|
case .inputPhoneContact(let clientId, let phone, let firstName, let lastName):
|
||||||
|
return ("inputPhoneContact", [("clientId", String(describing: clientId)), ("phone", String(describing: phone)), ("firstName", String(describing: firstName)), ("lastName", String(describing: lastName))])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static func parse_inputPhoneContact(_ reader: BufferReader) -> InputContact? {
|
||||||
|
var _1: Int64?
|
||||||
|
_1 = reader.readInt64()
|
||||||
|
var _2: String?
|
||||||
|
_2 = parseString(reader)
|
||||||
|
var _3: String?
|
||||||
|
_3 = parseString(reader)
|
||||||
|
var _4: String?
|
||||||
|
_4 = parseString(reader)
|
||||||
|
let _c1 = _1 != nil
|
||||||
|
let _c2 = _2 != nil
|
||||||
|
let _c3 = _3 != nil
|
||||||
|
let _c4 = _4 != nil
|
||||||
|
if _c1 && _c2 && _c3 && _c4 {
|
||||||
|
return Api.InputContact.inputPhoneContact(clientId: _1!, phone: _2!, firstName: _3!, lastName: _4!)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
public extension Api {
|
public extension Api {
|
||||||
enum InputDialogPeer: TypeConstructorDescription {
|
enum InputDialogPeer: TypeConstructorDescription {
|
||||||
case inputDialogPeer(peer: Api.InputPeer)
|
case inputDialogPeer(peer: Api.InputPeer)
|
||||||
|
@ -424,7 +424,7 @@ struct AccountMutableState {
|
|||||||
var presences: [PeerId: Api.UserStatus] = [:]
|
var presences: [PeerId: Api.UserStatus] = [:]
|
||||||
for user in users {
|
for user in users {
|
||||||
switch user {
|
switch user {
|
||||||
case let .user(_, id, _, _, _, _, _, _, status, _, _, _, _):
|
case let .user(_, id, _, _, _, _, _, _, status, _, _, _, _, _):
|
||||||
if let status = status {
|
if let status = status {
|
||||||
presences[PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(id))] = status
|
presences[PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(id))] = status
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,7 @@ func parsedTelegramProfilePhoto(_ photo: Api.UserProfilePhoto) -> [TelegramMedia
|
|||||||
extension TelegramUser {
|
extension TelegramUser {
|
||||||
convenience init(user: Api.User) {
|
convenience init(user: Api.User) {
|
||||||
switch user {
|
switch user {
|
||||||
case let .user(flags, id, accessHash, firstName, lastName, username, phone, photo, _, _, restrictionReason, botInlinePlaceholder, _):
|
case let .user(flags, id, accessHash, firstName, lastName, username, phone, photo, _, _, restrictionReason, botInlinePlaceholder, _, emojiStatus):
|
||||||
let representations: [TelegramMediaImageRepresentation] = photo.flatMap(parsedTelegramProfilePhoto) ?? []
|
let representations: [TelegramMediaImageRepresentation] = photo.flatMap(parsedTelegramProfilePhoto) ?? []
|
||||||
|
|
||||||
let isMin = (flags & (1 << 20)) != 0
|
let isMin = (flags & (1 << 20)) != 0
|
||||||
@ -75,15 +75,15 @@ extension TelegramUser {
|
|||||||
|
|
||||||
let restrictionInfo: PeerAccessRestrictionInfo? = restrictionReason.flatMap(PeerAccessRestrictionInfo.init(apiReasons:))
|
let restrictionInfo: PeerAccessRestrictionInfo? = restrictionReason.flatMap(PeerAccessRestrictionInfo.init(apiReasons:))
|
||||||
|
|
||||||
self.init(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(id)), accessHash: accessHashValue, firstName: firstName, lastName: lastName, username: username, phone: phone, photo: representations, botInfo: botInfo, restrictionInfo: restrictionInfo, flags: userFlags)
|
self.init(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(id)), accessHash: accessHashValue, firstName: firstName, lastName: lastName, username: username, phone: phone, photo: representations, botInfo: botInfo, restrictionInfo: restrictionInfo, flags: userFlags, emojiStatus: emojiStatus.flatMap(PeerEmojiStatus.init(apiStatus:)))
|
||||||
case let .userEmpty(id):
|
case let .userEmpty(id):
|
||||||
self.init(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(id)), accessHash: nil, firstName: nil, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [])
|
self.init(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(id)), accessHash: nil, firstName: nil, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static func merge(_ lhs: TelegramUser?, rhs: Api.User) -> TelegramUser? {
|
static func merge(_ lhs: TelegramUser?, rhs: Api.User) -> TelegramUser? {
|
||||||
switch rhs {
|
switch rhs {
|
||||||
case let .user(flags, _, rhsAccessHash, _, _, username, _, photo, _, _, restrictionReason, botInlinePlaceholder, _):
|
case let .user(flags, _, rhsAccessHash, _, _, username, _, photo, _, _, restrictionReason, botInlinePlaceholder, _, emojiStatus):
|
||||||
let isMin = (flags & (1 << 20)) != 0
|
let isMin = (flags & (1 << 20)) != 0
|
||||||
if !isMin {
|
if !isMin {
|
||||||
return TelegramUser(user: rhs)
|
return TelegramUser(user: rhs)
|
||||||
@ -150,7 +150,7 @@ extension TelegramUser {
|
|||||||
accessHash = lhs.accessHash ?? rhsAccessHashValue
|
accessHash = lhs.accessHash ?? rhsAccessHashValue
|
||||||
}
|
}
|
||||||
|
|
||||||
return TelegramUser(id: lhs.id, accessHash: accessHash, firstName: lhs.firstName, lastName: lhs.lastName, username: username, phone: lhs.phone, photo: telegramPhoto, botInfo: botInfo, restrictionInfo: restrictionInfo, flags: userFlags)
|
return TelegramUser(id: lhs.id, accessHash: accessHash, firstName: lhs.firstName, lastName: lhs.lastName, username: username, phone: lhs.phone, photo: telegramPhoto, botInfo: botInfo, restrictionInfo: restrictionInfo, flags: userFlags, emojiStatus: emojiStatus.flatMap(PeerEmojiStatus.init(apiStatus:)))
|
||||||
} else {
|
} else {
|
||||||
return TelegramUser(user: rhs)
|
return TelegramUser(user: rhs)
|
||||||
}
|
}
|
||||||
@ -186,6 +186,8 @@ extension TelegramUser {
|
|||||||
|
|
||||||
let botInfo: BotUserInfo? = rhs.botInfo
|
let botInfo: BotUserInfo? = rhs.botInfo
|
||||||
|
|
||||||
|
let emojiStatus = rhs.emojiStatus
|
||||||
|
|
||||||
let restrictionInfo: PeerAccessRestrictionInfo? = rhs.restrictionInfo
|
let restrictionInfo: PeerAccessRestrictionInfo? = rhs.restrictionInfo
|
||||||
|
|
||||||
let accessHash: TelegramPeerAccessHash?
|
let accessHash: TelegramPeerAccessHash?
|
||||||
@ -195,7 +197,7 @@ extension TelegramUser {
|
|||||||
accessHash = lhs.accessHash ?? rhs.accessHash
|
accessHash = lhs.accessHash ?? rhs.accessHash
|
||||||
}
|
}
|
||||||
|
|
||||||
return TelegramUser(id: lhs.id, accessHash: accessHash, firstName: lhs.firstName, lastName: lhs.lastName, username: rhs.username, phone: lhs.phone, photo: rhs.photo.isEmpty ? lhs.photo : rhs.photo, botInfo: botInfo, restrictionInfo: restrictionInfo, flags: userFlags)
|
return TelegramUser(id: lhs.id, accessHash: accessHash, firstName: lhs.firstName, lastName: lhs.lastName, username: rhs.username, phone: lhs.phone, photo: rhs.photo.isEmpty ? lhs.photo : rhs.photo, botInfo: botInfo, restrictionInfo: restrictionInfo, flags: userFlags, emojiStatus: emojiStatus)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ extension TelegramUserPresence {
|
|||||||
|
|
||||||
convenience init?(apiUser: Api.User) {
|
convenience init?(apiUser: Api.User) {
|
||||||
switch apiUser {
|
switch apiUser {
|
||||||
case let .user(_, _, _, _, _, _, _, _, status, _, _, _, _):
|
case let .user(_, _, _, _, _, _, _, _, status, _, _, _, _, _):
|
||||||
if let status = status {
|
if let status = status {
|
||||||
self.init(apiStatus: status)
|
self.init(apiStatus: status)
|
||||||
} else {
|
} else {
|
||||||
|
@ -1021,7 +1021,7 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo
|
|||||||
if updatedState.peers[peerId] == nil {
|
if updatedState.peers[peerId] == nil {
|
||||||
updatedState.updatePeer(peerId, { peer in
|
updatedState.updatePeer(peerId, { peer in
|
||||||
if peer == nil {
|
if peer == nil {
|
||||||
return TelegramUser(id: peerId, accessHash: nil, firstName: "Telegram Notifications", lastName: nil, username: nil, phone: nil, photo: [], botInfo: BotUserInfo(flags: [], inlinePlaceholder: nil), restrictionInfo: nil, flags: [.isVerified])
|
return TelegramUser(id: peerId, accessHash: nil, firstName: "Telegram Notifications", lastName: nil, username: nil, phone: nil, photo: [], botInfo: BotUserInfo(flags: [], inlinePlaceholder: nil), restrictionInfo: nil, flags: [.isVerified], emojiStatus: nil)
|
||||||
} else {
|
} else {
|
||||||
return peer
|
return peer
|
||||||
}
|
}
|
||||||
|
@ -210,7 +210,7 @@ public class BoxedMessage: NSObject {
|
|||||||
|
|
||||||
public class Serialization: NSObject, MTSerialization {
|
public class Serialization: NSObject, MTSerialization {
|
||||||
public func currentLayer() -> UInt {
|
public func currentLayer() -> UInt {
|
||||||
return 144
|
return 145
|
||||||
}
|
}
|
||||||
|
|
||||||
public func parseMessage(_ data: Data!) -> Any! {
|
public func parseMessage(_ data: Data!) -> Any! {
|
||||||
|
@ -157,7 +157,7 @@ extension Api.Chat {
|
|||||||
extension Api.User {
|
extension Api.User {
|
||||||
var peerId: PeerId {
|
var peerId: PeerId {
|
||||||
switch self {
|
switch self {
|
||||||
case .user(_, let id, _, _, _, _, _, _, _, _, _, _, _):
|
case .user(_, let id, _, _, _, _, _, _, _, _, _, _, _, _):
|
||||||
return PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(id))
|
return PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(id))
|
||||||
case let .userEmpty(id):
|
case let .userEmpty(id):
|
||||||
return PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(id))
|
return PeerId(namespace: Namespaces.Peer.CloudUser, id: PeerId.Id._internalFromInt64Value(id))
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
import Postbox
|
import Postbox
|
||||||
|
import TelegramApi
|
||||||
|
|
||||||
public enum CachedPeerAutoremoveTimeout: Equatable, PostboxCoding {
|
public enum CachedPeerAutoremoveTimeout: Equatable, PostboxCoding {
|
||||||
public struct Value: Equatable, PostboxCoding {
|
public struct Value: Equatable, PostboxCoding {
|
||||||
@ -93,6 +94,17 @@ public struct PeerEmojiStatus: Equatable, Codable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extension PeerEmojiStatus {
|
||||||
|
init?(apiStatus: Api.EmojiStatus) {
|
||||||
|
switch apiStatus {
|
||||||
|
case let .emojiStatus(documentId):
|
||||||
|
self.init(fileId: documentId)
|
||||||
|
case .emojiStatusEmpty:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public final class CachedUserData: CachedPeerData {
|
public final class CachedUserData: CachedPeerData {
|
||||||
public let about: String?
|
public let about: String?
|
||||||
public let botInfo: BotInfo?
|
public let botInfo: BotInfo?
|
||||||
@ -110,7 +122,6 @@ public final class CachedUserData: CachedPeerData {
|
|||||||
public let photo: TelegramMediaImage?
|
public let photo: TelegramMediaImage?
|
||||||
public let premiumGiftOptions: [CachedPremiumGiftOption]
|
public let premiumGiftOptions: [CachedPremiumGiftOption]
|
||||||
public let voiceMessagesAvailable: Bool
|
public let voiceMessagesAvailable: Bool
|
||||||
public let emojiStatus: PeerEmojiStatus?
|
|
||||||
|
|
||||||
public let peerIds: Set<PeerId>
|
public let peerIds: Set<PeerId>
|
||||||
public let messageIds: Set<MessageId>
|
public let messageIds: Set<MessageId>
|
||||||
@ -133,12 +144,11 @@ public final class CachedUserData: CachedPeerData {
|
|||||||
self.photo = nil
|
self.photo = nil
|
||||||
self.premiumGiftOptions = []
|
self.premiumGiftOptions = []
|
||||||
self.voiceMessagesAvailable = true
|
self.voiceMessagesAvailable = true
|
||||||
self.emojiStatus = nil
|
|
||||||
self.peerIds = Set()
|
self.peerIds = Set()
|
||||||
self.messageIds = Set()
|
self.messageIds = Set()
|
||||||
}
|
}
|
||||||
|
|
||||||
public init(about: String?, botInfo: BotInfo?, peerStatusSettings: PeerStatusSettings?, pinnedMessageId: MessageId?, isBlocked: Bool, commonGroupCount: Int32, voiceCallsAvailable: Bool, videoCallsAvailable: Bool, callsPrivate: Bool, canPinMessages: Bool, hasScheduledMessages: Bool, autoremoveTimeout: CachedPeerAutoremoveTimeout, themeEmoticon: String?, photo: TelegramMediaImage?, premiumGiftOptions: [CachedPremiumGiftOption], voiceMessagesAvailable: Bool, emojiStatus: PeerEmojiStatus?) {
|
public init(about: String?, botInfo: BotInfo?, peerStatusSettings: PeerStatusSettings?, pinnedMessageId: MessageId?, isBlocked: Bool, commonGroupCount: Int32, voiceCallsAvailable: Bool, videoCallsAvailable: Bool, callsPrivate: Bool, canPinMessages: Bool, hasScheduledMessages: Bool, autoremoveTimeout: CachedPeerAutoremoveTimeout, themeEmoticon: String?, photo: TelegramMediaImage?, premiumGiftOptions: [CachedPremiumGiftOption], voiceMessagesAvailable: Bool) {
|
||||||
self.about = about
|
self.about = about
|
||||||
self.botInfo = botInfo
|
self.botInfo = botInfo
|
||||||
self.peerStatusSettings = peerStatusSettings
|
self.peerStatusSettings = peerStatusSettings
|
||||||
@ -155,7 +165,6 @@ public final class CachedUserData: CachedPeerData {
|
|||||||
self.photo = photo
|
self.photo = photo
|
||||||
self.premiumGiftOptions = premiumGiftOptions
|
self.premiumGiftOptions = premiumGiftOptions
|
||||||
self.voiceMessagesAvailable = voiceMessagesAvailable
|
self.voiceMessagesAvailable = voiceMessagesAvailable
|
||||||
self.emojiStatus = emojiStatus
|
|
||||||
|
|
||||||
self.peerIds = Set<PeerId>()
|
self.peerIds = Set<PeerId>()
|
||||||
|
|
||||||
@ -200,8 +209,6 @@ public final class CachedUserData: CachedPeerData {
|
|||||||
self.premiumGiftOptions = decoder.decodeObjectArrayWithDecoderForKey("pgo") as [CachedPremiumGiftOption]
|
self.premiumGiftOptions = decoder.decodeObjectArrayWithDecoderForKey("pgo") as [CachedPremiumGiftOption]
|
||||||
self.voiceMessagesAvailable = decoder.decodeInt32ForKey("vma", orElse: 0) != 0
|
self.voiceMessagesAvailable = decoder.decodeInt32ForKey("vma", orElse: 0) != 0
|
||||||
|
|
||||||
self.emojiStatus = decoder.decode(PeerEmojiStatus.self, forKey: "emojiStatus")
|
|
||||||
|
|
||||||
self.peerIds = Set<PeerId>()
|
self.peerIds = Set<PeerId>()
|
||||||
|
|
||||||
var messageIds = Set<MessageId>()
|
var messageIds = Set<MessageId>()
|
||||||
@ -258,12 +265,6 @@ public final class CachedUserData: CachedPeerData {
|
|||||||
|
|
||||||
encoder.encodeObjectArray(self.premiumGiftOptions, forKey: "pgo")
|
encoder.encodeObjectArray(self.premiumGiftOptions, forKey: "pgo")
|
||||||
encoder.encodeInt32(self.voiceMessagesAvailable ? 1 : 0, forKey: "vma")
|
encoder.encodeInt32(self.voiceMessagesAvailable ? 1 : 0, forKey: "vma")
|
||||||
|
|
||||||
if let emojiStatus = self.emojiStatus {
|
|
||||||
encoder.encode(emojiStatus, forKey: "emojiStatus")
|
|
||||||
} else {
|
|
||||||
encoder.encodeNil(forKey: "emojiStatus")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public func isEqual(to: CachedPeerData) -> Bool {
|
public func isEqual(to: CachedPeerData) -> Bool {
|
||||||
@ -277,78 +278,71 @@ public final class CachedUserData: CachedPeerData {
|
|||||||
if other.canPinMessages != self.canPinMessages {
|
if other.canPinMessages != self.canPinMessages {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if other.emojiStatus != self.emojiStatus {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
return other.about == self.about && other.botInfo == self.botInfo && self.peerStatusSettings == other.peerStatusSettings && self.isBlocked == other.isBlocked && self.commonGroupCount == other.commonGroupCount && self.voiceCallsAvailable == other.voiceCallsAvailable && self.videoCallsAvailable == other.videoCallsAvailable && self.callsPrivate == other.callsPrivate && self.hasScheduledMessages == other.hasScheduledMessages && self.autoremoveTimeout == other.autoremoveTimeout && self.themeEmoticon == other.themeEmoticon && self.photo == other.photo && self.premiumGiftOptions == other.premiumGiftOptions && self.voiceMessagesAvailable == other.voiceMessagesAvailable
|
return other.about == self.about && other.botInfo == self.botInfo && self.peerStatusSettings == other.peerStatusSettings && self.isBlocked == other.isBlocked && self.commonGroupCount == other.commonGroupCount && self.voiceCallsAvailable == other.voiceCallsAvailable && self.videoCallsAvailable == other.videoCallsAvailable && self.callsPrivate == other.callsPrivate && self.hasScheduledMessages == other.hasScheduledMessages && self.autoremoveTimeout == other.autoremoveTimeout && self.themeEmoticon == other.themeEmoticon && self.photo == other.photo && self.premiumGiftOptions == other.premiumGiftOptions && self.voiceMessagesAvailable == other.voiceMessagesAvailable
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedAbout(_ about: String?) -> CachedUserData {
|
public func withUpdatedAbout(_ about: String?) -> CachedUserData {
|
||||||
return CachedUserData(about: about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable, emojiStatus: self.emojiStatus)
|
return CachedUserData(about: about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedBotInfo(_ botInfo: BotInfo?) -> CachedUserData {
|
public func withUpdatedBotInfo(_ botInfo: BotInfo?) -> CachedUserData {
|
||||||
return CachedUserData(about: self.about, botInfo: botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable, emojiStatus: self.emojiStatus)
|
return CachedUserData(about: self.about, botInfo: botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedPeerStatusSettings(_ peerStatusSettings: PeerStatusSettings) -> CachedUserData {
|
public func withUpdatedPeerStatusSettings(_ peerStatusSettings: PeerStatusSettings) -> CachedUserData {
|
||||||
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable, emojiStatus: self.emojiStatus)
|
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedPinnedMessageId(_ pinnedMessageId: MessageId?) -> CachedUserData {
|
public func withUpdatedPinnedMessageId(_ pinnedMessageId: MessageId?) -> CachedUserData {
|
||||||
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable, emojiStatus: self.emojiStatus)
|
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedIsBlocked(_ isBlocked: Bool) -> CachedUserData {
|
public func withUpdatedIsBlocked(_ isBlocked: Bool) -> CachedUserData {
|
||||||
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable, emojiStatus: self.emojiStatus)
|
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedCommonGroupCount(_ commonGroupCount: Int32) -> CachedUserData {
|
public func withUpdatedCommonGroupCount(_ commonGroupCount: Int32) -> CachedUserData {
|
||||||
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable, emojiStatus: self.emojiStatus)
|
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedVoiceCallsAvailable(_ voiceCallsAvailable: Bool) -> CachedUserData {
|
public func withUpdatedVoiceCallsAvailable(_ voiceCallsAvailable: Bool) -> CachedUserData {
|
||||||
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable, emojiStatus: self.emojiStatus)
|
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedVideoCallsAvailable(_ videoCallsAvailable: Bool) -> CachedUserData {
|
public func withUpdatedVideoCallsAvailable(_ videoCallsAvailable: Bool) -> CachedUserData {
|
||||||
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable, emojiStatus: self.emojiStatus)
|
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedCallsPrivate(_ callsPrivate: Bool) -> CachedUserData {
|
public func withUpdatedCallsPrivate(_ callsPrivate: Bool) -> CachedUserData {
|
||||||
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable, emojiStatus: self.emojiStatus)
|
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedCanPinMessages(_ canPinMessages: Bool) -> CachedUserData {
|
public func withUpdatedCanPinMessages(_ canPinMessages: Bool) -> CachedUserData {
|
||||||
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable, emojiStatus: self.emojiStatus)
|
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedHasScheduledMessages(_ hasScheduledMessages: Bool) -> CachedUserData {
|
public func withUpdatedHasScheduledMessages(_ hasScheduledMessages: Bool) -> CachedUserData {
|
||||||
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable, emojiStatus: self.emojiStatus)
|
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedAutoremoveTimeout(_ autoremoveTimeout: CachedPeerAutoremoveTimeout) -> CachedUserData {
|
public func withUpdatedAutoremoveTimeout(_ autoremoveTimeout: CachedPeerAutoremoveTimeout) -> CachedUserData {
|
||||||
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable, emojiStatus: self.emojiStatus)
|
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedThemeEmoticon(_ themeEmoticon: String?) -> CachedUserData {
|
public func withUpdatedThemeEmoticon(_ themeEmoticon: String?) -> CachedUserData {
|
||||||
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable, emojiStatus: self.emojiStatus)
|
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedPhoto(_ photo: TelegramMediaImage?) -> CachedUserData {
|
public func withUpdatedPhoto(_ photo: TelegramMediaImage?) -> CachedUserData {
|
||||||
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable, emojiStatus: self.emojiStatus)
|
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedPremiumGiftOptions(_ premiumGiftOptions: [CachedPremiumGiftOption]) -> CachedUserData {
|
public func withUpdatedPremiumGiftOptions(_ premiumGiftOptions: [CachedPremiumGiftOption]) -> CachedUserData {
|
||||||
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable, emojiStatus: self.emojiStatus)
|
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedVoiceMessagesAvailable(_ voiceMessagesAvailable: Bool) -> CachedUserData {
|
public func withUpdatedVoiceMessagesAvailable(_ voiceMessagesAvailable: Bool) -> CachedUserData {
|
||||||
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: voiceMessagesAvailable, emojiStatus: self.emojiStatus)
|
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: voiceMessagesAvailable)
|
||||||
}
|
|
||||||
|
|
||||||
public func withUpdatedEmojiStatus(_ emojiStatus: PeerEmojiStatus?) -> CachedUserData {
|
|
||||||
return CachedUserData(about: self.about, botInfo: self.botInfo, peerStatusSettings: self.peerStatusSettings, pinnedMessageId: self.pinnedMessageId, isBlocked: self.isBlocked, commonGroupCount: self.commonGroupCount, voiceCallsAvailable: self.voiceCallsAvailable, videoCallsAvailable: self.videoCallsAvailable, callsPrivate: self.callsPrivate, canPinMessages: self.canPinMessages, hasScheduledMessages: self.hasScheduledMessages, autoremoveTimeout: self.autoremoveTimeout, themeEmoticon: self.themeEmoticon, photo: self.photo, premiumGiftOptions: self.premiumGiftOptions, voiceMessagesAvailable: self.voiceMessagesAvailable, emojiStatus: emojiStatus)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,7 @@ public final class TelegramUser: Peer, Equatable {
|
|||||||
public let botInfo: BotUserInfo?
|
public let botInfo: BotUserInfo?
|
||||||
public let restrictionInfo: PeerAccessRestrictionInfo?
|
public let restrictionInfo: PeerAccessRestrictionInfo?
|
||||||
public let flags: UserInfoFlags
|
public let flags: UserInfoFlags
|
||||||
|
public let emojiStatus: PeerEmojiStatus?
|
||||||
|
|
||||||
public var nameOrPhone: String {
|
public var nameOrPhone: String {
|
||||||
if let firstName = self.firstName {
|
if let firstName = self.firstName {
|
||||||
@ -106,7 +107,7 @@ public final class TelegramUser: Peer, Equatable {
|
|||||||
public let associatedPeerId: PeerId? = nil
|
public let associatedPeerId: PeerId? = nil
|
||||||
public let notificationSettingsPeerId: PeerId? = nil
|
public let notificationSettingsPeerId: PeerId? = nil
|
||||||
|
|
||||||
public init(id: PeerId, accessHash: TelegramPeerAccessHash?, firstName: String?, lastName: String?, username: String?, phone: String?, photo: [TelegramMediaImageRepresentation], botInfo: BotUserInfo?, restrictionInfo: PeerAccessRestrictionInfo?, flags: UserInfoFlags) {
|
public init(id: PeerId, accessHash: TelegramPeerAccessHash?, firstName: String?, lastName: String?, username: String?, phone: String?, photo: [TelegramMediaImageRepresentation], botInfo: BotUserInfo?, restrictionInfo: PeerAccessRestrictionInfo?, flags: UserInfoFlags, emojiStatus: PeerEmojiStatus?) {
|
||||||
self.id = id
|
self.id = id
|
||||||
self.accessHash = accessHash
|
self.accessHash = accessHash
|
||||||
self.firstName = firstName
|
self.firstName = firstName
|
||||||
@ -117,6 +118,7 @@ public final class TelegramUser: Peer, Equatable {
|
|||||||
self.botInfo = botInfo
|
self.botInfo = botInfo
|
||||||
self.restrictionInfo = restrictionInfo
|
self.restrictionInfo = restrictionInfo
|
||||||
self.flags = flags
|
self.flags = flags
|
||||||
|
self.emojiStatus = emojiStatus
|
||||||
}
|
}
|
||||||
|
|
||||||
public init(decoder: PostboxDecoder) {
|
public init(decoder: PostboxDecoder) {
|
||||||
@ -151,6 +153,8 @@ public final class TelegramUser: Peer, Equatable {
|
|||||||
self.restrictionInfo = decoder.decodeObjectForKey("ri") as? PeerAccessRestrictionInfo
|
self.restrictionInfo = decoder.decodeObjectForKey("ri") as? PeerAccessRestrictionInfo
|
||||||
|
|
||||||
self.flags = UserInfoFlags(rawValue: decoder.decodeInt32ForKey("fl", orElse: 0))
|
self.flags = UserInfoFlags(rawValue: decoder.decodeInt32ForKey("fl", orElse: 0))
|
||||||
|
|
||||||
|
self.emojiStatus = decoder.decode(PeerEmojiStatus.self, forKey: "emjs")
|
||||||
}
|
}
|
||||||
|
|
||||||
public func encode(_ encoder: PostboxEncoder) {
|
public func encode(_ encoder: PostboxEncoder) {
|
||||||
@ -196,6 +200,12 @@ public final class TelegramUser: Peer, Equatable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
encoder.encodeInt32(self.flags.rawValue, forKey: "fl")
|
encoder.encodeInt32(self.flags.rawValue, forKey: "fl")
|
||||||
|
|
||||||
|
if let emojiStatus = self.emojiStatus {
|
||||||
|
encoder.encode(emojiStatus, forKey: "emjs")
|
||||||
|
} else {
|
||||||
|
encoder.encodeNil(forKey: "emjs")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func isEqual(_ other: Peer) -> Bool {
|
public func isEqual(_ other: Peer) -> Bool {
|
||||||
@ -239,27 +249,33 @@ public final class TelegramUser: Peer, Equatable {
|
|||||||
if lhs.restrictionInfo != rhs.restrictionInfo {
|
if lhs.restrictionInfo != rhs.restrictionInfo {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if lhs.flags != rhs.flags {
|
if lhs.flags != rhs.flags {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
if lhs.emojiStatus != rhs.emojiStatus {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedUsername(_ username:String?) -> TelegramUser {
|
public func withUpdatedUsername(_ username:String?) -> TelegramUser {
|
||||||
return TelegramUser(id: self.id, accessHash: self.accessHash, firstName: self.firstName, lastName: self.lastName, username: username, phone: self.phone, photo: self.photo, botInfo: self.botInfo, restrictionInfo: self.restrictionInfo, flags: self.flags)
|
return TelegramUser(id: self.id, accessHash: self.accessHash, firstName: self.firstName, lastName: self.lastName, username: username, phone: self.phone, photo: self.photo, botInfo: self.botInfo, restrictionInfo: self.restrictionInfo, flags: self.flags, emojiStatus: self.emojiStatus)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedNames(firstName: String?, lastName: String?) -> TelegramUser {
|
public func withUpdatedNames(firstName: String?, lastName: String?) -> TelegramUser {
|
||||||
return TelegramUser(id: self.id, accessHash: self.accessHash, firstName: firstName, lastName: lastName, username: self.username, phone: self.phone, photo: self.photo, botInfo: self.botInfo, restrictionInfo: self.restrictionInfo, flags: self.flags)
|
return TelegramUser(id: self.id, accessHash: self.accessHash, firstName: firstName, lastName: lastName, username: self.username, phone: self.phone, photo: self.photo, botInfo: self.botInfo, restrictionInfo: self.restrictionInfo, flags: self.flags, emojiStatus: self.emojiStatus)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedPhone(_ phone: String?) -> TelegramUser {
|
public func withUpdatedPhone(_ phone: String?) -> TelegramUser {
|
||||||
return TelegramUser(id: self.id, accessHash: self.accessHash, firstName: self.firstName, lastName: self.lastName, username: self.username, phone: phone, photo: self.photo, botInfo: self.botInfo, restrictionInfo: self.restrictionInfo, flags: self.flags)
|
return TelegramUser(id: self.id, accessHash: self.accessHash, firstName: self.firstName, lastName: self.lastName, username: self.username, phone: phone, photo: self.photo, botInfo: self.botInfo, restrictionInfo: self.restrictionInfo, flags: self.flags, emojiStatus: self.emojiStatus)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func withUpdatedPhoto(_ representations: [TelegramMediaImageRepresentation]) -> TelegramUser {
|
public func withUpdatedPhoto(_ representations: [TelegramMediaImageRepresentation]) -> TelegramUser {
|
||||||
return TelegramUser(id: self.id, accessHash: self.accessHash, firstName: self.firstName, lastName: self.lastName, username: self.username, phone: phone, photo: representations, botInfo: self.botInfo, restrictionInfo: self.restrictionInfo, flags: self.flags)
|
return TelegramUser(id: self.id, accessHash: self.accessHash, firstName: self.firstName, lastName: self.lastName, username: self.username, phone: phone, photo: representations, botInfo: self.botInfo, restrictionInfo: self.restrictionInfo, flags: self.flags, emojiStatus: self.emojiStatus)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func withUpdatedEmojiStatus(_ emojiStatus: PeerEmojiStatus?) -> TelegramUser {
|
||||||
|
return TelegramUser(id: self.id, accessHash: self.accessHash, firstName: self.firstName, lastName: self.lastName, username: self.username, phone: phone, photo: self.photo, botInfo: self.botInfo, restrictionInfo: self.restrictionInfo, flags: self.flags, emojiStatus: emojiStatus)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
import SwiftSignalKit
|
import SwiftSignalKit
|
||||||
import Postbox
|
import Postbox
|
||||||
|
import TelegramApi
|
||||||
|
|
||||||
public extension TelegramEngine {
|
public extension TelegramEngine {
|
||||||
final class AccountData {
|
final class AccountData {
|
||||||
@ -56,20 +57,25 @@ public extension TelegramEngine {
|
|||||||
|
|
||||||
public func setEmojiStatus(file: TelegramMediaFile?) -> Signal<Never, NoError> {
|
public func setEmojiStatus(file: TelegramMediaFile?) -> Signal<Never, NoError> {
|
||||||
let peerId = self.account.peerId
|
let peerId = self.account.peerId
|
||||||
|
|
||||||
|
let remoteApply = self.account.network.request(Api.functions.account.updateEmojiStatus(emojiStatus: file.flatMap({ Api.EmojiStatus.emojiStatus(documentId: $0.fileId.id) }) ?? Api.EmojiStatus.emojiStatusEmpty))
|
||||||
|
|> `catch` { _ -> Signal<Api.Bool, NoError> in
|
||||||
|
return .single(.boolFalse)
|
||||||
|
}
|
||||||
|
|> ignoreValues
|
||||||
|
|
||||||
return self.account.postbox.transaction { transaction -> Void in
|
return self.account.postbox.transaction { transaction -> Void in
|
||||||
if let file = file {
|
if let file = file {
|
||||||
transaction.storeMediaIfNotPresent(media: file)
|
transaction.storeMediaIfNotPresent(media: file)
|
||||||
}
|
}
|
||||||
transaction.updatePeerCachedData(peerIds: Set([peerId]), update: { _, current in
|
if let peer = transaction.getPeer(peerId) as? TelegramUser {
|
||||||
guard let current = current as? CachedUserData else {
|
updatePeers(transaction: transaction, peers: [peer.withUpdatedEmojiStatus(file.flatMap({ PeerEmojiStatus(fileId: $0.fileId.id) }))], update: { _, updated in
|
||||||
return current
|
updated
|
||||||
}
|
|
||||||
return current.withUpdatedEmojiStatus(file.flatMap { file -> PeerEmojiStatus in
|
|
||||||
return PeerEmojiStatus(fileId: file.fileId.id)
|
|
||||||
})
|
})
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
|> ignoreValues
|
|> ignoreValues
|
||||||
|
|> then(remoteApply)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -152,7 +152,7 @@ func updateContacts(transaction: Transaction, apiUsers: [Api.User]) {
|
|||||||
for user in apiUsers {
|
for user in apiUsers {
|
||||||
var isContact: Bool?
|
var isContact: Bool?
|
||||||
switch user {
|
switch user {
|
||||||
case let .user(flags, _, _, _, _, _, _, _, _, _, _, _, _):
|
case let .user(flags, _, _, _, _, _, _, _, _, _, _, _, _, _):
|
||||||
if (flags & (1 << 20)) == 0 {
|
if (flags & (1 << 20)) == 0 {
|
||||||
isContact = (flags & (1 << 11)) != 0
|
isContact = (flags & (1 << 11)) != 0
|
||||||
}
|
}
|
||||||
|
@ -179,7 +179,8 @@ public final class EmojiStatusComponent: Component {
|
|||||||
iconImage = generateImage(sourceImage.size, contextGenerator: { size, context in
|
iconImage = generateImage(sourceImage.size, contextGenerator: { size, context in
|
||||||
if let cgImage = sourceImage.cgImage {
|
if let cgImage = sourceImage.cgImage {
|
||||||
context.clear(CGRect(origin: CGPoint(), size: size))
|
context.clear(CGRect(origin: CGPoint(), size: size))
|
||||||
context.clip(to: CGRect(origin: .zero, size: size), mask: cgImage)
|
let imageSize = CGSize(width: sourceImage.size.width - 8.0, height: sourceImage.size.height - 8.0)
|
||||||
|
context.clip(to: CGRect(origin: CGPoint(x: floor((size.width - imageSize.width) / 2.0), y: floor((size.height - imageSize.height) / 2.0)), size: imageSize), mask: cgImage)
|
||||||
|
|
||||||
context.setFillColor(color.cgColor)
|
context.setFillColor(color.cgColor)
|
||||||
context.fill(CGRect(origin: CGPoint(), size: size))
|
context.fill(CGRect(origin: CGPoint(), size: size))
|
||||||
|
@ -338,7 +338,8 @@ public final class EmojiStatusSelectionController: ViewController {
|
|||||||
transition.setFrame(layer: self.cloudShadowLayer1, frame: cloudFrame1)
|
transition.setFrame(layer: self.cloudShadowLayer1, frame: cloudFrame1)
|
||||||
transition.setCornerRadius(layer: self.cloudLayer1, cornerRadius: cloudFrame1.width / 2.0)
|
transition.setCornerRadius(layer: self.cloudLayer1, cornerRadius: cloudFrame1.width / 2.0)
|
||||||
|
|
||||||
transition.setFrame(view: componentView, frame: componentFrame)
|
//transition.setFrame(view: componentView, frame: componentFrame)
|
||||||
|
transition.setFrame(view: componentView, frame: CGRect(origin: componentFrame.origin, size: CGSize(width: componentFrame.width, height: componentFrame.height)))
|
||||||
|
|
||||||
if animateIn {
|
if animateIn {
|
||||||
self.allowsGroupOpacity = true
|
self.allowsGroupOpacity = true
|
||||||
@ -379,13 +380,10 @@ public final class EmojiStatusSelectionController: ViewController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func applyItem(item: EmojiPagerContentComponent.Item?) {
|
private func applyItem(item: EmojiPagerContentComponent.Item?) {
|
||||||
|
self.controller?.dismiss()
|
||||||
|
|
||||||
let _ = (self.context.engine.accountData.setEmojiStatus(file: item?.itemFile)
|
let _ = (self.context.engine.accountData.setEmojiStatus(file: item?.itemFile)
|
||||||
|> deliverOnMainQueue).start(completed: { [weak self] in
|
|> deliverOnMainQueue).start()
|
||||||
guard let strongSelf = self else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
strongSelf.controller?.dismiss()
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,6 +30,120 @@ private let premiumBadgeIcon: UIImage? = generateTintedImage(image: UIImage(bund
|
|||||||
private let featuredBadgeIcon: UIImage? = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Media/PanelBadgeAdd"), color: .white)
|
private let featuredBadgeIcon: UIImage? = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Media/PanelBadgeAdd"), color: .white)
|
||||||
private let lockedBadgeIcon: UIImage? = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Media/PanelBadgeLock"), color: .white)
|
private let lockedBadgeIcon: UIImage? = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Media/PanelBadgeLock"), color: .white)
|
||||||
|
|
||||||
|
private final class WarpView: UIView {
|
||||||
|
private final class WarpPartView: UIView {
|
||||||
|
let cloneView: PortalView
|
||||||
|
|
||||||
|
init?(contentView: PortalSourceView) {
|
||||||
|
guard let cloneView = PortalView(matchPosition: false) else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
self.cloneView = cloneView
|
||||||
|
|
||||||
|
super.init(frame: CGRect())
|
||||||
|
|
||||||
|
self.layer.anchorPoint = CGPoint(x: 0.5, y: 0.0)
|
||||||
|
|
||||||
|
self.clipsToBounds = true
|
||||||
|
self.addSubview(cloneView.view)
|
||||||
|
contentView.addPortal(view: cloneView)
|
||||||
|
}
|
||||||
|
|
||||||
|
required init?(coder: NSCoder) {
|
||||||
|
fatalError("init(coder:) has not been implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func update(containerSize: CGSize, rect: CGRect, transition: Transition) {
|
||||||
|
transition.setFrame(view: self.cloneView.view, frame: CGRect(origin: CGPoint(x: -rect.minX, y: -rect.minY), size: CGSize(width: containerSize.width, height: containerSize.height)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let contentView: PortalSourceView
|
||||||
|
|
||||||
|
private let clippingView: UIView
|
||||||
|
private let overlayView: UIView
|
||||||
|
|
||||||
|
private var warpViews: [WarpPartView] = []
|
||||||
|
|
||||||
|
override init(frame: CGRect) {
|
||||||
|
self.contentView = PortalSourceView()
|
||||||
|
self.clippingView = UIView()
|
||||||
|
self.overlayView = UIView()
|
||||||
|
|
||||||
|
super.init(frame: frame)
|
||||||
|
|
||||||
|
self.clippingView.addSubview(self.contentView)
|
||||||
|
|
||||||
|
self.clippingView.clipsToBounds = false
|
||||||
|
self.addSubview(self.clippingView)
|
||||||
|
|
||||||
|
self.addSubview(self.overlayView)
|
||||||
|
|
||||||
|
for _ in 0 ..< 8 {
|
||||||
|
if let warpView = WarpPartView(contentView: self.contentView) {
|
||||||
|
self.warpViews.append(warpView)
|
||||||
|
self.addSubview(warpView)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
required init?(coder: NSCoder) {
|
||||||
|
fatalError("init(coder:) has not been implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func update(size: CGSize, topInset: CGFloat, warpHeight: CGFloat, theme: PresentationTheme, transition: Transition) {
|
||||||
|
transition.setFrame(view: self.contentView, frame: CGRect(origin: CGPoint(), size: size))
|
||||||
|
|
||||||
|
let frame = CGRect(origin: CGPoint(x: 0.0, y: -topInset), size: CGSize(width: size.width, height: size.height + topInset - warpHeight))
|
||||||
|
transition.setPosition(view: self.clippingView, position: frame.center)
|
||||||
|
transition.setBounds(view: self.clippingView, bounds: CGRect(origin: CGPoint(x: 0.0, y: -topInset + (topInset - warpHeight) * 0.5), size: size))
|
||||||
|
|
||||||
|
let allItemsHeight = warpHeight * 0.5
|
||||||
|
for i in 0 ..< self.warpViews.count {
|
||||||
|
let itemHeight = warpHeight / CGFloat(self.warpViews.count)
|
||||||
|
let itemFraction = CGFloat(i + 1) / CGFloat(self.warpViews.count)
|
||||||
|
let _ = itemHeight
|
||||||
|
|
||||||
|
let da = CGFloat.pi * 0.5 / CGFloat(self.warpViews.count)
|
||||||
|
let alpha = CGFloat.pi * 0.5 - itemFraction * CGFloat.pi * 0.5
|
||||||
|
let endPoint = CGPoint(x: cos(alpha), y: sin(alpha))
|
||||||
|
let prevAngle = alpha + da
|
||||||
|
let prevPt = CGPoint(x: cos(prevAngle), y: sin(prevAngle))
|
||||||
|
var angle: CGFloat
|
||||||
|
angle = -atan2(endPoint.y - prevPt.y, endPoint.x - prevPt.x)
|
||||||
|
|
||||||
|
let itemLengthVector = CGPoint(x: endPoint.x - prevPt.x, y: endPoint.y - prevPt.y)
|
||||||
|
let itemLength = sqrt(itemLengthVector.x * itemLengthVector.x + itemLengthVector.y * itemLengthVector.y) * warpHeight * 0.5
|
||||||
|
let _ = itemLength
|
||||||
|
|
||||||
|
var transform: CATransform3D
|
||||||
|
transform = CATransform3DIdentity
|
||||||
|
transform.m34 = 1.0 / 240.0
|
||||||
|
|
||||||
|
transform = CATransform3DTranslate(transform, 0.0, prevPt.x * allItemsHeight, (1.0 - prevPt.y) * allItemsHeight)
|
||||||
|
transform = CATransform3DRotate(transform, angle, 1.0, 0.0, 0.0)
|
||||||
|
|
||||||
|
//self.warpViews[i].backgroundColor = UIColor(red: 0.0, green: 0.0, blue: CGFloat(i) / CGFloat(self.warpViews.count - 1), alpha: 1.0)
|
||||||
|
//self.warpViews[i].backgroundColor = UIColor(white: 0.0, alpha: 0.5)
|
||||||
|
//self.warpViews[i].backgroundColor = theme.list.plainBackgroundColor
|
||||||
|
|
||||||
|
let positionY = size.height - allItemsHeight + 4.0 + /*warpHeight * cos(alpha)*/ CGFloat(i) * itemLength
|
||||||
|
let rect = CGRect(origin: CGPoint(x: 0.0, y: positionY), size: CGSize(width: size.width, height: itemLength))
|
||||||
|
transition.setPosition(view: self.warpViews[i], position: CGPoint(x: rect.midX, y: size.height - allItemsHeight + 4.0))
|
||||||
|
transition.setBounds(view: self.warpViews[i], bounds: CGRect(origin: CGPoint(), size: CGSize(width: size.width, height: itemLength)))
|
||||||
|
transition.setTransform(view: self.warpViews[i], transform: transform)
|
||||||
|
self.warpViews[i].update(containerSize: size, rect: rect, transition: transition)
|
||||||
|
}
|
||||||
|
|
||||||
|
self.overlayView.backgroundColor = theme.list.plainBackgroundColor
|
||||||
|
transition.setFrame(view: self.overlayView, frame: CGRect(origin: CGPoint(x: 0.0, y: size.height - allItemsHeight + 4.0), size: CGSize(width: size.width, height: allItemsHeight)))
|
||||||
|
}
|
||||||
|
|
||||||
|
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
|
||||||
|
return self.contentView.hitTest(point, with: event)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public final class EntityKeyboardAnimationData: Equatable {
|
public final class EntityKeyboardAnimationData: Equatable {
|
||||||
public enum Id: Hashable {
|
public enum Id: Hashable {
|
||||||
case file(MediaId)
|
case file(MediaId)
|
||||||
@ -1102,7 +1216,7 @@ private final class GroupEmbeddedView: UIScrollView, UIScrollViewDelegate, Pager
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func updateVisibleItems(transition: Transition, attemptSynchronousLoad: Bool) {
|
private func updateVisibleItems(transition: Transition, attemptSynchronousLoad: Bool) {
|
||||||
guard let context = self.context, let itemLayout = self.itemLayout, let items = self.items, let cache = self.cache, let renderer = self.renderer else {
|
guard let context = self.context, let theme = self.theme, let itemLayout = self.itemLayout, let items = self.items, let cache = self.cache, let renderer = self.renderer else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1110,7 +1224,10 @@ private final class GroupEmbeddedView: UIScrollView, UIScrollViewDelegate, Pager
|
|||||||
if let itemRange = itemLayout.visibleItems(for: self.bounds) {
|
if let itemRange = itemLayout.visibleItems(for: self.bounds) {
|
||||||
for index in itemRange.lowerBound ..< itemRange.upperBound {
|
for index in itemRange.lowerBound ..< itemRange.upperBound {
|
||||||
let item = items[index]
|
let item = items[index]
|
||||||
let itemId = EmojiPagerContentComponent.View.ItemLayer.Key(groupId: AnyHashable(0), itemId: item.animationData?.id, staticEmoji: item.staticEmoji)
|
let itemId = EmojiPagerContentComponent.View.ItemLayer.Key(
|
||||||
|
groupId: AnyHashable(0),
|
||||||
|
itemId: item.content.id
|
||||||
|
)
|
||||||
validIds.insert(itemId)
|
validIds.insert(itemId)
|
||||||
|
|
||||||
let itemLayer: EmojiPagerContentComponent.View.ItemLayer
|
let itemLayer: EmojiPagerContentComponent.View.ItemLayer
|
||||||
@ -1121,12 +1238,12 @@ private final class GroupEmbeddedView: UIScrollView, UIScrollViewDelegate, Pager
|
|||||||
item: item,
|
item: item,
|
||||||
context: context,
|
context: context,
|
||||||
attemptSynchronousLoad: attemptSynchronousLoad,
|
attemptSynchronousLoad: attemptSynchronousLoad,
|
||||||
animationData: item.animationData,
|
content: item.content,
|
||||||
staticEmoji: item.staticEmoji,
|
|
||||||
cache: cache,
|
cache: cache,
|
||||||
renderer: renderer,
|
renderer: renderer,
|
||||||
placeholderColor: .clear,
|
placeholderColor: .clear,
|
||||||
blurredBadgeColor: .clear,
|
blurredBadgeColor: .clear,
|
||||||
|
accentIconColor: theme.list.itemAccentColor,
|
||||||
pointSize: CGSize(width: 32.0, height: 32.0),
|
pointSize: CGSize(width: 32.0, height: 32.0),
|
||||||
onUpdateDisplayPlaceholder: { _, _ in
|
onUpdateDisplayPlaceholder: { _, _ in
|
||||||
}
|
}
|
||||||
@ -1386,21 +1503,48 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
case flags = 7
|
case flags = 7
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum ItemContent: Equatable {
|
||||||
|
public enum Id: Hashable {
|
||||||
|
case animation(EntityKeyboardAnimationData.Id)
|
||||||
|
case staticEmoji(String)
|
||||||
|
case icon(Icon)
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum Icon: Equatable {
|
||||||
|
case premiumStar
|
||||||
|
}
|
||||||
|
|
||||||
|
case animation(EntityKeyboardAnimationData)
|
||||||
|
case staticEmoji(String)
|
||||||
|
case icon(Icon)
|
||||||
|
|
||||||
|
public var id: Id {
|
||||||
|
switch self {
|
||||||
|
case let .animation(animation):
|
||||||
|
return .animation(animation.id)
|
||||||
|
case let .staticEmoji(value):
|
||||||
|
return .staticEmoji(value)
|
||||||
|
case let .icon(icon):
|
||||||
|
return .icon(icon)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public final class Item: Equatable {
|
public final class Item: Equatable {
|
||||||
public let animationData: EntityKeyboardAnimationData?
|
public let animationData: EntityKeyboardAnimationData?
|
||||||
|
public let content: ItemContent
|
||||||
public let itemFile: TelegramMediaFile?
|
public let itemFile: TelegramMediaFile?
|
||||||
public let staticEmoji: String?
|
|
||||||
public let subgroupId: Int32?
|
public let subgroupId: Int32?
|
||||||
|
|
||||||
public init(
|
public init(
|
||||||
animationData: EntityKeyboardAnimationData?,
|
animationData: EntityKeyboardAnimationData?,
|
||||||
|
content: ItemContent,
|
||||||
itemFile: TelegramMediaFile?,
|
itemFile: TelegramMediaFile?,
|
||||||
staticEmoji: String?,
|
|
||||||
subgroupId: Int32?
|
subgroupId: Int32?
|
||||||
) {
|
) {
|
||||||
self.animationData = animationData
|
self.animationData = animationData
|
||||||
|
self.content = content
|
||||||
self.itemFile = itemFile
|
self.itemFile = itemFile
|
||||||
self.staticEmoji = staticEmoji
|
|
||||||
self.subgroupId = subgroupId
|
self.subgroupId = subgroupId
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1411,10 +1555,10 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
if lhs.animationData?.resource.resource.id != rhs.animationData?.resource.resource.id {
|
if lhs.animationData?.resource.resource.id != rhs.animationData?.resource.resource.id {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if lhs.itemFile?.fileId != rhs.itemFile?.fileId {
|
if lhs.content != rhs.content {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if lhs.staticEmoji != rhs.staticEmoji {
|
if lhs.itemFile?.fileId != rhs.itemFile?.fileId {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
if lhs.subgroupId != rhs.subgroupId {
|
if lhs.subgroupId != rhs.subgroupId {
|
||||||
@ -1530,6 +1674,7 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
public let inputInteractionHolder: InputInteractionHolder
|
public let inputInteractionHolder: InputInteractionHolder
|
||||||
public let itemGroups: [ItemGroup]
|
public let itemGroups: [ItemGroup]
|
||||||
public let itemLayoutType: ItemLayoutType
|
public let itemLayoutType: ItemLayoutType
|
||||||
|
public let warpContentsOnEdges: Bool
|
||||||
|
|
||||||
public init(
|
public init(
|
||||||
id: AnyHashable,
|
id: AnyHashable,
|
||||||
@ -1539,7 +1684,8 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
animationRenderer: MultiAnimationRenderer,
|
animationRenderer: MultiAnimationRenderer,
|
||||||
inputInteractionHolder: InputInteractionHolder,
|
inputInteractionHolder: InputInteractionHolder,
|
||||||
itemGroups: [ItemGroup],
|
itemGroups: [ItemGroup],
|
||||||
itemLayoutType: ItemLayoutType
|
itemLayoutType: ItemLayoutType,
|
||||||
|
warpContentsOnEdges: Bool
|
||||||
) {
|
) {
|
||||||
self.id = id
|
self.id = id
|
||||||
self.context = context
|
self.context = context
|
||||||
@ -1549,6 +1695,7 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
self.inputInteractionHolder = inputInteractionHolder
|
self.inputInteractionHolder = inputInteractionHolder
|
||||||
self.itemGroups = itemGroups
|
self.itemGroups = itemGroups
|
||||||
self.itemLayoutType = itemLayoutType
|
self.itemLayoutType = itemLayoutType
|
||||||
|
self.warpContentsOnEdges = warpContentsOnEdges
|
||||||
}
|
}
|
||||||
|
|
||||||
public static func ==(lhs: EmojiPagerContentComponent, rhs: EmojiPagerContentComponent) -> Bool {
|
public static func ==(lhs: EmojiPagerContentComponent, rhs: EmojiPagerContentComponent) -> Bool {
|
||||||
@ -1579,6 +1726,9 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
if lhs.itemLayoutType != rhs.itemLayoutType {
|
if lhs.itemLayoutType != rhs.itemLayoutType {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
if lhs.warpContentsOnEdges != rhs.warpContentsOnEdges {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@ -1636,14 +1786,14 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
var premiumButtonInset: CGFloat
|
var premiumButtonInset: CGFloat
|
||||||
var premiumButtonHeight: CGFloat
|
var premiumButtonHeight: CGFloat
|
||||||
|
|
||||||
init(layoutType: ItemLayoutType, width: CGFloat, containerInsets: UIEdgeInsets, itemGroups: [ItemGroupDescription], expandedGroupIds: Set<AnyHashable>) {
|
init(layoutType: ItemLayoutType, width: CGFloat, containerInsets: UIEdgeInsets, itemGroups: [ItemGroupDescription], expandedGroupIds: Set<AnyHashable>, curveNearBounds: Bool) {
|
||||||
self.layoutType = layoutType
|
self.layoutType = layoutType
|
||||||
self.width = width
|
self.width = width
|
||||||
|
|
||||||
self.premiumButtonInset = 6.0
|
self.premiumButtonInset = 6.0
|
||||||
self.premiumButtonHeight = 50.0
|
self.premiumButtonHeight = 50.0
|
||||||
|
|
||||||
self.curveNearBounds = containerInsets.bottom <= 9.0
|
self.curveNearBounds = curveNearBounds
|
||||||
|
|
||||||
let minItemsPerRow: Int
|
let minItemsPerRow: Int
|
||||||
let minSpacing: CGFloat
|
let minSpacing: CGFloat
|
||||||
@ -1878,17 +2028,14 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
public final class ItemLayer: MultiAnimationRenderTarget {
|
public final class ItemLayer: MultiAnimationRenderTarget {
|
||||||
public struct Key: Hashable {
|
public struct Key: Hashable {
|
||||||
var groupId: AnyHashable
|
var groupId: AnyHashable
|
||||||
var itemId: EntityKeyboardAnimationData.Id?
|
var itemId: ItemContent.Id
|
||||||
var staticEmoji: String?
|
|
||||||
|
|
||||||
public init(
|
public init(
|
||||||
groupId: AnyHashable,
|
groupId: AnyHashable,
|
||||||
itemId: EntityKeyboardAnimationData.Id?,
|
itemId: ItemContent.Id
|
||||||
staticEmoji: String?
|
|
||||||
) {
|
) {
|
||||||
self.groupId = groupId
|
self.groupId = groupId
|
||||||
self.itemId = itemId
|
self.itemId = itemId
|
||||||
self.staticEmoji = staticEmoji
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1900,8 +2047,7 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
|
|
||||||
let item: Item
|
let item: Item
|
||||||
|
|
||||||
private let animationData: EntityKeyboardAnimationData?
|
private let content: ItemContent
|
||||||
private let staticEmoji: String?
|
|
||||||
private let placeholderColor: UIColor
|
private let placeholderColor: UIColor
|
||||||
private let size: CGSize
|
private let size: CGSize
|
||||||
private var disposable: Disposable?
|
private var disposable: Disposable?
|
||||||
@ -1926,18 +2072,17 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
item: Item,
|
item: Item,
|
||||||
context: AccountContext,
|
context: AccountContext,
|
||||||
attemptSynchronousLoad: Bool,
|
attemptSynchronousLoad: Bool,
|
||||||
animationData: EntityKeyboardAnimationData?,
|
content: ItemContent,
|
||||||
staticEmoji: String?,
|
|
||||||
cache: AnimationCache,
|
cache: AnimationCache,
|
||||||
renderer: MultiAnimationRenderer,
|
renderer: MultiAnimationRenderer,
|
||||||
placeholderColor: UIColor,
|
placeholderColor: UIColor,
|
||||||
blurredBadgeColor: UIColor,
|
blurredBadgeColor: UIColor,
|
||||||
|
accentIconColor: UIColor,
|
||||||
pointSize: CGSize,
|
pointSize: CGSize,
|
||||||
onUpdateDisplayPlaceholder: @escaping (Bool, Double) -> Void
|
onUpdateDisplayPlaceholder: @escaping (Bool, Double) -> Void
|
||||||
) {
|
) {
|
||||||
self.item = item
|
self.item = item
|
||||||
self.animationData = animationData
|
self.content = content
|
||||||
self.staticEmoji = staticEmoji
|
|
||||||
self.placeholderColor = placeholderColor
|
self.placeholderColor = placeholderColor
|
||||||
self.onUpdateDisplayPlaceholder = onUpdateDisplayPlaceholder
|
self.onUpdateDisplayPlaceholder = onUpdateDisplayPlaceholder
|
||||||
|
|
||||||
@ -1947,7 +2092,8 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
if let animationData = animationData {
|
switch content {
|
||||||
|
case let .animation(animationData):
|
||||||
let loadAnimation: () -> Void = { [weak self] in
|
let loadAnimation: () -> Void = { [weak self] in
|
||||||
guard let strongSelf = self else {
|
guard let strongSelf = self else {
|
||||||
return
|
return
|
||||||
@ -2021,7 +2167,7 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
} else if let staticEmoji = staticEmoji {
|
case let .staticEmoji(staticEmoji):
|
||||||
let image = generateImage(pointSize, opaque: false, scale: min(UIScreenScale, 3.0), rotatedContext: { size, context in
|
let image = generateImage(pointSize, opaque: false, scale: min(UIScreenScale, 3.0), rotatedContext: { size, context in
|
||||||
context.clear(CGRect(origin: CGPoint(), size: size))
|
context.clear(CGRect(origin: CGPoint(), size: size))
|
||||||
|
|
||||||
@ -2038,6 +2184,23 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
UIGraphicsPopContext()
|
UIGraphicsPopContext()
|
||||||
})
|
})
|
||||||
self.contents = image?.cgImage
|
self.contents = image?.cgImage
|
||||||
|
case let .icon(icon):
|
||||||
|
let image = generateImage(pointSize, opaque: false, scale: min(UIScreenScale, 3.0), rotatedContext: { size, context in
|
||||||
|
context.clear(CGRect(origin: CGPoint(), size: size))
|
||||||
|
|
||||||
|
UIGraphicsPushContext(context)
|
||||||
|
|
||||||
|
switch icon {
|
||||||
|
case .premiumStar:
|
||||||
|
if let image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Media/EntityInputPremiumIcon"), color: accentIconColor) {
|
||||||
|
let imageSize = image.size.aspectFitted(CGSize(width: size.width - 8.0, height: size.height - 8.0))
|
||||||
|
image.draw(in: CGRect(origin: CGPoint(x: floor((size.width - imageSize.width) / 2.0), y: floor((size.height - imageSize.height) / 2.0)), size: imageSize))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UIGraphicsPopContext()
|
||||||
|
})
|
||||||
|
self.contents = image?.cgImage
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2048,8 +2211,7 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
|
|
||||||
self.item = layer.item
|
self.item = layer.item
|
||||||
|
|
||||||
self.animationData = layer.animationData
|
self.content = layer.content
|
||||||
self.staticEmoji = layer.staticEmoji
|
|
||||||
self.placeholderColor = layer.placeholderColor
|
self.placeholderColor = layer.placeholderColor
|
||||||
self.size = layer.size
|
self.size = layer.size
|
||||||
|
|
||||||
@ -2260,6 +2422,7 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
private let backgroundView: BlurredBackgroundView
|
private let backgroundView: BlurredBackgroundView
|
||||||
private var vibrancyEffectView: UIVisualEffectView?
|
private var vibrancyEffectView: UIVisualEffectView?
|
||||||
private let mirrorContentScrollView: UIView
|
private let mirrorContentScrollView: UIView
|
||||||
|
private var warpView: WarpView?
|
||||||
private let scrollView: ContentScrollView
|
private let scrollView: ContentScrollView
|
||||||
private var scrollGradientLayer: SimpleGradientLayer?
|
private var scrollGradientLayer: SimpleGradientLayer?
|
||||||
private let boundsChangeTrackerLayer = SimpleLayer()
|
private let boundsChangeTrackerLayer = SimpleLayer()
|
||||||
@ -2485,12 +2648,6 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let _ = strongSelf
|
let _ = strongSelf
|
||||||
|
|
||||||
/*var item: StickerPreviewPeekItem?
|
|
||||||
if let content = content as? StickerPreviewPeekContent {
|
|
||||||
item = content.item
|
|
||||||
}
|
|
||||||
strongSelf.updatePreviewingItem(item: item, animated: true)*/
|
|
||||||
})
|
})
|
||||||
self.peekRecognizer = peekRecognizer
|
self.peekRecognizer = peekRecognizer
|
||||||
self.addGestureRecognizer(peekRecognizer)
|
self.addGestureRecognizer(peekRecognizer)
|
||||||
@ -2501,6 +2658,28 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
fatalError("init(coder:) has not been implemented")
|
fatalError("init(coder:) has not been implemented")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func updateIsWarpEnabled(isEnabled: Bool) {
|
||||||
|
if isEnabled {
|
||||||
|
let warpView: WarpView
|
||||||
|
if let current = self.warpView {
|
||||||
|
warpView = current
|
||||||
|
} else {
|
||||||
|
warpView = WarpView(frame: CGRect())
|
||||||
|
self.warpView = warpView
|
||||||
|
|
||||||
|
self.insertSubview(warpView, aboveSubview: self.scrollView)
|
||||||
|
warpView.contentView.addSubview(self.scrollView)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if let warpView = self.warpView {
|
||||||
|
self.warpView = nil
|
||||||
|
|
||||||
|
self.insertSubview(self.scrollView, aboveSubview: warpView)
|
||||||
|
warpView.removeFromSuperview()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public func matches(tag: Any) -> Bool {
|
public func matches(tag: Any) -> Bool {
|
||||||
if let tag = tag as? Tag {
|
if let tag = tag as? Tag {
|
||||||
if tag.id == self.component?.id {
|
if tag.id == self.component?.id {
|
||||||
@ -3457,7 +3636,10 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let itemId = ItemLayer.Key(groupId: itemGroup.groupId, itemId: item.animationData?.id, staticEmoji: item.staticEmoji)
|
let itemId = ItemLayer.Key(
|
||||||
|
groupId: itemGroup.groupId,
|
||||||
|
itemId: item.content.id
|
||||||
|
)
|
||||||
validIds.insert(itemId)
|
validIds.insert(itemId)
|
||||||
|
|
||||||
let itemDimensions: CGSize = item.animationData?.dimensions ?? CGSize(width: 512.0, height: 512.0)
|
let itemDimensions: CGSize = item.animationData?.dimensions ?? CGSize(width: 512.0, height: 512.0)
|
||||||
@ -3477,18 +3659,25 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
itemTransition = .immediate
|
itemTransition = .immediate
|
||||||
animateItemIn = !transition.animation.isImmediate
|
animateItemIn = !transition.animation.isImmediate
|
||||||
|
|
||||||
|
let pointSize: CGSize
|
||||||
|
if case .staticEmoji = item.content {
|
||||||
|
pointSize = itemVisibleFitSize
|
||||||
|
} else {
|
||||||
|
pointSize = itemPlaybackSize
|
||||||
|
}
|
||||||
|
|
||||||
let placeholderColor = keyboardChildEnvironment.theme.chat.inputPanel.primaryTextColor.withMultipliedAlpha(0.1)
|
let placeholderColor = keyboardChildEnvironment.theme.chat.inputPanel.primaryTextColor.withMultipliedAlpha(0.1)
|
||||||
itemLayer = ItemLayer(
|
itemLayer = ItemLayer(
|
||||||
item: item,
|
item: item,
|
||||||
context: component.context,
|
context: component.context,
|
||||||
attemptSynchronousLoad: attemptSynchronousLoads,
|
attemptSynchronousLoad: attemptSynchronousLoads,
|
||||||
animationData: item.animationData,
|
content: item.content,
|
||||||
staticEmoji: item.staticEmoji,
|
|
||||||
cache: component.animationCache,
|
cache: component.animationCache,
|
||||||
renderer: component.animationRenderer,
|
renderer: component.animationRenderer,
|
||||||
placeholderColor: placeholderColor,
|
placeholderColor: placeholderColor,
|
||||||
blurredBadgeColor: keyboardChildEnvironment.theme.chat.inputPanel.panelBackgroundColor.withMultipliedAlpha(0.5),
|
blurredBadgeColor: keyboardChildEnvironment.theme.chat.inputPanel.panelBackgroundColor.withMultipliedAlpha(0.5),
|
||||||
pointSize: item.staticEmoji == nil ? itemPlaybackSize : itemVisibleFitSize,
|
accentIconColor: keyboardChildEnvironment.theme.list.itemAccentColor,
|
||||||
|
pointSize: pointSize,
|
||||||
onUpdateDisplayPlaceholder: { [weak self] displayPlaceholder, duration in
|
onUpdateDisplayPlaceholder: { [weak self] displayPlaceholder, duration in
|
||||||
guard let strongSelf = self else {
|
guard let strongSelf = self else {
|
||||||
return
|
return
|
||||||
@ -3536,6 +3725,7 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
//itemLayer.backgroundColor = UIColor.lightGray.cgColor
|
||||||
self.scrollView.layer.addSublayer(itemLayer)
|
self.scrollView.layer.addSublayer(itemLayer)
|
||||||
self.visibleItemLayers[itemId] = itemLayer
|
self.visibleItemLayers[itemId] = itemLayer
|
||||||
}
|
}
|
||||||
@ -3566,7 +3756,7 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
let itemPosition = CGPoint(x: itemFrame.midX, y: itemFrame.midY)
|
let itemPosition = CGPoint(x: itemFrame.midX, y: itemFrame.midY)
|
||||||
itemTransition.setPosition(layer: itemLayer, position: itemPosition)
|
itemTransition.setPosition(layer: itemLayer, position: itemPosition)
|
||||||
|
|
||||||
if itemLayout.curveNearBounds {
|
if itemLayout.curveNearBounds && !"".isEmpty {
|
||||||
let fractionLength: CGFloat = itemFrame.height
|
let fractionLength: CGFloat = itemFrame.height
|
||||||
let rotationX: CGFloat = 1.0 - max(0.0, min(1.0, (effectiveVisibleBounds.maxY + 4.0 + itemFrame.height / 2.0 - itemPosition.y) / fractionLength))
|
let rotationX: CGFloat = 1.0 - max(0.0, min(1.0, (effectiveVisibleBounds.maxY + 4.0 + itemFrame.height / 2.0 - itemPosition.y) / fractionLength))
|
||||||
if rotationX.isZero {
|
if rotationX.isZero {
|
||||||
@ -3583,8 +3773,12 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
|
|
||||||
transform = CATransform3DTranslate(transform, -centralOffset * 2.0, 0.0, 0.0)
|
transform = CATransform3DTranslate(transform, -centralOffset * 2.0, 0.0, 0.0)
|
||||||
|
|
||||||
transform = CATransform3DTranslate(transform, 0.0, -rotationX * itemFrame.height * 0.5, 0.0)
|
let rotationAngle = CGFloat.pi * 0.5 * rotationX
|
||||||
transform = CATransform3DRotate(transform, CGFloat.pi * 0.5 * rotationX, 1.0, 0.0, 0.0)
|
let rotationOffset = sin(rotationAngle)
|
||||||
|
let zOffset: CGFloat = 0.0
|
||||||
|
|
||||||
|
transform = CATransform3DTranslate(transform, 0.0, -rotationOffset * itemFrame.height * 0.5, -zOffset * itemFrame.height * 0.5)
|
||||||
|
transform = CATransform3DRotate(transform, rotationAngle, 1.0, 0.0, 0.0)
|
||||||
itemTransition.setTransform(layer: itemLayer, transform: transform)
|
itemTransition.setTransform(layer: itemLayer, transform: transform)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3815,7 +4009,7 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
self.layer.addSublayer(scrollGradientLayer)
|
self.layer.addSublayer(scrollGradientLayer)
|
||||||
}
|
}
|
||||||
|
|
||||||
let gradientHeight: CGFloat = 20.0
|
let gradientHeight: CGFloat = 6.0
|
||||||
transition.setFrame(layer: scrollGradientLayer, frame: CGRect(origin: CGPoint(x: 0.0, y: effectiveVisibleBounds.height - gradientHeight), size: CGSize(width: effectiveVisibleBounds.width, height: gradientHeight)))
|
transition.setFrame(layer: scrollGradientLayer, frame: CGRect(origin: CGPoint(x: 0.0, y: effectiveVisibleBounds.height - gradientHeight), size: CGSize(width: effectiveVisibleBounds.width, height: gradientHeight)))
|
||||||
//let fractionLength: CGFloat = 20.0
|
//let fractionLength: CGFloat = 20.0
|
||||||
//transition.setAlpha(layer: scrollGradientLayer, alpha: max(0.0, min(1.0, (itemLayout.contentSize.height - effectiveVisibleBounds.maxY) / fractionLength)))
|
//transition.setAlpha(layer: scrollGradientLayer, alpha: max(0.0, min(1.0, (itemLayout.contentSize.height - effectiveVisibleBounds.maxY) / fractionLength)))
|
||||||
@ -3851,11 +4045,11 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public func pagerUpdateBackground(backgroundFrame: CGRect, transition: Transition) {
|
public func pagerUpdateBackground(backgroundFrame: CGRect, transition: Transition) {
|
||||||
guard let keyboardChildEnvironment = self.keyboardChildEnvironment else {
|
guard let component = self.component, let keyboardChildEnvironment = self.keyboardChildEnvironment else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if keyboardChildEnvironment.theme.overallDarkAppearance {
|
if keyboardChildEnvironment.theme.overallDarkAppearance || component.warpContentsOnEdges {
|
||||||
if let vibrancyEffectView = self.vibrancyEffectView {
|
if let vibrancyEffectView = self.vibrancyEffectView {
|
||||||
self.vibrancyEffectView = nil
|
self.vibrancyEffectView = nil
|
||||||
vibrancyEffectView.removeFromSuperview()
|
vibrancyEffectView.removeFromSuperview()
|
||||||
@ -3901,6 +4095,8 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
|
|
||||||
self.pagerEnvironment = pagerEnvironment
|
self.pagerEnvironment = pagerEnvironment
|
||||||
|
|
||||||
|
self.updateIsWarpEnabled(isEnabled: component.warpContentsOnEdges)
|
||||||
|
|
||||||
if let shimmerHostView = self.shimmerHostView {
|
if let shimmerHostView = self.shimmerHostView {
|
||||||
transition.setFrame(view: shimmerHostView, frame: CGRect(origin: CGPoint(), size: availableSize))
|
transition.setFrame(view: shimmerHostView, frame: CGRect(origin: CGPoint(), size: availableSize))
|
||||||
}
|
}
|
||||||
@ -3944,13 +4140,10 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
for itemIndex in 0 ..< itemGroup.items.count {
|
for itemIndex in 0 ..< itemGroup.items.count {
|
||||||
let item = itemGroup.items[itemIndex]
|
let item = itemGroup.items[itemIndex]
|
||||||
let itemKey: ItemLayer.Key
|
let itemKey: ItemLayer.Key
|
||||||
if let animationData = item.animationData {
|
itemKey = ItemLayer.Key(
|
||||||
itemKey = ItemLayer.Key(groupId: itemGroup.groupId, itemId: animationData.id, staticEmoji: nil)
|
groupId: itemGroup.groupId,
|
||||||
} else if let staticEmoji = item.staticEmoji {
|
itemId: item.content.id
|
||||||
itemKey = ItemLayer.Key(groupId: itemGroup.groupId, itemId: nil, staticEmoji: staticEmoji)
|
)
|
||||||
} else {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
let itemFrame = previousItemLayout.frame(groupIndex: groupIndex, itemIndex: itemIndex)
|
let itemFrame = previousItemLayout.frame(groupIndex: groupIndex, itemIndex: itemIndex)
|
||||||
previousItemPositionsValue[.item(id: itemKey)] = CGPoint(x: itemFrame.midX, y: itemFrame.midY)
|
previousItemPositionsValue[.item(id: itemKey)] = CGPoint(x: itemFrame.midX, y: itemFrame.midY)
|
||||||
}
|
}
|
||||||
@ -4056,7 +4249,8 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
width: availableSize.width,
|
width: availableSize.width,
|
||||||
containerInsets: UIEdgeInsets(top: pagerEnvironment.containerInsets.top + 9.0, left: pagerEnvironment.containerInsets.left, bottom: 9.0 + pagerEnvironment.containerInsets.bottom, right: pagerEnvironment.containerInsets.right),
|
containerInsets: UIEdgeInsets(top: pagerEnvironment.containerInsets.top + 9.0, left: pagerEnvironment.containerInsets.left, bottom: 9.0 + pagerEnvironment.containerInsets.bottom, right: pagerEnvironment.containerInsets.right),
|
||||||
itemGroups: itemGroups,
|
itemGroups: itemGroups,
|
||||||
expandedGroupIds: self.expandedGroupIds
|
expandedGroupIds: self.expandedGroupIds,
|
||||||
|
curveNearBounds: component.warpContentsOnEdges
|
||||||
)
|
)
|
||||||
if let previousItemLayout = self.itemLayout {
|
if let previousItemLayout = self.itemLayout {
|
||||||
if previousItemLayout.width != itemLayout.width {
|
if previousItemLayout.width != itemLayout.width {
|
||||||
@ -4074,6 +4268,12 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
let previousSize = self.scrollView.bounds.size
|
let previousSize = self.scrollView.bounds.size
|
||||||
self.scrollView.bounds = CGRect(origin: self.scrollView.bounds.origin, size: availableSize)
|
self.scrollView.bounds = CGRect(origin: self.scrollView.bounds.origin, size: availableSize)
|
||||||
|
|
||||||
|
if let warpView = self.warpView {
|
||||||
|
transition.setFrame(view: warpView, frame: CGRect(origin: CGPoint(x: 0.0, y: 0.0), size: availableSize))
|
||||||
|
let warpHeight: CGFloat = 50.0
|
||||||
|
warpView.update(size: CGSize(width: availableSize.width, height: availableSize.height), topInset: pagerEnvironment.containerInsets.top, warpHeight: warpHeight, theme: keyboardChildEnvironment.theme, transition: transition)
|
||||||
|
}
|
||||||
|
|
||||||
if availableSize.height > previousSize.height || transition.animation.isImmediate {
|
if availableSize.height > previousSize.height || transition.animation.isImmediate {
|
||||||
self.boundsChangeTrackerLayer.removeAllAnimations()
|
self.boundsChangeTrackerLayer.removeAllAnimations()
|
||||||
self.boundsChangeTrackerLayer.bounds = self.scrollView.bounds
|
self.boundsChangeTrackerLayer.bounds = self.scrollView.bounds
|
||||||
@ -4117,13 +4317,10 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
}
|
}
|
||||||
for j in 0 ..< component.itemGroups[i].items.count {
|
for j in 0 ..< component.itemGroups[i].items.count {
|
||||||
let itemKey: ItemLayer.Key
|
let itemKey: ItemLayer.Key
|
||||||
if let animationData = component.itemGroups[i].items[j].animationData {
|
itemKey = ItemLayer.Key(
|
||||||
itemKey = ItemLayer.Key(groupId: component.itemGroups[i].groupId, itemId: animationData.id, staticEmoji: nil)
|
groupId: component.itemGroups[i].groupId,
|
||||||
} else if let staticEmoji = component.itemGroups[i].items[j].staticEmoji {
|
itemId: component.itemGroups[i].items[j].content.id
|
||||||
itemKey = ItemLayer.Key(groupId: component.itemGroups[i].groupId, itemId: nil, staticEmoji: staticEmoji)
|
)
|
||||||
} else {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if itemKey == anchorItem.0 {
|
if itemKey == anchorItem.0 {
|
||||||
let itemFrame = itemLayout.frame(groupIndex: i, itemIndex: j)
|
let itemFrame = itemLayout.frame(groupIndex: i, itemIndex: j)
|
||||||
@ -4159,13 +4356,11 @@ public final class EmojiPagerContentComponent: Component {
|
|||||||
for itemIndex in 0 ..< itemGroup.items.count {
|
for itemIndex in 0 ..< itemGroup.items.count {
|
||||||
let item = itemGroup.items[itemIndex]
|
let item = itemGroup.items[itemIndex]
|
||||||
let itemKey: ItemLayer.Key
|
let itemKey: ItemLayer.Key
|
||||||
if let animationData = item.animationData {
|
itemKey = ItemLayer.Key(
|
||||||
itemKey = ItemLayer.Key(groupId: itemGroup.groupId, itemId: animationData.id, staticEmoji: nil)
|
groupId: itemGroup.groupId,
|
||||||
} else if let staticEmoji = item.staticEmoji {
|
itemId: item.content.id
|
||||||
itemKey = ItemLayer.Key(groupId: itemGroup.groupId, itemId: nil, staticEmoji: staticEmoji)
|
)
|
||||||
} else {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
let itemFrame = itemLayout.frame(groupIndex: groupIndex, itemIndex: itemIndex)
|
let itemFrame = itemLayout.frame(groupIndex: groupIndex, itemIndex: itemIndex)
|
||||||
updatedItemPositionsValue[.item(id: itemKey)] = CGPoint(x: itemFrame.midX, y: itemFrame.midY)
|
updatedItemPositionsValue[.item(id: itemKey)] = CGPoint(x: itemFrame.midX, y: itemFrame.midY)
|
||||||
}
|
}
|
||||||
|
@ -112,18 +112,18 @@ final class EntityKeyboardAnimationTopPanelComponent: Component {
|
|||||||
let itemLayer = EmojiPagerContentComponent.View.ItemLayer(
|
let itemLayer = EmojiPagerContentComponent.View.ItemLayer(
|
||||||
item: EmojiPagerContentComponent.Item(
|
item: EmojiPagerContentComponent.Item(
|
||||||
animationData: component.item,
|
animationData: component.item,
|
||||||
|
content: .animation(component.item),
|
||||||
itemFile: nil,
|
itemFile: nil,
|
||||||
staticEmoji: nil,
|
|
||||||
subgroupId: nil
|
subgroupId: nil
|
||||||
),
|
),
|
||||||
context: component.context,
|
context: component.context,
|
||||||
attemptSynchronousLoad: false,
|
attemptSynchronousLoad: false,
|
||||||
animationData: component.item,
|
content: .animation(component.item),
|
||||||
staticEmoji: nil,
|
|
||||||
cache: component.animationCache,
|
cache: component.animationCache,
|
||||||
renderer: component.animationRenderer,
|
renderer: component.animationRenderer,
|
||||||
placeholderColor: .lightGray,
|
placeholderColor: .lightGray,
|
||||||
blurredBadgeColor: .clear,
|
blurredBadgeColor: .clear,
|
||||||
|
accentIconColor: component.theme.list.itemAccentColor,
|
||||||
pointSize: displaySize,
|
pointSize: displaySize,
|
||||||
onUpdateDisplayPlaceholder: { [weak self] displayPlaceholder, duration in
|
onUpdateDisplayPlaceholder: { [weak self] displayPlaceholder, duration in
|
||||||
guard let strongSelf = self else {
|
guard let strongSelf = self else {
|
||||||
|
@ -103,7 +103,7 @@ final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
return hasPremium
|
return hasPremium
|
||||||
}
|
}
|
||||||
|
|
||||||
static func emojiInputData(context: AccountContext, animationCache: AnimationCache, animationRenderer: MultiAnimationRenderer, isStandalone: Bool, areUnicodeEmojiEnabled: Bool, areCustomEmojiEnabled: Bool, chatPeerId: EnginePeer.Id?) -> Signal<EmojiPagerContentComponent, NoError> {
|
static func emojiInputData(context: AccountContext, animationCache: AnimationCache, animationRenderer: MultiAnimationRenderer, isStandalone: Bool, isReactionSelection: Bool, areUnicodeEmojiEnabled: Bool, areCustomEmojiEnabled: Bool, chatPeerId: EnginePeer.Id?) -> Signal<EmojiPagerContentComponent, NoError> {
|
||||||
let premiumConfiguration = PremiumConfiguration.with(appConfiguration: context.currentAppConfiguration.with { $0 })
|
let premiumConfiguration = PremiumConfiguration.with(appConfiguration: context.currentAppConfiguration.with { $0 })
|
||||||
let isPremiumDisabled = premiumConfiguration.isPremiumDisabled
|
let isPremiumDisabled = premiumConfiguration.isPremiumDisabled
|
||||||
|
|
||||||
@ -118,7 +118,7 @@ final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
struct ItemGroup {
|
struct ItemGroup {
|
||||||
var supergroupId: AnyHashable
|
var supergroupId: AnyHashable
|
||||||
var id: AnyHashable
|
var id: AnyHashable
|
||||||
var title: String
|
var title: String?
|
||||||
var subtitle: String?
|
var subtitle: String?
|
||||||
var isPremiumLocked: Bool
|
var isPremiumLocked: Bool
|
||||||
var isFeatured: Bool
|
var isFeatured: Bool
|
||||||
@ -136,6 +136,23 @@ final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if isReactionSelection {
|
||||||
|
let resultItem = EmojiPagerContentComponent.Item(
|
||||||
|
animationData: nil,
|
||||||
|
content: .icon(.premiumStar),
|
||||||
|
itemFile: nil,
|
||||||
|
subgroupId: nil
|
||||||
|
)
|
||||||
|
|
||||||
|
let groupId = "recent"
|
||||||
|
if let groupIndex = itemGroupIndexById[groupId] {
|
||||||
|
itemGroups[groupIndex].items.append(resultItem)
|
||||||
|
} else {
|
||||||
|
itemGroupIndexById[groupId] = itemGroups.count
|
||||||
|
itemGroups.append(ItemGroup(supergroupId: groupId, id: groupId, title: nil, subtitle: nil, isPremiumLocked: false, isFeatured: false, isExpandable: false, headerItem: nil, items: [resultItem]))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let recentEmoji = recentEmoji {
|
if let recentEmoji = recentEmoji {
|
||||||
for item in recentEmoji.items {
|
for item in recentEmoji.items {
|
||||||
guard let item = item.contents.get(RecentEmojiItem.self) else {
|
guard let item = item.contents.get(RecentEmojiItem.self) else {
|
||||||
@ -153,17 +170,18 @@ final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
let resultItem: EmojiPagerContentComponent.Item
|
let resultItem: EmojiPagerContentComponent.Item
|
||||||
switch item.content {
|
switch item.content {
|
||||||
case let .file(file):
|
case let .file(file):
|
||||||
|
let animationData = EntityKeyboardAnimationData(file: file)
|
||||||
resultItem = EmojiPagerContentComponent.Item(
|
resultItem = EmojiPagerContentComponent.Item(
|
||||||
animationData: EntityKeyboardAnimationData(file: file),
|
animationData: animationData,
|
||||||
|
content: .animation(animationData),
|
||||||
itemFile: file,
|
itemFile: file,
|
||||||
staticEmoji: nil,
|
|
||||||
subgroupId: nil
|
subgroupId: nil
|
||||||
)
|
)
|
||||||
case let .text(text):
|
case let .text(text):
|
||||||
resultItem = EmojiPagerContentComponent.Item(
|
resultItem = EmojiPagerContentComponent.Item(
|
||||||
animationData: nil,
|
animationData: nil,
|
||||||
|
content: .staticEmoji(text),
|
||||||
itemFile: nil,
|
itemFile: nil,
|
||||||
staticEmoji: text,
|
|
||||||
subgroupId: nil
|
subgroupId: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -184,8 +202,8 @@ final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
for emojiString in list {
|
for emojiString in list {
|
||||||
let resultItem = EmojiPagerContentComponent.Item(
|
let resultItem = EmojiPagerContentComponent.Item(
|
||||||
animationData: nil,
|
animationData: nil,
|
||||||
|
content: .staticEmoji(emojiString),
|
||||||
itemFile: nil,
|
itemFile: nil,
|
||||||
staticEmoji: emojiString,
|
|
||||||
subgroupId: subgroupId.rawValue
|
subgroupId: subgroupId.rawValue
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -209,10 +227,11 @@ final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
guard let item = entry.item as? StickerPackItem else {
|
guard let item = entry.item as? StickerPackItem else {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
let animationData = EntityKeyboardAnimationData(file: item.file)
|
||||||
let resultItem = EmojiPagerContentComponent.Item(
|
let resultItem = EmojiPagerContentComponent.Item(
|
||||||
animationData: EntityKeyboardAnimationData(file: item.file),
|
animationData: animationData,
|
||||||
|
content: .animation(animationData),
|
||||||
itemFile: item.file,
|
itemFile: item.file,
|
||||||
staticEmoji: nil,
|
|
||||||
subgroupId: nil
|
subgroupId: nil
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -266,10 +285,11 @@ final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for item in featuredEmojiPack.topItems {
|
for item in featuredEmojiPack.topItems {
|
||||||
|
let animationData = EntityKeyboardAnimationData(file: item.file)
|
||||||
let resultItem = EmojiPagerContentComponent.Item(
|
let resultItem = EmojiPagerContentComponent.Item(
|
||||||
animationData: EntityKeyboardAnimationData(file: item.file),
|
animationData: animationData,
|
||||||
|
content: .animation(animationData),
|
||||||
itemFile: item.file,
|
itemFile: item.file,
|
||||||
staticEmoji: nil,
|
|
||||||
subgroupId: nil
|
subgroupId: nil
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -360,7 +380,8 @@ final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
items: group.items
|
items: group.items
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
itemLayoutType: .compact
|
itemLayoutType: .compact,
|
||||||
|
warpContentsOnEdges: isReactionSelection
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
return emojiItems
|
return emojiItems
|
||||||
@ -380,7 +401,7 @@ final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
animationRenderer = MultiAnimationRendererImpl()
|
animationRenderer = MultiAnimationRendererImpl()
|
||||||
//}
|
//}
|
||||||
|
|
||||||
let emojiItems = emojiInputData(context: context, animationCache: animationCache, animationRenderer: animationRenderer, isStandalone: false, areUnicodeEmojiEnabled: true, areCustomEmojiEnabled: areCustomEmojiEnabled, chatPeerId: chatPeerId)
|
let emojiItems = emojiInputData(context: context, animationCache: animationCache, animationRenderer: animationRenderer, isStandalone: false, isReactionSelection: false, areUnicodeEmojiEnabled: true, areCustomEmojiEnabled: areCustomEmojiEnabled, chatPeerId: chatPeerId)
|
||||||
|
|
||||||
let stickerNamespaces: [ItemCollectionId.Namespace] = [Namespaces.ItemCollection.CloudStickerPacks]
|
let stickerNamespaces: [ItemCollectionId.Namespace] = [Namespaces.ItemCollection.CloudStickerPacks]
|
||||||
let stickerOrderedItemListCollectionIds: [Int32] = [Namespaces.OrderedItemList.CloudSavedStickers, Namespaces.OrderedItemList.CloudRecentStickers, Namespaces.OrderedItemList.CloudAllPremiumStickers]
|
let stickerOrderedItemListCollectionIds: [Int32] = [Namespaces.OrderedItemList.CloudSavedStickers, Namespaces.OrderedItemList.CloudRecentStickers, Namespaces.OrderedItemList.CloudAllPremiumStickers]
|
||||||
@ -485,10 +506,11 @@ final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let animationData = EntityKeyboardAnimationData(file: item.file)
|
||||||
let resultItem = EmojiPagerContentComponent.Item(
|
let resultItem = EmojiPagerContentComponent.Item(
|
||||||
animationData: EntityKeyboardAnimationData(file: item.file),
|
animationData: animationData,
|
||||||
|
content: .animation(animationData),
|
||||||
itemFile: item.file,
|
itemFile: item.file,
|
||||||
staticEmoji: nil,
|
|
||||||
subgroupId: nil
|
subgroupId: nil
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -520,10 +542,11 @@ final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let animationData = EntityKeyboardAnimationData(file: item.file)
|
||||||
let resultItem = EmojiPagerContentComponent.Item(
|
let resultItem = EmojiPagerContentComponent.Item(
|
||||||
animationData: EntityKeyboardAnimationData(file: item.file),
|
animationData: animationData,
|
||||||
|
content: .animation(animationData),
|
||||||
itemFile: item.file,
|
itemFile: item.file,
|
||||||
staticEmoji: nil,
|
|
||||||
subgroupId: nil
|
subgroupId: nil
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -546,10 +569,11 @@ final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let animationData = EntityKeyboardAnimationData(file: item.media)
|
||||||
let resultItem = EmojiPagerContentComponent.Item(
|
let resultItem = EmojiPagerContentComponent.Item(
|
||||||
animationData: EntityKeyboardAnimationData(file: item.media),
|
animationData: animationData,
|
||||||
|
content: .animation(animationData),
|
||||||
itemFile: item.media,
|
itemFile: item.media,
|
||||||
staticEmoji: nil,
|
|
||||||
subgroupId: nil
|
subgroupId: nil
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -595,10 +619,11 @@ final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
}
|
}
|
||||||
processedIds.insert(item.file.fileId)
|
processedIds.insert(item.file.fileId)
|
||||||
|
|
||||||
|
let animationData = EntityKeyboardAnimationData(file: item.file)
|
||||||
let resultItem = EmojiPagerContentComponent.Item(
|
let resultItem = EmojiPagerContentComponent.Item(
|
||||||
animationData: EntityKeyboardAnimationData(file: item.file),
|
animationData: animationData,
|
||||||
|
content: .animation(animationData),
|
||||||
itemFile: item.file,
|
itemFile: item.file,
|
||||||
staticEmoji: nil,
|
|
||||||
subgroupId: nil
|
subgroupId: nil
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -626,10 +651,11 @@ final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
}
|
}
|
||||||
processedIds.insert(item.file.fileId)
|
processedIds.insert(item.file.fileId)
|
||||||
|
|
||||||
|
let animationData = EntityKeyboardAnimationData(file: item.file)
|
||||||
let resultItem = EmojiPagerContentComponent.Item(
|
let resultItem = EmojiPagerContentComponent.Item(
|
||||||
animationData: EntityKeyboardAnimationData(file: item.file),
|
animationData: animationData,
|
||||||
|
content: .animation(animationData),
|
||||||
itemFile: item.file,
|
itemFile: item.file,
|
||||||
staticEmoji: nil,
|
|
||||||
subgroupId: nil
|
subgroupId: nil
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -647,10 +673,11 @@ final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
guard let item = entry.item as? StickerPackItem else {
|
guard let item = entry.item as? StickerPackItem else {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
let animationData = EntityKeyboardAnimationData(file: item.file)
|
||||||
let resultItem = EmojiPagerContentComponent.Item(
|
let resultItem = EmojiPagerContentComponent.Item(
|
||||||
animationData: EntityKeyboardAnimationData(file: item.file),
|
animationData: animationData,
|
||||||
|
content: .animation(animationData),
|
||||||
itemFile: item.file,
|
itemFile: item.file,
|
||||||
staticEmoji: nil,
|
|
||||||
subgroupId: nil
|
subgroupId: nil
|
||||||
)
|
)
|
||||||
let groupId = entry.index.collectionId
|
let groupId = entry.index.collectionId
|
||||||
@ -697,10 +724,11 @@ final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for item in featuredStickerPack.topItems {
|
for item in featuredStickerPack.topItems {
|
||||||
|
let animationData = EntityKeyboardAnimationData(file: item.file)
|
||||||
let resultItem = EmojiPagerContentComponent.Item(
|
let resultItem = EmojiPagerContentComponent.Item(
|
||||||
animationData: EntityKeyboardAnimationData(file: item.file),
|
animationData: animationData,
|
||||||
|
content: .animation(animationData),
|
||||||
itemFile: item.file,
|
itemFile: item.file,
|
||||||
staticEmoji: nil,
|
|
||||||
subgroupId: nil
|
subgroupId: nil
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -778,7 +806,8 @@ final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
items: group.items
|
items: group.items
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
itemLayoutType: .detailed
|
itemLayoutType: .detailed,
|
||||||
|
warpContentsOnEdges: false
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1256,7 +1285,7 @@ final class ChatEntityKeyboardInputNode: ChatInputNode {
|
|||||||
AudioServicesPlaySystemSound(0x450)
|
AudioServicesPlaySystemSound(0x450)
|
||||||
interfaceInteraction.insertText(NSAttributedString(string: text, attributes: [ChatTextInputAttributes.customEmoji: emojiAttribute]))
|
interfaceInteraction.insertText(NSAttributedString(string: text, attributes: [ChatTextInputAttributes.customEmoji: emojiAttribute]))
|
||||||
}
|
}
|
||||||
} else if let staticEmoji = item.staticEmoji {
|
} else if case let .staticEmoji(staticEmoji) = item.content {
|
||||||
AudioServicesPlaySystemSound(0x450)
|
AudioServicesPlaySystemSound(0x450)
|
||||||
interfaceInteraction.insertText(NSAttributedString(string: staticEmoji, attributes: [:]))
|
interfaceInteraction.insertText(NSAttributedString(string: staticEmoji, attributes: [:]))
|
||||||
}
|
}
|
||||||
@ -2221,7 +2250,7 @@ final class EntityInputView: UIView, AttachmentTextInputPanelInputView, UIInputV
|
|||||||
AudioServicesPlaySystemSound(0x450)
|
AudioServicesPlaySystemSound(0x450)
|
||||||
strongSelf.insertText?(NSAttributedString(string: text, attributes: [ChatTextInputAttributes.customEmoji: emojiAttribute]))
|
strongSelf.insertText?(NSAttributedString(string: text, attributes: [ChatTextInputAttributes.customEmoji: emojiAttribute]))
|
||||||
}
|
}
|
||||||
} else if let staticEmoji = item.staticEmoji {
|
} else if case let .staticEmoji(staticEmoji) = item.content {
|
||||||
AudioServicesPlaySystemSound(0x450)
|
AudioServicesPlaySystemSound(0x450)
|
||||||
strongSelf.insertText?(NSAttributedString(string: staticEmoji, attributes: [:]))
|
strongSelf.insertText?(NSAttributedString(string: staticEmoji, attributes: [:]))
|
||||||
}
|
}
|
||||||
@ -2274,7 +2303,7 @@ final class EntityInputView: UIView, AttachmentTextInputPanelInputView, UIInputV
|
|||||||
|
|
||||||
let semaphore = DispatchSemaphore(value: 0)
|
let semaphore = DispatchSemaphore(value: 0)
|
||||||
var emojiComponent: EmojiPagerContentComponent?
|
var emojiComponent: EmojiPagerContentComponent?
|
||||||
let _ = ChatEntityKeyboardInputNode.emojiInputData(context: context, animationCache: self.animationCache, animationRenderer: self.animationRenderer, isStandalone: true, areUnicodeEmojiEnabled: true, areCustomEmojiEnabled: areCustomEmojiEnabled, chatPeerId: nil).start(next: { value in
|
let _ = ChatEntityKeyboardInputNode.emojiInputData(context: context, animationCache: self.animationCache, animationRenderer: self.animationRenderer, isStandalone: true, isReactionSelection: false, areUnicodeEmojiEnabled: true, areCustomEmojiEnabled: areCustomEmojiEnabled, chatPeerId: nil).start(next: { value in
|
||||||
emojiComponent = value
|
emojiComponent = value
|
||||||
semaphore.signal()
|
semaphore.signal()
|
||||||
})
|
})
|
||||||
@ -2289,7 +2318,7 @@ final class EntityInputView: UIView, AttachmentTextInputPanelInputView, UIInputV
|
|||||||
gifs: nil,
|
gifs: nil,
|
||||||
availableGifSearchEmojies: []
|
availableGifSearchEmojies: []
|
||||||
),
|
),
|
||||||
updatedInputData: ChatEntityKeyboardInputNode.emojiInputData(context: context, animationCache: self.animationCache, animationRenderer: self.animationRenderer, isStandalone: true, areUnicodeEmojiEnabled: true, areCustomEmojiEnabled: areCustomEmojiEnabled, chatPeerId: nil) |> map { emojiComponent -> ChatEntityKeyboardInputNode.InputData in
|
updatedInputData: ChatEntityKeyboardInputNode.emojiInputData(context: context, animationCache: self.animationCache, animationRenderer: self.animationRenderer, isStandalone: true, isReactionSelection: false, areUnicodeEmojiEnabled: true, areCustomEmojiEnabled: areCustomEmojiEnabled, chatPeerId: nil) |> map { emojiComponent -> ChatEntityKeyboardInputNode.InputData in
|
||||||
return ChatEntityKeyboardInputNode.InputData(
|
return ChatEntityKeyboardInputNode.InputData(
|
||||||
emoji: emojiComponent,
|
emoji: emojiComponent,
|
||||||
stickers: nil,
|
stickers: nil,
|
||||||
|
@ -1118,7 +1118,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
|
|||||||
ignoreForward = true
|
ignoreForward = true
|
||||||
effectiveAuthor = forwardInfo.author
|
effectiveAuthor = forwardInfo.author
|
||||||
if effectiveAuthor == nil, let authorSignature = forwardInfo.authorSignature {
|
if effectiveAuthor == nil, let authorSignature = forwardInfo.authorSignature {
|
||||||
effectiveAuthor = TelegramUser(id: PeerId(namespace: Namespaces.Peer.Empty, id: PeerId.Id._internalFromInt64Value(Int64(authorSignature.persistentHashValue % 32))), accessHash: nil, firstName: authorSignature, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: UserInfoFlags())
|
effectiveAuthor = TelegramUser(id: PeerId(namespace: Namespaces.Peer.Empty, id: PeerId.Id._internalFromInt64Value(Int64(authorSignature.persistentHashValue % 32))), accessHash: nil, firstName: authorSignature, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
displayAuthorInfo = !mergedTop.merged && incoming && effectiveAuthor != nil
|
displayAuthorInfo = !mergedTop.merged && incoming && effectiveAuthor != nil
|
||||||
@ -1134,7 +1134,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
|
|||||||
displayAuthorInfo = !mergedTop.merged && incoming
|
displayAuthorInfo = !mergedTop.merged && incoming
|
||||||
} else if let forwardInfo = item.content.firstMessage.forwardInfo, forwardInfo.flags.contains(.isImported), let authorSignature = forwardInfo.authorSignature {
|
} else if let forwardInfo = item.content.firstMessage.forwardInfo, forwardInfo.flags.contains(.isImported), let authorSignature = forwardInfo.authorSignature {
|
||||||
ignoreForward = true
|
ignoreForward = true
|
||||||
effectiveAuthor = TelegramUser(id: PeerId(namespace: Namespaces.Peer.Empty, id: PeerId.Id._internalFromInt64Value(Int64(authorSignature.persistentHashValue % 32))), accessHash: nil, firstName: authorSignature, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: UserInfoFlags())
|
effectiveAuthor = TelegramUser(id: PeerId(namespace: Namespaces.Peer.Empty, id: PeerId.Id._internalFromInt64Value(Int64(authorSignature.persistentHashValue % 32))), accessHash: nil, firstName: authorSignature, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
displayAuthorInfo = !mergedTop.merged && incoming
|
displayAuthorInfo = !mergedTop.merged && incoming
|
||||||
} else if let _ = item.content.firstMessage.adAttribute, let author = item.content.firstMessage.author {
|
} else if let _ = item.content.firstMessage.adAttribute, let author = item.content.firstMessage.author {
|
||||||
ignoreForward = true
|
ignoreForward = true
|
||||||
|
@ -305,7 +305,7 @@ public final class ChatMessageItem: ListViewItem, CustomStringConvertible {
|
|||||||
if let forwardInfo = content.firstMessage.forwardInfo {
|
if let forwardInfo = content.firstMessage.forwardInfo {
|
||||||
effectiveAuthor = forwardInfo.author
|
effectiveAuthor = forwardInfo.author
|
||||||
if effectiveAuthor == nil, let authorSignature = forwardInfo.authorSignature {
|
if effectiveAuthor == nil, let authorSignature = forwardInfo.authorSignature {
|
||||||
effectiveAuthor = TelegramUser(id: PeerId(namespace: Namespaces.Peer.Empty, id: PeerId.Id._internalFromInt64Value(Int64(authorSignature.persistentHashValue % 32))), accessHash: nil, firstName: authorSignature, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: UserInfoFlags())
|
effectiveAuthor = TelegramUser(id: PeerId(namespace: Namespaces.Peer.Empty, id: PeerId.Id._internalFromInt64Value(Int64(authorSignature.persistentHashValue % 32))), accessHash: nil, firstName: authorSignature, lastName: nil, username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
displayAuthorInfo = incoming && effectiveAuthor != nil
|
displayAuthorInfo = incoming && effectiveAuthor != nil
|
||||||
|
@ -149,8 +149,8 @@ final class ChatTitleView: UIView, NavigationBarTitleView {
|
|||||||
}
|
}
|
||||||
if peer.id != self.context.account.peerId {
|
if peer.id != self.context.account.peerId {
|
||||||
let premiumConfiguration = PremiumConfiguration.with(appConfiguration: self.context.currentAppConfiguration.with { $0 })
|
let premiumConfiguration = PremiumConfiguration.with(appConfiguration: self.context.currentAppConfiguration.with { $0 })
|
||||||
if let _ = peerView.cachedData as? CachedUserData, peer.isPremium && !premiumConfiguration.isPremiumDisabled, "".isEmpty {
|
if let user = peer as? TelegramUser, let emojiStatus = user.emojiStatus {
|
||||||
titleCredibilityIcon = .emojiStatus(PeerEmojiStatus(fileId: 5431449001532594346))
|
titleCredibilityIcon = .emojiStatus(emojiStatus)
|
||||||
} else if peer.isFake {
|
} else if peer.isFake {
|
||||||
titleCredibilityIcon = .fake
|
titleCredibilityIcon = .fake
|
||||||
} else if peer.isScam {
|
} else if peer.isScam {
|
||||||
|
@ -2213,12 +2213,9 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*@objc private func handleStarTap(_ gestureRecognizer: UITapGestureRecognizer) {
|
func invokeDisplayPremiumIntro() {
|
||||||
guard let view = gestureRecognizer.view, self.currentCredibilityIcon == .premium else {
|
self.displayPremiumIntro?(self.isAvatarExpanded ? self.titleExpandedCredibilityIconView : self.titleCredibilityIconView, self.isAvatarExpanded)
|
||||||
return
|
}
|
||||||
}
|
|
||||||
self.displayPremiumIntro?(view, view == self.titleExpandedCredibilityIconView.componentView)
|
|
||||||
}*/
|
|
||||||
|
|
||||||
func initiateAvatarExpansion(gallery: Bool, first: Bool) {
|
func initiateAvatarExpansion(gallery: Bool, first: Bool) {
|
||||||
if let peer = self.peer, peer.profileImageRepresentations.isEmpty && gallery {
|
if let peer = self.peer, peer.profileImageRepresentations.isEmpty && gallery {
|
||||||
@ -2315,7 +2312,7 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
let premiumConfiguration = PremiumConfiguration.with(appConfiguration: self.context.currentAppConfiguration.with { $0 })
|
let premiumConfiguration = PremiumConfiguration.with(appConfiguration: self.context.currentAppConfiguration.with { $0 })
|
||||||
|
|
||||||
let credibilityIcon: CredibilityIcon
|
let credibilityIcon: CredibilityIcon
|
||||||
if let cachedData = cachedData as? CachedUserData, let emojiStatus = cachedData.emojiStatus {
|
if let user = peer as? TelegramUser, let emojiStatus = user.emojiStatus {
|
||||||
credibilityIcon = .emojiStatus(emojiStatus)
|
credibilityIcon = .emojiStatus(emojiStatus)
|
||||||
} else if let peer = peer {
|
} else if let peer = peer {
|
||||||
if peer.isFake {
|
if peer.isFake {
|
||||||
|
@ -446,6 +446,7 @@ private enum PeerInfoSettingsSection {
|
|||||||
case addAccount
|
case addAccount
|
||||||
case logout
|
case logout
|
||||||
case rememberPassword
|
case rememberPassword
|
||||||
|
case emojiStatus
|
||||||
}
|
}
|
||||||
|
|
||||||
private final class PeerInfoInteraction {
|
private final class PeerInfoInteraction {
|
||||||
@ -615,13 +616,29 @@ private func settingsItems(data: PeerInfoScreenData?, context: AccountContext, p
|
|||||||
setPhotoTitle = presentationData.strings.Settings_SetProfilePhotoOrVideo
|
setPhotoTitle = presentationData.strings.Settings_SetProfilePhotoOrVideo
|
||||||
displaySetPhoto = true
|
displaySetPhoto = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO:localize
|
||||||
|
let setStatusTitle: String = "Set Emoji Status"
|
||||||
|
let displaySetStatus: Bool
|
||||||
|
if let peer = data.peer as? TelegramUser, peer.isPremium {
|
||||||
|
displaySetStatus = true
|
||||||
|
} else {
|
||||||
|
displaySetStatus = false
|
||||||
|
}
|
||||||
|
|
||||||
|
if displaySetStatus {
|
||||||
|
items[.edit]!.append(PeerInfoScreenActionItem(id: 0, text: setStatusTitle, icon: UIImage(bundleImageName: "Settings/SetAvatar"), action: {
|
||||||
|
interaction.openSettings(.emojiStatus)
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
if displaySetPhoto {
|
if displaySetPhoto {
|
||||||
items[.edit]!.append(PeerInfoScreenActionItem(id: 0, text: setPhotoTitle, icon: UIImage(bundleImageName: "Settings/SetAvatar"), action: {
|
items[.edit]!.append(PeerInfoScreenActionItem(id: 1, text: setPhotoTitle, icon: UIImage(bundleImageName: "Settings/SetAvatar"), action: {
|
||||||
interaction.openSettings(.avatar)
|
interaction.openSettings(.avatar)
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
if let peer = data.peer, (peer.addressName ?? "").isEmpty {
|
if let peer = data.peer, (peer.addressName ?? "").isEmpty {
|
||||||
items[.edit]!.append(PeerInfoScreenActionItem(id: 1, text: presentationData.strings.Settings_SetUsername, icon: UIImage(bundleImageName: "Settings/SetUsername"), action: {
|
items[.edit]!.append(PeerInfoScreenActionItem(id: 2, text: presentationData.strings.Settings_SetUsername, icon: UIImage(bundleImageName: "Settings/SetUsername"), action: {
|
||||||
interaction.openSettings(.username)
|
interaction.openSettings(.username)
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
@ -3046,6 +3063,7 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|
|||||||
animationCache: animationCache,
|
animationCache: animationCache,
|
||||||
animationRenderer: animationRenderer,
|
animationRenderer: animationRenderer,
|
||||||
isStandalone: false,
|
isStandalone: false,
|
||||||
|
isReactionSelection: true,
|
||||||
areUnicodeEmojiEnabled: false,
|
areUnicodeEmojiEnabled: false,
|
||||||
areCustomEmojiEnabled: true,
|
areCustomEmojiEnabled: true,
|
||||||
chatPeerId: strongSelf.context.account.peerId
|
chatPeerId: strongSelf.context.account.peerId
|
||||||
@ -6395,6 +6413,8 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|
|||||||
let _ = dismissServerProvidedSuggestion(account: context.account, suggestion: .validatePassword).start()
|
let _ = dismissServerProvidedSuggestion(account: context.account, suggestion: .validatePassword).start()
|
||||||
}
|
}
|
||||||
push(controller)
|
push(controller)
|
||||||
|
case .emojiStatus:
|
||||||
|
self.headerNode.invokeDisplayPremiumIntro()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -251,7 +251,7 @@ private func pollResultsControllerEntries(presentationData: PresentationData, po
|
|||||||
displayCount = Int(voterCount)
|
displayCount = Int(voterCount)
|
||||||
}
|
}
|
||||||
for peerIndex in 0 ..< displayCount {
|
for peerIndex in 0 ..< displayCount {
|
||||||
let fakeUser = TelegramUser(id: PeerId(namespace: .max, id: PeerId.Id._internalFromInt64Value(0)), accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [])
|
let fakeUser = TelegramUser(id: PeerId(namespace: .max, id: PeerId.Id._internalFromInt64Value(0)), accessHash: nil, firstName: "", lastName: "", username: nil, phone: nil, photo: [], botInfo: nil, restrictionInfo: nil, flags: [], emojiStatus: nil)
|
||||||
let peer = RenderedPeer(peer: fakeUser)
|
let peer = RenderedPeer(peer: fakeUser)
|
||||||
entries.append(.optionPeer(optionId: i, index: peerIndex, peer: peer, optionText: optionTextHeader, optionAdditionalText: optionAdditionalTextHeader, optionCount: voterCount, optionExpanded: false, opaqueIdentifier: option.opaqueIdentifier, shimmeringAlternation: peerIndex % 2, isFirstInOption: peerIndex == 0))
|
entries.append(.optionPeer(optionId: i, index: peerIndex, peer: peer, optionText: optionTextHeader, optionAdditionalText: optionAdditionalTextHeader, optionCount: voterCount, optionExpanded: false, opaqueIdentifier: option.opaqueIdentifier, shimmeringAlternation: peerIndex % 2, isFirstInOption: peerIndex == 0))
|
||||||
}
|
}
|
||||||
|
@ -23,4 +23,4 @@ void applySmoothRoundedCornersImpl(CALayer * _Nonnull layer);
|
|||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
UIView<UIKitPortalViewProtocol> * _Nullable makePortalView();
|
UIView<UIKitPortalViewProtocol> * _Nullable makePortalView(bool matchPosition);
|
||||||
|
@ -169,7 +169,7 @@ void applySmoothRoundedCornersImpl(CALayer * _Nonnull layer) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
UIView<UIKitPortalViewProtocol> * _Nullable makePortalView() {
|
UIView<UIKitPortalViewProtocol> * _Nullable makePortalView(bool matchPosition) {
|
||||||
if (@available(iOS 12.0, *)) {
|
if (@available(iOS 12.0, *)) {
|
||||||
static Class portalViewClass = nil;
|
static Class portalViewClass = nil;
|
||||||
static dispatch_once_t onceToken;
|
static dispatch_once_t onceToken;
|
||||||
@ -187,8 +187,8 @@ UIView<UIKitPortalViewProtocol> * _Nullable makePortalView() {
|
|||||||
if (@available(iOS 13.0, *)) {
|
if (@available(iOS 13.0, *)) {
|
||||||
view.forwardsClientHitTestingToSourceView = false;
|
view.forwardsClientHitTestingToSourceView = false;
|
||||||
}
|
}
|
||||||
view.matchesPosition = true;
|
view.matchesPosition = matchPosition;
|
||||||
view.matchesTransform = true;
|
view.matchesTransform = matchPosition;
|
||||||
view.matchesAlpha = false;
|
view.matchesAlpha = false;
|
||||||
if (@available(iOS 13.0, *)) {
|
if (@available(iOS 13.0, *)) {
|
||||||
view.allowsHitTesting = false;
|
view.allowsHitTesting = false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user