diff --git a/submodules/InviteLinksUI/Sources/InviteLinkListController.swift b/submodules/InviteLinksUI/Sources/InviteLinkListController.swift index b248818441..a8dee629af 100644 --- a/submodules/InviteLinksUI/Sources/InviteLinkListController.swift +++ b/submodules/InviteLinksUI/Sources/InviteLinkListController.swift @@ -316,7 +316,7 @@ public func inviteLinkListController(context: AccountContext, peerId: PeerId) -> let shareController = ShareController(context: context, subject: .url(invite.link)) presentControllerImpl?(shareController, nil) }, openMainLink: { invite in - let controller = InviteLinkViewController(context: context, peerId: peerId, invite: invite, invitationsContext: nil, importersContext: nil) + let controller = InviteLinkViewController(context: context, peerId: peerId, invite: invite, invitationsContext: nil, revokedInvitationsContext: revokedInvitesContext, importersContext: nil) pushControllerImpl?(controller) }, copyLink: { invite in UIPasteboard.general.string = invite.link @@ -409,7 +409,7 @@ public func inviteLinkListController(context: AccountContext, peerId: PeerId) -> pushControllerImpl?(controller) }, openLink: { invite in if let invite = invite { - let controller = InviteLinkViewController(context: context, peerId: peerId, invite: invite, invitationsContext: invitesContext, importersContext: nil) + let controller = InviteLinkViewController(context: context, peerId: peerId, invite: invite, invitationsContext: invitesContext, revokedInvitationsContext: revokedInvitesContext, importersContext: nil) pushControllerImpl?(controller) } }, linkContextAction: { invite, node, gesture in diff --git a/submodules/InviteLinksUI/Sources/InviteLinkViewController.swift b/submodules/InviteLinksUI/Sources/InviteLinkViewController.swift index 85f6494959..6aa8fb614c 100644 --- a/submodules/InviteLinksUI/Sources/InviteLinkViewController.swift +++ b/submodules/InviteLinksUI/Sources/InviteLinkViewController.swift @@ -218,15 +218,17 @@ public final class InviteLinkViewController: ViewController { private let peerId: PeerId private let invite: ExportedInvitation private let invitationsContext: PeerExportedInvitationsContext? + private let revokedInvitationsContext: PeerExportedInvitationsContext? private let importersContext: PeerInvitationImportersContext? private var presentationDataDisposable: Disposable? - public init(context: AccountContext, peerId: PeerId, invite: ExportedInvitation, invitationsContext: PeerExportedInvitationsContext?, importersContext: PeerInvitationImportersContext?) { + public init(context: AccountContext, peerId: PeerId, invite: ExportedInvitation, invitationsContext: PeerExportedInvitationsContext?, revokedInvitationsContext: PeerExportedInvitationsContext?, importersContext: PeerInvitationImportersContext?) { self.context = context self.peerId = peerId self.invite = invite self.invitationsContext = invitationsContext + self.revokedInvitationsContext = revokedInvitationsContext self.importersContext = importersContext super.init(navigationBarPresentationData: nil) @@ -299,12 +301,16 @@ public final class InviteLinkViewController: ViewController { private let peerId: PeerId private let invite: ExportedInvitation + private let importersContext: PeerInvitationImportersContext + private var interaction: InviteLinkViewInteraction? private var presentationData: PresentationData private let presentationDataPromise: Promise - + private var presentationDataDisposable: Disposable? + private var disposable: Disposable? + private let actionDisposable = MetaDisposable() private let dimNode: ASDisplayNode private let contentNode: ASDisplayNode @@ -323,10 +329,6 @@ public final class InviteLinkViewController: ViewController { private var validLayout: ContainerViewLayout? - private var presentationDataDisposable: Disposable? - - private let importersContext: PeerInvitationImportersContext - init(context: AccountContext, peerId: PeerId, invite: ExportedInvitation, importersContext: PeerInvitationImportersContext?, controller: InviteLinkViewController) { self.context = context self.peerId = peerId @@ -420,7 +422,24 @@ public final class InviteLinkViewController: ViewController { }, action: { [weak self] _, f in f(.dismissWithoutContent) - let controller = InviteLinkQRCodeController(context: context, invite: invite) + let controller = ActionSheetController(presentationData: presentationData) + let dismissAction: () -> Void = { [weak controller] in + controller?.dismissAnimated() + } + controller.setItemGroups([ + ActionSheetItemGroup(items: [ + ActionSheetTextItem(title: presentationData.strings.InviteLink_DeleteLinkAlert_Text), + ActionSheetButtonItem(title: presentationData.strings.InviteLink_DeleteLinkAlert_Action, color: .destructive, action: { + dismissAction() + + self?.actionDisposable.set((deletePeerExportedInvitation(account: context.account, peerId: peerId, link: invite.link) |> deliverOnMainQueue).start(completed: { + })) + + self?.controller?.revokedInvitationsContext?.remove(invite) + }) + ]), + ActionSheetItemGroup(items: [ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, action: { dismissAction() })]) + ]) self?.controller?.present(controller, in: .window(.root)) }))) } else { diff --git a/submodules/InviteLinksUI/Sources/ItemListPermanentInviteLinkItem.swift b/submodules/InviteLinksUI/Sources/ItemListPermanentInviteLinkItem.swift index ab1b1eae67..11cdbdcc93 100644 --- a/submodules/InviteLinksUI/Sources/ItemListPermanentInviteLinkItem.swift +++ b/submodules/InviteLinksUI/Sources/ItemListPermanentInviteLinkItem.swift @@ -169,6 +169,7 @@ public class ItemListPermanentInviteLinkItemNode: ListViewItemNode, ItemListItem self.containerNode = ContextControllerSourceNode() self.containerNode.isGestureEnabled = false self.addressButtonIconNode = ASImageNode() + self.addressButtonIconNode.contentMode = .center self.addressButtonIconNode.displaysAsynchronously = false self.addressButtonIconNode.displayWithoutProcessing = true @@ -423,7 +424,7 @@ public class ItemListPermanentInviteLinkItemNode: ListViewItemNode, ItemListItem strongSelf.addressNode.frame = CGRect(origin: CGPoint(x: fieldFrame.minX + floorToScreenPixels((fieldFrame.width - addressLayout.size.width) / 2.0), y: fieldFrame.minY + floorToScreenPixels((fieldFrame.height - addressLayout.size.height) / 2.0) + 1.0), size: addressLayout.size) - strongSelf.addressButtonNode.frame = CGRect(origin: CGPoint(x: params.width - rightInset - 38.0, y: verticalInset + 14.0), size: CGSize(width: 24.0, height: 24.0)) + strongSelf.addressButtonNode.frame = CGRect(origin: CGPoint(x: params.width - rightInset - 38.0 - 14.0, y: verticalInset), size: CGSize(width: 52.0, height: 52.0)) strongSelf.extractedContainerNode.frame = strongSelf.addressButtonNode.bounds strongSelf.extractedContainerNode.contentRect = strongSelf.addressButtonNode.bounds strongSelf.addressButtonIconNode.frame = strongSelf.addressButtonNode.bounds diff --git a/submodules/TelegramApi/Sources/Api3.swift b/submodules/TelegramApi/Sources/Api3.swift index 84cb1abb7e..eef77b319c 100644 --- a/submodules/TelegramApi/Sources/Api3.swift +++ b/submodules/TelegramApi/Sources/Api3.swift @@ -3942,15 +3942,16 @@ public extension Api { }) } - public static func getExportedChatInvites(flags: Int32, peer: Api.InputPeer, adminId: Api.InputUser?, offsetLink: String?, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { + public static func getExportedChatInvites(flags: Int32, peer: Api.InputPeer, adminId: Api.InputUser?, offsetDate: Int32?, offsetLink: String?, limit: Int32) -> (FunctionDescription, Buffer, DeserializeFunctionResponse) { let buffer = Buffer() - buffer.appendInt32(1838984707) + buffer.appendInt32(1785900140) serializeInt32(flags, buffer: buffer, boxed: false) peer.serialize(buffer, true) if Int(flags) & Int(1 << 0) != 0 {adminId!.serialize(buffer, true)} + if Int(flags) & Int(1 << 2) != 0 {serializeInt32(offsetDate!, buffer: buffer, boxed: false)} if Int(flags) & Int(1 << 2) != 0 {serializeString(offsetLink!, buffer: buffer, boxed: false)} serializeInt32(limit, buffer: buffer, boxed: false) - return (FunctionDescription(name: "messages.getExportedChatInvites", parameters: [("flags", flags), ("peer", peer), ("adminId", adminId), ("offsetLink", offsetLink), ("limit", limit)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.ExportedChatInvites? in + return (FunctionDescription(name: "messages.getExportedChatInvites", parameters: [("flags", flags), ("peer", peer), ("adminId", adminId), ("offsetDate", offsetDate), ("offsetLink", offsetLink), ("limit", limit)]), buffer, DeserializeFunctionResponse { (buffer: Buffer) -> Api.messages.ExportedChatInvites? in let reader = BufferReader(buffer) var result: Api.messages.ExportedChatInvites? if let signature = reader.readInt32() { diff --git a/submodules/TelegramCore/Sources/InvitationLinks.swift b/submodules/TelegramCore/Sources/InvitationLinks.swift index 8210c93d65..cda14c1370 100644 --- a/submodules/TelegramCore/Sources/InvitationLinks.swift +++ b/submodules/TelegramCore/Sources/InvitationLinks.swift @@ -88,58 +88,6 @@ public func createPeerExportedInvitation(account: Account, peerId: PeerId, expir |> switchToLatest } -public struct ExportedInvitations : Equatable { - public let list: [ExportedInvitation]? - public let totalCount: Int32 -} - -public func peerExportedInvitations(account: Account, peerId: PeerId, revoked: Bool, offsetLink: String? = nil) -> Signal { - return account.postbox.transaction { transaction -> Signal in - if let peer = transaction.getPeer(peerId), let inputPeer = apiInputPeer(peer) { - var flags: Int32 = 0 - if let _ = offsetLink { - flags |= (1 << 2) - } - if revoked { - flags |= (1 << 3) - } - return account.network.request(Api.functions.messages.getExportedChatInvites(flags: flags, peer: inputPeer, adminId: nil, offsetLink: offsetLink, limit: 50)) - |> map(Optional.init) - |> `catch` { _ -> Signal in - return .single(nil) - } - |> mapToSignal { result -> Signal in - return account.postbox.transaction { transaction -> ExportedInvitations? in - if let result = result, case let .exportedChatInvites(count, apiInvites, users) = result { - var peers: [Peer] = [] - var peersMap: [PeerId: Peer] = [:] - for user in users { - let telegramUser = TelegramUser(user: user) - peers.append(telegramUser) - peersMap[telegramUser.id] = telegramUser - } - updatePeers(transaction: transaction, peers: peers, update: { _, updated -> Peer in - return updated - }) - - var invites: [ExportedInvitation] = [] - for apiInvite in apiInvites { - if let invite = ExportedInvitation(apiExportedInvite: apiInvite) { - invites.append(invite) - } - } - return ExportedInvitations(list: invites, totalCount: count) - } else { - return nil - } - } - } - } else { - return .single(nil) - } - } |> switchToLatest -} - public enum EditPeerExportedInvitationError { case generic } @@ -375,6 +323,7 @@ private final class PeerExportedInvitationsContextImpl { |> mapToSignal { inputPeer -> Signal<([ExportedInvitation], Int32), NoError> in if let inputPeer = inputPeer { let offsetLink = lastResult?.link + let offsetDate = lastResult?.date var flags: Int32 = 0 if let _ = offsetLink { flags |= (1 << 2) @@ -382,7 +331,7 @@ private final class PeerExportedInvitationsContextImpl { if revoked { flags |= (1 << 3) } - let signal = account.network.request(Api.functions.messages.getExportedChatInvites(flags: flags, peer: inputPeer, adminId: nil, offsetLink: offsetLink, limit: lastResult == nil ? 50 : 100)) + let signal = account.network.request(Api.functions.messages.getExportedChatInvites(flags: flags, peer: inputPeer, adminId: nil, offsetDate: offsetDate, offsetLink: offsetLink, limit: lastResult == nil ? 50 : 100)) |> map(Optional.init) |> `catch` { _ -> Signal in return .single(nil)