Various Improvements

This commit is contained in:
Ilya Laktyushin 2021-03-14 21:32:58 +04:00
parent 18f5f3d0d3
commit 5dac5609cb
9 changed files with 2054 additions and 2003 deletions

View File

@ -6275,6 +6275,7 @@ Sorry for the inconvenience.";
"Conversation.EmailCopied" = "Email copied to clipboard"; "Conversation.EmailCopied" = "Email copied to clipboard";
"Conversation.UsernameCopied" = "Username copied to clipboard"; "Conversation.UsernameCopied" = "Username copied to clipboard";
"Conversation.CardNumberCopied" = "Card number copied to clipboard"; "Conversation.CardNumberCopied" = "Card number copied to clipboard";
"Conversation.PrivateMessageLinkCopiedLong" = "Link copied to clipboard. This link will only work for members of this chat.";
"Conversation.StickerAddedToFavorites" = "Sticker was added to Favorites"; "Conversation.StickerAddedToFavorites" = "Sticker was added to Favorites";
"Conversation.StickerRemovedFromFavorites" = "Sticker was removed from Favorites"; "Conversation.StickerRemovedFromFavorites" = "Sticker was removed from Favorites";

View File

@ -8,6 +8,7 @@ import Display
import AsyncDisplayKit import AsyncDisplayKit
import TelegramPresentationData import TelegramPresentationData
import TextFormat import TextFormat
import UndoUI
final class TermsOfServiceControllerNode: ViewControllerTracingNode { final class TermsOfServiceControllerNode: ViewControllerTracingNode {
private let presentationData: PresentationData private let presentationData: PresentationData
@ -177,9 +178,13 @@ final class TermsOfServiceControllerNode: ViewControllerTracingNode {
actionSheet?.dismissAnimated() actionSheet?.dismissAnimated()
self?.openUrl(url) self?.openUrl(url)
}), }),
ActionSheetButtonItem(title: strongSelf.presentationData.strings.Conversation_LinkDialogCopy, color: .accent, action: { [weak actionSheet] in ActionSheetButtonItem(title: strongSelf.presentationData.strings.Conversation_LinkDialogCopy, color: .accent, action: { [weak actionSheet, weak self] in
actionSheet?.dismissAnimated() actionSheet?.dismissAnimated()
UIPasteboard.general.string = url UIPasteboard.general.string = url
if let strongSelf = self {
strongSelf.present(UndoOverlayController(presentationData: strongSelf.presentationData, content: .linkCopied(text: strongSelf.presentationData.strings.Conversation_LinkCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), nil)
}
}) })
]), ActionSheetItemGroup(items: [ ]), ActionSheetItemGroup(items: [
ActionSheetButtonItem(title: strongSelf.presentationData.strings.Common_Cancel, color: .accent, font: .bold, action: { [weak actionSheet] in ActionSheetButtonItem(title: strongSelf.presentationData.strings.Common_Cancel, color: .accent, font: .bold, action: { [weak actionSheet] in

View File

@ -806,9 +806,9 @@ func contextMenuForChatPresentationInterfaceState(chatPresentationInterfaceState
} }
if warnAboutPrivate { if warnAboutPrivate {
controllerInteraction.presentGlobalOverlayController(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.Conversation_PrivateMessageLinkCopied, true)), nil) controllerInteraction.displayUndo(.linkCopied(text: presentationData.strings.Conversation_PrivateMessageLinkCopiedLong))
} else { } else {
controllerInteraction.presentGlobalOverlayController(OverlayStatusController(theme: presentationData.theme, type: .genericSuccess(presentationData.strings.GroupInfo_InviteLink_CopyAlert_Success, false)), nil) controllerInteraction.displayUndo(.linkCopied(text: presentationData.strings.Conversation_LinkCopied))
} }
} }
}) })

View File

@ -38,6 +38,8 @@ final class ChatRecentActionsController: TelegramBaseController {
super.init(context: context, navigationBarPresentationData: NavigationBarPresentationData(presentationData: self.presentationData), mediaAccessoryPanelVisibility: .specific(size: .compact), locationBroadcastPanelSource: .none, groupCallPanelSource: .none) super.init(context: context, navigationBarPresentationData: NavigationBarPresentationData(presentationData: self.presentationData), mediaAccessoryPanelVisibility: .specific(size: .compact), locationBroadcastPanelSource: .none, groupCallPanelSource: .none)
self.automaticallyControlPresentationContextLayout = false
self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style self.statusBar.statusBarStyle = self.presentationData.theme.rootController.statusBarStyle.style
self.interaction = ChatRecentActionsInteraction(displayInfoAlert: { [weak self] in self.interaction = ChatRecentActionsInteraction(displayInfoAlert: { [weak self] in
@ -198,6 +200,10 @@ final class ChatRecentActionsController: TelegramBaseController {
override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) { override public func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {
super.containerLayoutUpdated(layout, transition: transition) super.containerLayoutUpdated(layout, transition: transition)
var childrenLayout = layout
childrenLayout.intrinsicInsets.bottom += 49.0
self.presentationContext.containerLayoutUpdated(childrenLayout, transition: transition)
self.controllerNode.containerLayoutUpdated(layout, navigationBarHeight: self.navigationHeight, transition: transition) self.controllerNode.containerLayoutUpdated(layout, navigationBarHeight: self.navigationHeight, transition: transition)
} }

View File

@ -807,9 +807,12 @@ final class ChatRecentActionsControllerNode: ViewControllerTracingNode {
private func openMessageContextMenu(message: Message, selectAll: Bool, node: ASDisplayNode, frame: CGRect) { private func openMessageContextMenu(message: Message, selectAll: Bool, node: ASDisplayNode, frame: CGRect) {
var actions: [ContextMenuAction] = [] var actions: [ContextMenuAction] = []
if !message.text.isEmpty { if !message.text.isEmpty {
actions.append(ContextMenuAction(content: .text(title: self.presentationData.strings.Conversation_ContextMenuCopy, accessibilityLabel: self.presentationData.strings.Conversation_ContextMenuCopy), action: { actions.append(ContextMenuAction(content: .text(title: self.presentationData.strings.Conversation_ContextMenuCopy, accessibilityLabel: self.presentationData.strings.Conversation_ContextMenuCopy), action: {
UIPasteboard.general.string = message.text UIPasteboard.general.string = message.text
let content: UndoOverlayContent = .copy(text: self.presentationData.strings.Conversation_TextCopied)
self.presentController(UndoOverlayController(presentationData: self.presentationData, content: content, elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), .current, nil)
})) }))
} }

View File

@ -1755,6 +1755,9 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Conversation_ContextMenuCopyLink, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in items.append(.action(ContextMenuActionItem(text: strongSelf.presentationData.strings.Conversation_ContextMenuCopyLink, icon: { theme in generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Copy"), color: theme.contextMenu.primaryColor) }, action: { c, _ in
c.dismiss(completion: {}) c.dismiss(completion: {})
UIPasteboard.general.string = linkForCopying UIPasteboard.general.string = linkForCopying
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
self?.controller?.present(UndoOverlayController(presentationData: presentationData, content: .linkCopied(text: presentationData.strings.Conversation_LinkCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .window(.root))
}))) })))
} }
@ -4571,6 +4574,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
guard let data = self.data, let peer = data.peer, let controller = self.controller else { guard let data = self.data, let peer = data.peer, let controller = self.controller else {
return return
} }
let context = self.context
switch subject { switch subject {
case .bio: case .bio:
var text: String? var text: String?
@ -4582,8 +4586,11 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
text = cachedData.about text = cachedData.about
} }
if let text = text, !text.isEmpty { if let text = text, !text.isEmpty {
let contextMenuController = ContextMenuController(actions: [ContextMenuAction(content: .text(title: self.presentationData.strings.Conversation_ContextMenuCopy, accessibilityLabel: self.presentationData.strings.Conversation_ContextMenuCopy), action: { let contextMenuController = ContextMenuController(actions: [ContextMenuAction(content: .text(title: self.presentationData.strings.Conversation_ContextMenuCopy, accessibilityLabel: self.presentationData.strings.Conversation_ContextMenuCopy), action: { [weak self] in
UIPasteboard.general.string = text UIPasteboard.general.string = text
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
self?.controller?.present(UndoOverlayController(presentationData: presentationData, content: .copy(text: presentationData.strings.Conversation_TextCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .window(.root))
})]) })])
controller.present(contextMenuController, in: .window(.root), with: ContextMenuControllerPresentationArguments(sourceNodeAndRect: { [weak self, weak sourceNode] in controller.present(contextMenuController, in: .window(.root), with: ContextMenuControllerPresentationArguments(sourceNodeAndRect: { [weak self, weak sourceNode] in
if let controller = self?.controller, let sourceNode = sourceNode { if let controller = self?.controller, let sourceNode = sourceNode {
@ -4594,8 +4601,11 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
})) }))
} }
case let .phone(phone): case let .phone(phone):
let contextMenuController = ContextMenuController(actions: [ContextMenuAction(content: .text(title: self.presentationData.strings.Conversation_ContextMenuCopy, accessibilityLabel: self.presentationData.strings.Conversation_ContextMenuCopy), action: { let contextMenuController = ContextMenuController(actions: [ContextMenuAction(content: .text(title: self.presentationData.strings.Conversation_ContextMenuCopy, accessibilityLabel: self.presentationData.strings.Conversation_ContextMenuCopy), action: { [weak self] in
UIPasteboard.general.string = phone UIPasteboard.general.string = phone
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
self?.controller?.present(UndoOverlayController(presentationData: presentationData, content: .copy(text: presentationData.strings.Conversation_PhoneCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .window(.root))
})]) })])
controller.present(contextMenuController, in: .window(.root), with: ContextMenuControllerPresentationArguments(sourceNodeAndRect: { [weak self, weak sourceNode] in controller.present(contextMenuController, in: .window(.root), with: ContextMenuControllerPresentationArguments(sourceNodeAndRect: { [weak self, weak sourceNode] in
if let controller = self?.controller, let sourceNode = sourceNode { if let controller = self?.controller, let sourceNode = sourceNode {
@ -4607,13 +4617,19 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
case .link: case .link:
if let addressName = peer.addressName { if let addressName = peer.addressName {
let text: String let text: String
let content: UndoOverlayContent
if peer is TelegramChannel { if peer is TelegramChannel {
text = "https://t.me/\(addressName)" text = "https://t.me/\(addressName)"
content = .linkCopied(text: self.presentationData.strings.Conversation_LinkCopied)
} else { } else {
text = "@" + addressName text = "@" + addressName
content = .copy(text: self.presentationData.strings.Conversation_UsernameCopied)
} }
let contextMenuController = ContextMenuController(actions: [ContextMenuAction(content: .text(title: self.presentationData.strings.Conversation_ContextMenuCopy, accessibilityLabel: self.presentationData.strings.Conversation_ContextMenuCopy), action: { let contextMenuController = ContextMenuController(actions: [ContextMenuAction(content: .text(title: self.presentationData.strings.Conversation_ContextMenuCopy, accessibilityLabel: self.presentationData.strings.Conversation_ContextMenuCopy), action: { [weak self] in
UIPasteboard.general.string = text UIPasteboard.general.string = text
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
self?.controller?.present(UndoOverlayController(presentationData: presentationData, content: content, elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .window(.root))
})]) })])
controller.present(contextMenuController, in: .window(.root), with: ContextMenuControllerPresentationArguments(sourceNodeAndRect: { [weak self, weak sourceNode] in controller.present(contextMenuController, in: .window(.root), with: ContextMenuControllerPresentationArguments(sourceNodeAndRect: { [weak self, weak sourceNode] in
if let controller = self?.controller, let sourceNode = sourceNode { if let controller = self?.controller, let sourceNode = sourceNode {

View File

@ -16,6 +16,7 @@ import StickerPackPreviewUI
import JoinLinkPreviewUI import JoinLinkPreviewUI
import PresentationDataUtils import PresentationDataUtils
import UrlWhitelist import UrlWhitelist
import UndoUI
func handleTextLinkActionImpl(context: AccountContext, peerId: PeerId?, navigateDisposable: MetaDisposable, controller: ViewController, action: TextLinkItemActionType, itemLink: TextLinkItem) { func handleTextLinkActionImpl(context: AccountContext, peerId: PeerId?, navigateDisposable: MetaDisposable, controller: ViewController, action: TextLinkItemActionType, itemLink: TextLinkItem) {
let presentImpl: (ViewController, Any?) -> Void = { controllerToPresent, _ in let presentImpl: (ViewController, Any?) -> Void = { controllerToPresent, _ in
@ -147,6 +148,18 @@ func handleTextLinkActionImpl(context: AccountContext, peerId: PeerId?, navigate
ActionSheetButtonItem(title: presentationData.strings.ShareMenu_CopyShareLink, color: .accent, action: { [weak actionSheet] in ActionSheetButtonItem(title: presentationData.strings.ShareMenu_CopyShareLink, color: .accent, action: { [weak actionSheet] in
actionSheet?.dismissAnimated() actionSheet?.dismissAnimated()
UIPasteboard.general.string = url UIPasteboard.general.string = url
let content: UndoOverlayContent
if url.hasPrefix("tel:") {
content = .copy(text: presentationData.strings.Conversation_PhoneCopied)
} else if url.hasPrefix("mailto:") {
content = .copy(text: presentationData.strings.Conversation_EmailCopied)
} else {
content = .linkCopied(text: presentationData.strings.Conversation_LinkCopied)
}
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
controller.present(UndoOverlayController(presentationData: presentationData, content: content, elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
}), }),
ActionSheetButtonItem(title: presentationData.strings.Conversation_AddToReadingList, color: .accent, action: { [weak actionSheet] in ActionSheetButtonItem(title: presentationData.strings.Conversation_AddToReadingList, color: .accent, action: { [weak actionSheet] in
actionSheet?.dismissAnimated() actionSheet?.dismissAnimated()
@ -171,6 +184,9 @@ func handleTextLinkActionImpl(context: AccountContext, peerId: PeerId?, navigate
ActionSheetButtonItem(title: presentationData.strings.Conversation_LinkDialogCopy, color: .accent, action: { [weak actionSheet] in ActionSheetButtonItem(title: presentationData.strings.Conversation_LinkDialogCopy, color: .accent, action: { [weak actionSheet] in
actionSheet?.dismissAnimated() actionSheet?.dismissAnimated()
UIPasteboard.general.string = mention UIPasteboard.general.string = mention
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
controller.present(UndoOverlayController(presentationData: presentationData, content: .copy(text: presentationData.strings.Conversation_UsernameCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
}) })
]), ActionSheetItemGroup(items: [ ]), ActionSheetItemGroup(items: [
ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, font: .bold, action: { [weak actionSheet] in ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, font: .bold, action: { [weak actionSheet] in
@ -190,6 +206,9 @@ func handleTextLinkActionImpl(context: AccountContext, peerId: PeerId?, navigate
ActionSheetButtonItem(title: presentationData.strings.Conversation_LinkDialogCopy, color: .accent, action: { [weak actionSheet] in ActionSheetButtonItem(title: presentationData.strings.Conversation_LinkDialogCopy, color: .accent, action: { [weak actionSheet] in
actionSheet?.dismissAnimated() actionSheet?.dismissAnimated()
UIPasteboard.general.string = hashtag UIPasteboard.general.string = hashtag
let presentationData = context.sharedContext.currentPresentationData.with { $0 }
controller.present(UndoOverlayController(presentationData: presentationData, content: .copy(text: presentationData.strings.Conversation_HashtagCopied), elevatedLayout: false, animateInAsReplacement: false, action: { _ in return false }), in: .current)
}) })
]), ActionSheetItemGroup(items: [ ]), ActionSheetItemGroup(items: [
ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, font: .bold, action: { [weak actionSheet] in ActionSheetButtonItem(title: presentationData.strings.Common_Cancel, color: .accent, font: .bold, action: { [weak actionSheet] in