mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-03 21:16:35 +00:00
Invite requests update
This commit is contained in:
parent
c649d0926f
commit
5114a1d068
BIN
Telegram/Telegram-iOS/Resources/Requests.tgs
Normal file
BIN
Telegram/Telegram-iOS/Resources/Requests.tgs
Normal file
Binary file not shown.
@ -16,13 +16,15 @@ class InviteLinkHeaderItem: ListViewItem, ItemListItem {
|
|||||||
let context: AccountContext
|
let context: AccountContext
|
||||||
let theme: PresentationTheme
|
let theme: PresentationTheme
|
||||||
let text: String
|
let text: String
|
||||||
|
let animationName: String
|
||||||
let sectionId: ItemListSectionId
|
let sectionId: ItemListSectionId
|
||||||
let linkAction: ((ItemListTextItemLinkAction) -> Void)?
|
let linkAction: ((ItemListTextItemLinkAction) -> Void)?
|
||||||
|
|
||||||
init(context: AccountContext, theme: PresentationTheme, text: String, sectionId: ItemListSectionId, linkAction: ((ItemListTextItemLinkAction) -> Void)? = nil) {
|
init(context: AccountContext, theme: PresentationTheme, text: String, animationName: String, sectionId: ItemListSectionId, linkAction: ((ItemListTextItemLinkAction) -> Void)? = nil) {
|
||||||
self.context = context
|
self.context = context
|
||||||
self.theme = theme
|
self.theme = theme
|
||||||
self.text = text
|
self.text = text
|
||||||
|
self.animationName = animationName
|
||||||
self.sectionId = sectionId
|
self.sectionId = sectionId
|
||||||
self.linkAction = linkAction
|
self.linkAction = linkAction
|
||||||
}
|
}
|
||||||
@ -117,7 +119,7 @@ class InviteLinkHeaderItemNode: ListViewItemNode {
|
|||||||
return (layout, { [weak self] in
|
return (layout, { [weak self] in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
if strongSelf.item == nil {
|
if strongSelf.item == nil {
|
||||||
strongSelf.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(name: "Invite"), width: 192, height: 192, playbackMode: .loop, mode: .direct(cachePathPrefix: nil))
|
strongSelf.animationNode.setup(source: AnimatedStickerNodeLocalFileSource(name: item.animationName), width: 192, height: 192, playbackMode: .loop, mode: .direct(cachePathPrefix: nil))
|
||||||
strongSelf.animationNode.visibility = true
|
strongSelf.animationNode.visibility = true
|
||||||
}
|
}
|
||||||
strongSelf.item = item
|
strongSelf.item = item
|
||||||
|
|||||||
@ -210,7 +210,7 @@ private enum InviteLinksListEntry: ItemListNodeEntry {
|
|||||||
let arguments = arguments as! InviteLinkListControllerArguments
|
let arguments = arguments as! InviteLinkListControllerArguments
|
||||||
switch self {
|
switch self {
|
||||||
case let .header(theme, text):
|
case let .header(theme, text):
|
||||||
return InviteLinkHeaderItem(context: arguments.context, theme: theme, text: text, sectionId: self.section)
|
return InviteLinkHeaderItem(context: arguments.context, theme: theme, text: text, animationName: "Invite", sectionId: self.section)
|
||||||
case let .mainLinkHeader(_, text):
|
case let .mainLinkHeader(_, text):
|
||||||
return ItemListSectionHeaderItem(presentationData: presentationData, text: text, sectionId: self.section)
|
return ItemListSectionHeaderItem(presentationData: presentationData, text: text, sectionId: self.section)
|
||||||
case let .mainLink(_, invite, peers, importersCount, isPublic):
|
case let .mainLink(_, invite, peers, importersCount, isPublic):
|
||||||
|
|||||||
@ -341,6 +341,7 @@ public final class InviteLinkViewController: ViewController {
|
|||||||
private let invite: ExportedInvitation
|
private let invite: ExportedInvitation
|
||||||
|
|
||||||
private let importersContext: PeerInvitationImportersContext
|
private let importersContext: PeerInvitationImportersContext
|
||||||
|
private let requestsContext: PeerInvitationImportersContext?
|
||||||
|
|
||||||
private var interaction: InviteLinkViewInteraction?
|
private var interaction: InviteLinkViewInteraction?
|
||||||
|
|
||||||
@ -377,6 +378,11 @@ public final class InviteLinkViewController: ViewController {
|
|||||||
self.controller = controller
|
self.controller = controller
|
||||||
|
|
||||||
self.importersContext = importersContext ?? context.engine.peers.peerInvitationImporters(peerId: peerId, subject: .invite(invite: invite, requested: false))
|
self.importersContext = importersContext ?? context.engine.peers.peerInvitationImporters(peerId: peerId, subject: .invite(invite: invite, requested: false))
|
||||||
|
if invite.requestApproval {
|
||||||
|
self.requestsContext = context.engine.peers.peerInvitationImporters(peerId: peerId, subject: .invite(invite: invite, requested: true))
|
||||||
|
} else {
|
||||||
|
self.requestsContext = nil
|
||||||
|
}
|
||||||
|
|
||||||
self.dimNode = ASDisplayNode()
|
self.dimNode = ASDisplayNode()
|
||||||
self.dimNode.backgroundColor = UIColor(white: 0.0, alpha: 0.5)
|
self.dimNode.backgroundColor = UIColor(white: 0.0, alpha: 0.5)
|
||||||
@ -572,36 +578,32 @@ public final class InviteLinkViewController: ViewController {
|
|||||||
let previousCount = Atomic<Int32?>(value: nil)
|
let previousCount = Atomic<Int32?>(value: nil)
|
||||||
let previousLoading = Atomic<Bool?>(value: nil)
|
let previousLoading = Atomic<Bool?>(value: nil)
|
||||||
|
|
||||||
|
let requestsState: Signal<PeerInvitationImportersState, NoError>
|
||||||
|
if let requestsContext = self.requestsContext {
|
||||||
|
requestsState = requestsContext.state
|
||||||
|
} else {
|
||||||
|
requestsState = .single(PeerInvitationImportersState.Empty)
|
||||||
|
}
|
||||||
|
|
||||||
let creatorPeer = context.account.postbox.loadedPeerWithId(invite.adminId)
|
let creatorPeer = context.account.postbox.loadedPeerWithId(invite.adminId)
|
||||||
self.disposable = (combineLatest(self.presentationDataPromise.get(), self.importersContext.state, creatorPeer)
|
self.disposable = (combineLatest(self.presentationDataPromise.get(), self.importersContext.state, requestsState, creatorPeer)
|
||||||
|> deliverOnMainQueue).start(next: { [weak self] presentationData, state, creatorPeer in
|
|> deliverOnMainQueue).start(next: { [weak self] presentationData, state, requestsState, creatorPeer in
|
||||||
if let strongSelf = self {
|
if let strongSelf = self {
|
||||||
var entries: [InviteLinkViewEntry] = []
|
var entries: [InviteLinkViewEntry] = []
|
||||||
|
|
||||||
entries.append(.link(presentationData.theme, invite))
|
entries.append(.link(presentationData.theme, invite))
|
||||||
entries.append(.creatorHeader(presentationData.theme, presentationData.strings.InviteLink_CreatedBy.uppercased()))
|
entries.append(.creatorHeader(presentationData.theme, presentationData.strings.InviteLink_CreatedBy.uppercased()))
|
||||||
entries.append(.creator(presentationData.theme, presentationData.dateTimeFormat, EnginePeer(creatorPeer), invite.date))
|
entries.append(.creator(presentationData.theme, presentationData.dateTimeFormat, EnginePeer(creatorPeer), invite.date))
|
||||||
|
|
||||||
if !state.importers.isEmpty || (state.isLoadingMore && state.count > 0) {
|
if !requestsState.importers.isEmpty || (state.isLoadingMore && requestsState.count > 0) {
|
||||||
let subtitle: String
|
entries.append(.importerHeader(presentationData.theme, presentationData.strings.MemberRequests_PeopleRequested(Int32(requestsState.count)).uppercased(), "", false))
|
||||||
let subtitleExpired: Bool
|
|
||||||
if let usageLimit = invite.usageLimit {
|
|
||||||
let remaining = max(0, usageLimit - state.count)
|
|
||||||
subtitle = presentationData.strings.InviteLink_PeopleRemaining(remaining).uppercased()
|
|
||||||
subtitleExpired = remaining <= 0
|
|
||||||
} else {
|
|
||||||
subtitle = ""
|
|
||||||
subtitleExpired = false
|
|
||||||
}
|
|
||||||
|
|
||||||
entries.append(.importerHeader(presentationData.theme, presentationData.strings.InviteLink_PeopleJoined(Int32(state.count)).uppercased(), subtitle, subtitleExpired))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let count: Int32
|
let count: Int32
|
||||||
let loading: Bool
|
let loading: Bool
|
||||||
|
|
||||||
var index: Int32 = 0
|
var index: Int32 = 0
|
||||||
if state.importers.isEmpty && state.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: [])
|
||||||
@ -609,9 +611,9 @@ public final class InviteLinkViewController: ViewController {
|
|||||||
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))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
count = min(4, Int32(state.importers.count))
|
count = min(4, Int32(requestsState.importers.count))
|
||||||
loading = false
|
loading = false
|
||||||
for importer in state.importers {
|
for importer in requestsState.importers {
|
||||||
if let peer = importer.peer.peer {
|
if let peer = importer.peer.peer {
|
||||||
entries.append(.importer(index, presentationData.theme, presentationData.dateTimeFormat, EnginePeer(peer), importer.date, false))
|
entries.append(.importer(index, presentationData.theme, presentationData.dateTimeFormat, EnginePeer(peer), importer.date, false))
|
||||||
}
|
}
|
||||||
@ -619,6 +621,43 @@ public final class InviteLinkViewController: ViewController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if !state.importers.isEmpty || (state.isLoadingMore && state.count > 0) {
|
||||||
|
// let subtitle: String
|
||||||
|
// let subtitleExpired: Bool
|
||||||
|
// if let usageLimit = invite.usageLimit {
|
||||||
|
// let remaining = max(0, usageLimit - state.count)
|
||||||
|
// subtitle = presentationData.strings.InviteLink_PeopleRemaining(remaining).uppercased()
|
||||||
|
// subtitleExpired = remaining <= 0
|
||||||
|
// } else {
|
||||||
|
// subtitle = ""
|
||||||
|
// subtitleExpired = false
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// entries.append(.importerHeader(presentationData.theme, presentationData.strings.InviteLink_PeopleJoined(Int32(state.count)).uppercased(), subtitle, subtitleExpired))
|
||||||
|
// }
|
||||||
|
|
||||||
|
// let count: Int32
|
||||||
|
// let loading: Bool
|
||||||
|
//
|
||||||
|
// var index: Int32 = 0
|
||||||
|
// if state.importers.isEmpty && state.isLoadingMore {
|
||||||
|
// count = min(4, state.count)
|
||||||
|
// 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: [])
|
||||||
|
// for i in 0 ..< count {
|
||||||
|
// entries.append(.importer(Int32(i), presentationData.theme, presentationData.dateTimeFormat, EnginePeer.user(fakeUser), 0, true))
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// count = min(4, Int32(state.importers.count))
|
||||||
|
// loading = false
|
||||||
|
// for importer in state.importers {
|
||||||
|
// if let peer = importer.peer.peer {
|
||||||
|
// entries.append(.importer(index, presentationData.theme, presentationData.dateTimeFormat, EnginePeer(peer), importer.date, false))
|
||||||
|
// }
|
||||||
|
// index += 1
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
let previousCount = previousCount.swap(count)
|
let previousCount = previousCount.swap(count)
|
||||||
let previousLoading = previousLoading.swap(loading)
|
let previousLoading = previousLoading.swap(loading)
|
||||||
|
|
||||||
|
|||||||
@ -100,7 +100,7 @@ private enum InviteRequestsEntry: ItemListNodeEntry {
|
|||||||
let arguments = arguments as! InviteRequestsControllerArguments
|
let arguments = arguments as! InviteRequestsControllerArguments
|
||||||
switch self {
|
switch self {
|
||||||
case let .header(theme, text):
|
case let .header(theme, text):
|
||||||
return InviteLinkHeaderItem(context: arguments.context, theme: theme, text: text, sectionId: self.section, linkAction: { _ in
|
return InviteLinkHeaderItem(context: arguments.context, theme: theme, text: text, animationName: "Requests", sectionId: self.section, linkAction: { _ in
|
||||||
arguments.openLinks()
|
arguments.openLinks()
|
||||||
})
|
})
|
||||||
case let .requestsHeader(_, text):
|
case let .requestsHeader(_, text):
|
||||||
@ -166,7 +166,7 @@ public func inviteRequestsController(context: AccountContext, updatedPresentatio
|
|||||||
|
|
||||||
var getControllerImpl: (() -> ViewController?)?
|
var getControllerImpl: (() -> ViewController?)?
|
||||||
|
|
||||||
let importersContext = existingContext ?? context.engine.peers.peerInvitationImporters(peerId: peerId, subject: .requests)
|
let importersContext = existingContext ?? context.engine.peers.peerInvitationImporters(peerId: peerId, subject: .requests(query: nil))
|
||||||
|
|
||||||
let arguments = InviteRequestsControllerArguments(context: context, openLinks: {
|
let arguments = InviteRequestsControllerArguments(context: context, openLinks: {
|
||||||
let controller = inviteLinkListController(context: context, updatedPresentationData: updatedPresentationData, peerId: peerId, admin: nil)
|
let controller = inviteLinkListController(context: context, updatedPresentationData: updatedPresentationData, peerId: peerId, admin: nil)
|
||||||
|
|||||||
@ -277,11 +277,7 @@ public class ItemListInviteRequestItemNode: ListViewItemNode, ItemListItemNode {
|
|||||||
|
|
||||||
if let importer = item.importer, let peer = importer.peer.peer.flatMap({ EnginePeer($0) }) {
|
if let importer = item.importer, let peer = importer.peer.peer.flatMap({ EnginePeer($0) }) {
|
||||||
titleText = peer.displayTitle(strings: item.presentationData.strings, displayOrder: item.nameDisplayOrder)
|
titleText = peer.displayTitle(strings: item.presentationData.strings, displayOrder: item.nameDisplayOrder)
|
||||||
if case .user = peer {
|
subtitleText = importer.about ?? ""
|
||||||
subtitleText = " "
|
|
||||||
} else {
|
|
||||||
subtitleText = ""
|
|
||||||
}
|
|
||||||
let timestamp = Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970)
|
let timestamp = Int32(CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970)
|
||||||
dateText = stringForRelativeTimestamp(strings: item.presentationData.strings, relativeTimestamp: importer.date, relativeTo: timestamp, dateTimeFormat: item.dateTimeFormat)
|
dateText = stringForRelativeTimestamp(strings: item.presentationData.strings, relativeTimestamp: importer.date, relativeTo: timestamp, dateTimeFormat: item.dateTimeFormat)
|
||||||
} else {
|
} else {
|
||||||
@ -305,8 +301,10 @@ public class ItemListInviteRequestItemNode: ListViewItemNode, ItemListItemNode {
|
|||||||
let titleSpacing: CGFloat = 1.0
|
let titleSpacing: CGFloat = 1.0
|
||||||
|
|
||||||
let minHeight: CGFloat = titleLayout.size.height + verticalInset * 2.0
|
let minHeight: CGFloat = titleLayout.size.height + verticalInset * 2.0
|
||||||
let rawHeight: CGFloat = verticalInset * 2.0 + titleLayout.size.height + titleSpacing + subtitleLayout.size.height + 24.0
|
var rawHeight: CGFloat = verticalInset * 2.0 + titleLayout.size.height + titleSpacing + 41.0
|
||||||
|
if !subtitleLayout.size.height.isZero {
|
||||||
|
rawHeight += subtitleLayout.size.height + 5.0
|
||||||
|
}
|
||||||
var insets: UIEdgeInsets
|
var insets: UIEdgeInsets
|
||||||
let itemBackgroundColor: UIColor
|
let itemBackgroundColor: UIColor
|
||||||
let itemSeparatorColor: UIColor
|
let itemSeparatorColor: UIColor
|
||||||
@ -452,10 +450,10 @@ public class ItemListInviteRequestItemNode: ListViewItemNode, ItemListItemNode {
|
|||||||
strongSelf.dismissButton.setTitle(item.presentationData.strings.MemberRequests_Dismiss, with: Font.bold(15.0), with: item.presentationData.theme.list.itemAccentColor, for: .normal)
|
strongSelf.dismissButton.setTitle(item.presentationData.strings.MemberRequests_Dismiss, with: Font.bold(15.0), with: item.presentationData.theme.list.itemAccentColor, for: .normal)
|
||||||
|
|
||||||
let addHeight = strongSelf.addButton.updateLayout(width: 138.0, transition: .immediate)
|
let addHeight = strongSelf.addButton.updateLayout(width: 138.0, transition: .immediate)
|
||||||
strongSelf.addButton.frame = CGRect(x: leftInset, y: verticalInset + titleLayout.size.height + 7.0, width: 138.0, height: addHeight)
|
strongSelf.addButton.frame = CGRect(x: leftInset, y: contentSize.height - addHeight - 12.0, width: 138.0, height: addHeight)
|
||||||
|
|
||||||
let dismissSize = strongSelf.dismissButton.measure(layout.size)
|
let dismissSize = strongSelf.dismissButton.measure(layout.size)
|
||||||
strongSelf.dismissButton.frame = CGRect(origin: CGPoint(x: leftInset + 138.0 + 24.0, y: verticalInset + titleLayout.size.height + 14.0), size: dismissSize)
|
strongSelf.dismissButton.frame = CGRect(origin: CGPoint(x: leftInset + 138.0 + 24.0, y: verticalInset + contentSize.height - addHeight - 14.0), size: dismissSize)
|
||||||
|
|
||||||
if item.importer == nil {
|
if item.importer == nil {
|
||||||
let shimmerNode: ShimmerEffectNode
|
let shimmerNode: ShimmerEffectNode
|
||||||
|
|||||||
@ -157,6 +157,8 @@ public final class JoinLinkPreviewController: ViewController {
|
|||||||
}
|
}
|
||||||
case .tooMuchUsers:
|
case .tooMuchUsers:
|
||||||
strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.Conversation_UsersTooMuchError, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
strongSelf.present(textAlertController(context: strongSelf.context, title: nil, text: strongSelf.presentationData.strings.Conversation_UsersTooMuchError, actions: [TextAlertAction(type: .defaultAction, title: strongSelf.presentationData.strings.Common_OK, action: {})]), in: .window(.root))
|
||||||
|
case .requestSent:
|
||||||
|
break
|
||||||
case .generic:
|
case .generic:
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4371,16 +4371,17 @@ public extension Api {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
public static func getChatInviteImporters(flags: Int32, peer: Api.InputPeer, link: String?, offsetDate: Int32, offsetUser: Api.InputUser, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.messages.ChatInviteImporters>) {
|
public static func getChatInviteImporters(flags: Int32, peer: Api.InputPeer, link: String?, q: String?, offsetDate: Int32, offsetUser: Api.InputUser, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse<Api.messages.ChatInviteImporters>) {
|
||||||
let buffer = Buffer()
|
let buffer = Buffer()
|
||||||
buffer.appendInt32(-1742901790)
|
buffer.appendInt32(-553329330)
|
||||||
serializeInt32(flags, buffer: buffer, boxed: false)
|
serializeInt32(flags, buffer: buffer, boxed: false)
|
||||||
peer.serialize(buffer, true)
|
peer.serialize(buffer, true)
|
||||||
if Int(flags) & Int(1 << 1) != 0 {serializeString(link!, buffer: buffer, boxed: false)}
|
if Int(flags) & Int(1 << 1) != 0 {serializeString(link!, buffer: buffer, boxed: false)}
|
||||||
|
if Int(flags) & Int(1 << 2) != 0 {serializeString(q!, buffer: buffer, boxed: false)}
|
||||||
serializeInt32(offsetDate, buffer: buffer, boxed: false)
|
serializeInt32(offsetDate, buffer: buffer, boxed: false)
|
||||||
offsetUser.serialize(buffer, true)
|
offsetUser.serialize(buffer, true)
|
||||||
serializeInt32(limit, buffer: buffer, boxed: false)
|
serializeInt32(limit, buffer: buffer, boxed: false)
|
||||||
return (FunctionDescription(name: "messages.getChatInviteImporters", parameters: [("flags", flags), ("peer", peer), ("link", link), ("offsetDate", offsetDate), ("offsetUser", offsetUser), ("limit", limit)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.ChatInviteImporters? in
|
return (FunctionDescription(name: "messages.getChatInviteImporters", parameters: [("flags", flags), ("peer", peer), ("link", link), ("q", q), ("offsetDate", offsetDate), ("offsetUser", offsetUser), ("limit", limit)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.ChatInviteImporters? in
|
||||||
let reader = BufferReader(buffer)
|
let reader = BufferReader(buffer)
|
||||||
var result: Api.messages.ChatInviteImporters?
|
var result: Api.messages.ChatInviteImporters?
|
||||||
if let signature = reader.readInt32() {
|
if let signature = reader.readInt32() {
|
||||||
|
|||||||
@ -655,6 +655,8 @@ public struct PeerInvitationImportersState: Equatable {
|
|||||||
public var waitingCount: Int {
|
public var waitingCount: Int {
|
||||||
return importers.filter { $0.approvedBy == nil }.count
|
return importers.filter { $0.approvedBy == nil }.count
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static var Empty = PeerInvitationImportersState(importers: [], isLoadingMore: false, hasLoadedOnce: true, canLoadMore: false, count: 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
final class CachedPeerInvitationImporters: Codable {
|
final class CachedPeerInvitationImporters: Codable {
|
||||||
@ -723,6 +725,7 @@ private final class PeerInvitationImportersContextImpl {
|
|||||||
private let peerId: PeerId
|
private let peerId: PeerId
|
||||||
private let link: String?
|
private let link: String?
|
||||||
private let requested: Bool
|
private let requested: Bool
|
||||||
|
private let query: String?
|
||||||
private let disposable = MetaDisposable()
|
private let disposable = MetaDisposable()
|
||||||
private let updateDisposable = MetaDisposable()
|
private let updateDisposable = MetaDisposable()
|
||||||
private let actionDisposables = DisposableSet()
|
private let actionDisposables = DisposableSet()
|
||||||
@ -743,18 +746,26 @@ private final class PeerInvitationImportersContextImpl {
|
|||||||
|
|
||||||
var invite: ExportedInvitation?
|
var invite: ExportedInvitation?
|
||||||
var requested = false
|
var requested = false
|
||||||
if case let .invite(subjectInvite, subjectRequested) = subject {
|
var query: String?
|
||||||
invite = subjectInvite
|
switch subject {
|
||||||
requested = subjectRequested
|
case let .invite(subjectInvite, subjectRequested):
|
||||||
|
invite = subjectInvite
|
||||||
|
requested = subjectRequested
|
||||||
|
case let .requests(maybeQuery):
|
||||||
|
query = maybeQuery
|
||||||
}
|
}
|
||||||
self.link = invite?.link
|
self.link = invite?.link
|
||||||
self.requested = requested
|
self.requested = requested
|
||||||
|
self.query = query
|
||||||
|
|
||||||
let count = invite?.count ?? 0
|
let count = invite?.count ?? 0
|
||||||
self.count = count
|
self.count = count
|
||||||
|
|
||||||
self.isLoadingMore = true
|
self.isLoadingMore = true
|
||||||
self.disposable.set((account.postbox.transaction { transaction -> (peers: [PeerInvitationImportersState.Importer], count: Int32, canLoadMore: Bool)? in
|
self.disposable.set((account.postbox.transaction { transaction -> (peers: [PeerInvitationImportersState.Importer], count: Int32, canLoadMore: Bool)? in
|
||||||
|
guard query == nil else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
let cachedResult = transaction.retrieveItemCacheEntry(id: ItemCacheEntryId(collectionId: Namespaces.CachedItemCollection.cachedPeerInvitationImporters, key: CachedPeerInvitationImporters.key(peerId: peerId, link: invite?.link ?? "requests", requested: self.requested)))?.get(CachedPeerInvitationImporters.self)
|
let cachedResult = transaction.retrieveItemCacheEntry(id: ItemCacheEntryId(collectionId: Namespaces.CachedItemCollection.cachedPeerInvitationImporters, key: CachedPeerInvitationImporters.key(peerId: peerId, link: invite?.link ?? "requests", requested: self.requested)))?.get(CachedPeerInvitationImporters.self)
|
||||||
if let cachedResult = cachedResult, (Int(cachedResult.count) == count || invite == nil) {
|
if let cachedResult = cachedResult, (Int(cachedResult.count) == count || invite == nil) {
|
||||||
var result: [PeerInvitationImportersState.Importer] = []
|
var result: [PeerInvitationImportersState.Importer] = []
|
||||||
@ -803,6 +814,7 @@ private final class PeerInvitationImportersContextImpl {
|
|||||||
let peerId = self.peerId
|
let peerId = self.peerId
|
||||||
let link = self.link
|
let link = self.link
|
||||||
let populateCache = self.populateCache
|
let populateCache = self.populateCache
|
||||||
|
let query = self.query
|
||||||
|
|
||||||
var lastResult = self.results.last
|
var lastResult = self.results.last
|
||||||
if self.loadedFromCache {
|
if self.loadedFromCache {
|
||||||
@ -828,7 +840,11 @@ private final class PeerInvitationImportersContextImpl {
|
|||||||
flags |= (1 << 0)
|
flags |= (1 << 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
let signal = account.network.request(Api.functions.messages.getChatInviteImporters(flags: flags, peer: inputPeer, link: link, offsetDate: offsetDate, offsetUser: offsetUser, limit: lastResult == nil ? 10 : 50))
|
if let _ = query {
|
||||||
|
flags |= (1 << 2)
|
||||||
|
}
|
||||||
|
|
||||||
|
let signal = account.network.request(Api.functions.messages.getChatInviteImporters(flags: flags, peer: inputPeer, link: link, q: query, offsetDate: offsetDate, offsetUser: offsetUser, limit: lastResult == nil ? 10 : 50))
|
||||||
|> map(Optional.init)
|
|> map(Optional.init)
|
||||||
|> `catch` { _ -> Signal<Api.messages.ChatInviteImporters?, NoError> in
|
|> `catch` { _ -> Signal<Api.messages.ChatInviteImporters?, NoError> in
|
||||||
return .single(nil)
|
return .single(nil)
|
||||||
@ -864,7 +880,7 @@ private final class PeerInvitationImportersContextImpl {
|
|||||||
resultImporters.append(PeerInvitationImportersState.Importer(peer: RenderedPeer(peer: peer), date: date, about: about, approvedBy: approvedBy))
|
resultImporters.append(PeerInvitationImportersState.Importer(peer: RenderedPeer(peer: peer), date: date, about: about, approvedBy: approvedBy))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if populateCache {
|
if populateCache && query == nil {
|
||||||
if let entry = CodableEntry(CachedPeerInvitationImporters(importers: resultImporters, count: count)) {
|
if let entry = CodableEntry(CachedPeerInvitationImporters(importers: resultImporters, count: count)) {
|
||||||
transaction.putItemCacheEntry(id: ItemCacheEntryId(collectionId: Namespaces.CachedItemCollection.cachedPeerInvitationImporters, key: CachedPeerInvitationImporters.key(peerId: peerId, link: link ?? "requests", requested: self.requested)), entry: entry, collectionSpec: cachedPeerInvitationImportersCollectionSpec)
|
transaction.putItemCacheEntry(id: ItemCacheEntryId(collectionId: Namespaces.CachedItemCollection.cachedPeerInvitationImporters, key: CachedPeerInvitationImporters.key(peerId: peerId, link: link ?? "requests", requested: self.requested)), entry: entry, collectionSpec: cachedPeerInvitationImportersCollectionSpec)
|
||||||
}
|
}
|
||||||
@ -918,7 +934,7 @@ private final class PeerInvitationImportersContextImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func updateCache() {
|
private func updateCache() {
|
||||||
guard self.hasLoadedOnce && !self.isLoadingMore else {
|
guard self.hasLoadedOnce && !self.isLoadingMore && self.query == nil else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -941,7 +957,7 @@ private final class PeerInvitationImportersContextImpl {
|
|||||||
public final class PeerInvitationImportersContext {
|
public final class PeerInvitationImportersContext {
|
||||||
public enum Subject {
|
public enum Subject {
|
||||||
case invite(invite: ExportedInvitation, requested: Bool)
|
case invite(invite: ExportedInvitation, requested: Bool)
|
||||||
case requests
|
case requests(query: String?)
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum UpdateAction {
|
public enum UpdateAction {
|
||||||
|
|||||||
@ -1,7 +1,17 @@
|
|||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"idiom" : "universal"
|
"idiom" : "universal",
|
||||||
|
"scale" : "1x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "2x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"filename" : "Requests@3x.png",
|
||||||
|
"idiom" : "universal",
|
||||||
|
"scale" : "3x"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"info" : {
|
"info" : {
|
||||||
|
|||||||
BIN
submodules/TelegramUI/Images.xcassets/Chat/Info/GroupRequestsIcon.imageset/Requests@3x.png
vendored
Normal file
BIN
submodules/TelegramUI/Images.xcassets/Chat/Info/GroupRequestsIcon.imageset/Requests@3x.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.9 KiB |
@ -4802,7 +4802,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||||||
}
|
}
|
||||||
|
|
||||||
if canManageInvitations, let inviteRequestsPending = inviteRequestsPending, inviteRequestsPending >= 0, strongSelf.inviteRequestsContext == nil {
|
if canManageInvitations, let inviteRequestsPending = inviteRequestsPending, inviteRequestsPending >= 0, strongSelf.inviteRequestsContext == nil {
|
||||||
let inviteRequestsContext = strongSelf.context.engine.peers.peerInvitationImporters(peerId: peerId, subject: .requests)
|
let inviteRequestsContext = strongSelf.context.engine.peers.peerInvitationImporters(peerId: peerId, subject: .requests(query: nil))
|
||||||
strongSelf.inviteRequestsContext = inviteRequestsContext
|
strongSelf.inviteRequestsContext = inviteRequestsContext
|
||||||
|
|
||||||
strongSelf.inviteRequestsDisposable.set((inviteRequestsContext.state
|
strongSelf.inviteRequestsDisposable.set((inviteRequestsContext.state
|
||||||
|
|||||||
@ -666,7 +666,7 @@ func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: Presen
|
|||||||
|
|
||||||
if currentRequestsContext == nil {
|
if currentRequestsContext == nil {
|
||||||
if canManageInvitations {
|
if canManageInvitations {
|
||||||
let requestsContext = context.engine.peers.peerInvitationImporters(peerId: peerId, subject: .requests)
|
let requestsContext = context.engine.peers.peerInvitationImporters(peerId: peerId, subject: .requests(query: nil))
|
||||||
requestsContextPromise.set(.single(requestsContext))
|
requestsContextPromise.set(.single(requestsContext))
|
||||||
requestsStatePromise.set(requestsContext.state |> map(Optional.init))
|
requestsStatePromise.set(requestsContext.state |> map(Optional.init))
|
||||||
}
|
}
|
||||||
@ -843,7 +843,7 @@ func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: Presen
|
|||||||
|
|
||||||
if currentRequestsContext == nil {
|
if currentRequestsContext == nil {
|
||||||
if canManageInvitations {
|
if canManageInvitations {
|
||||||
let requestsContext = context.engine.peers.peerInvitationImporters(peerId: peerId, subject: .requests)
|
let requestsContext = context.engine.peers.peerInvitationImporters(peerId: peerId, subject: .requests(query: nil))
|
||||||
requestsContextPromise.set(.single(requestsContext))
|
requestsContextPromise.set(.single(requestsContext))
|
||||||
requestsStatePromise.set(requestsContext.state |> map(Optional.init))
|
requestsStatePromise.set(requestsContext.state |> map(Optional.init))
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1112,7 +1112,7 @@ private func infoItems(data: PeerInfoScreenData?, context: AccountContext, prese
|
|||||||
}))
|
}))
|
||||||
|
|
||||||
if let count = data.requests?.count, count > 0 {
|
if let count = data.requests?.count, count > 0 {
|
||||||
items[.peerInfo]!.append(PeerInfoScreenDisclosureItem(id: ItemMemberRequests, label: .badge(presentationStringsFormattedNumber(count, presentationData.dateTimeFormat.groupingSeparator), presentationData.theme.list.itemAccentColor), text: presentationData.strings.GroupInfo_MemberRequests, icon: UIImage(bundleImageName: "Chat/Info/GroupMembersIcon"), action: {
|
items[.peerInfo]!.append(PeerInfoScreenDisclosureItem(id: ItemMemberRequests, label: .badge(presentationStringsFormattedNumber(count, presentationData.dateTimeFormat.groupingSeparator), presentationData.theme.list.itemAccentColor), text: presentationData.strings.GroupInfo_MemberRequests, icon: UIImage(bundleImageName: "Chat/Info/GroupRequestsIcon"), action: {
|
||||||
interaction.openParticipantsSection(.memberRequests)
|
interaction.openParticipantsSection(.memberRequests)
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user