mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Various fixes
This commit is contained in:
parent
076bfc4ebd
commit
07c46dfc7e
@ -281,15 +281,7 @@ final class AddressBarContentComponent: Component {
|
|||||||
}
|
}
|
||||||
let isActive = self.textField?.isFirstResponder ?? false
|
let isActive = self.textField?.isFirstResponder ?? false
|
||||||
|
|
||||||
var title: String = ""
|
let title = getDisplayUrl(component.url, hostOnly: true)
|
||||||
if let parsedUrl = URL(string: component.url) {
|
|
||||||
title = parsedUrl.host ?? component.url
|
|
||||||
if title.hasPrefix("www.") {
|
|
||||||
title.removeSubrange(title.startIndex ..< title.index(title.startIndex, offsetBy: 4))
|
|
||||||
}
|
|
||||||
title = title.idnaDecoded ?? title
|
|
||||||
}
|
|
||||||
|
|
||||||
self.update(theme: component.theme, strings: component.strings, size: availableSize, isActive: isActive, title: title.lowercased(), isSecure: component.isSecure, collapseFraction: collapseFraction, isTablet: component.metrics.isTablet, transition: transition)
|
self.update(theme: component.theme, strings: component.strings, size: availableSize, isActive: isActive, title: title.lowercased(), isSecure: component.isSecure, collapseFraction: collapseFraction, isTablet: component.metrics.isTablet, transition: transition)
|
||||||
|
|
||||||
return availableSize
|
return availableSize
|
||||||
@ -449,19 +441,7 @@ final class AddressBarContentComponent: Component {
|
|||||||
textField.addTarget(self, action: #selector(self.textFieldChanged(_:)), for: .editingChanged)
|
textField.addTarget(self, action: #selector(self.textFieldChanged(_:)), for: .editingChanged)
|
||||||
}
|
}
|
||||||
|
|
||||||
var address = self.component?.url ?? ""
|
let address = getDisplayUrl(self.component?.url ?? "")
|
||||||
if let components = URLComponents(string: address) {
|
|
||||||
if #available(iOS 16.0, *), let encodedHost = components.encodedHost {
|
|
||||||
if let decodedHost = components.host, encodedHost != decodedHost {
|
|
||||||
address = address.replacingOccurrences(of: encodedHost, with: decodedHost)
|
|
||||||
}
|
|
||||||
} else if let encodedHost = components.host {
|
|
||||||
if let decodedHost = components.host?.idnaDecoded, encodedHost != decodedHost {
|
|
||||||
address = address.replacingOccurrences(of: encodedHost, with: decodedHost)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if textField.text != address {
|
if textField.text != address {
|
||||||
textField.text = address
|
textField.text = address
|
||||||
self.clearIconView.isHidden = address.isEmpty
|
self.clearIconView.isHidden = address.isEmpty
|
||||||
|
@ -176,23 +176,7 @@ final class BrowserAddressListItemComponent: Component {
|
|||||||
if case let .Loaded(content) = component.webPage.content {
|
if case let .Loaded(content) = component.webPage.content {
|
||||||
title = content.title ?? content.url
|
title = content.title ?? content.url
|
||||||
|
|
||||||
var address = content.url
|
subtitle = getDisplayUrl(content.url)
|
||||||
if let components = URLComponents(string: address) {
|
|
||||||
if #available(iOS 16.0, *), let encodedHost = components.encodedHost {
|
|
||||||
if let decodedHost = components.host, encodedHost != decodedHost {
|
|
||||||
address = address.replacingOccurrences(of: encodedHost, with: decodedHost)
|
|
||||||
}
|
|
||||||
} else if let encodedHost = components.host {
|
|
||||||
if let decodedHost = components.host?.idnaDecoded, encodedHost != decodedHost {
|
|
||||||
address = address.replacingOccurrences(of: encodedHost, with: decodedHost)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
address = address.replacingOccurrences(of: "https://www.", with: "")
|
|
||||||
address = address.replacingOccurrences(of: "https://", with: "")
|
|
||||||
address = address.replacingOccurrences(of: "tonsite://", with: "")
|
|
||||||
address = address.trimmingCharacters(in: CharacterSet(charactersIn: "/"))
|
|
||||||
subtitle = address
|
|
||||||
|
|
||||||
parsedUrl = URL(string: content.url)
|
parsedUrl = URL(string: content.url)
|
||||||
|
|
||||||
|
@ -239,7 +239,7 @@ final class BrowserWebContent: UIView, BrowserContent, WKNavigationDelegate, WKU
|
|||||||
let request = URLRequest(url: parsedUrl)
|
let request = URLRequest(url: parsedUrl)
|
||||||
self.webView.load(request)
|
self.webView.load(request)
|
||||||
|
|
||||||
title = parsedUrl.host ?? ""
|
title = getDisplayUrl(url, hostOnly: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.errorView = ComponentHostView()
|
self.errorView = ComponentHostView()
|
||||||
@ -744,7 +744,7 @@ final class BrowserWebContent: UIView, BrowserContent, WKNavigationDelegate, WKU
|
|||||||
}
|
}
|
||||||
|
|
||||||
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
|
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
|
||||||
if [-1003, -1100].contains((error as NSError).code) {
|
if [-1003, -1100, 102].contains((error as NSError).code) {
|
||||||
self.currentError = error
|
self.currentError = error
|
||||||
} else {
|
} else {
|
||||||
self.currentError = nil
|
self.currentError = nil
|
||||||
|
@ -108,3 +108,45 @@ func getPrimaryUrl(message: Message) -> String? {
|
|||||||
}
|
}
|
||||||
return primaryUrl
|
return primaryUrl
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private let asciiChars = CharacterSet(charactersIn: "a".unicodeScalars.first! ... "z".unicodeScalars.first!)
|
||||||
|
|
||||||
|
func getDisplayUrl(_ url: String, hostOnly: Bool = false) -> String {
|
||||||
|
if hostOnly {
|
||||||
|
var title = url
|
||||||
|
if let parsedUrl = URL(string: url) {
|
||||||
|
title = parsedUrl.host ?? url
|
||||||
|
if title.hasPrefix("www.") {
|
||||||
|
title.removeSubrange(title.startIndex ..< title.index(title.startIndex, offsetBy: 4))
|
||||||
|
}
|
||||||
|
if let decoded = title.idnaDecoded, title != decoded {
|
||||||
|
if decoded.lowercased().rangeOfCharacter(from: asciiChars) == nil {
|
||||||
|
title = decoded
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return title
|
||||||
|
} else {
|
||||||
|
var address = url
|
||||||
|
if let components = URLComponents(string: address) {
|
||||||
|
if #available(iOS 16.0, *), let encodedHost = components.encodedHost {
|
||||||
|
if let decodedHost = components.host, encodedHost != decodedHost {
|
||||||
|
if decodedHost.lowercased().rangeOfCharacter(from: asciiChars) == nil {
|
||||||
|
address = address.replacingOccurrences(of: encodedHost, with: decodedHost)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if let encodedHost = components.host {
|
||||||
|
if let decodedHost = components.host?.idnaDecoded, encodedHost != decodedHost {
|
||||||
|
if decodedHost.lowercased().rangeOfCharacter(from: asciiChars) == nil {
|
||||||
|
address = address.replacingOccurrences(of: encodedHost, with: decodedHost)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
address = address.replacingOccurrences(of: "https://www.", with: "")
|
||||||
|
address = address.replacingOccurrences(of: "https://", with: "")
|
||||||
|
address = address.replacingOccurrences(of: "tonsite://", with: "")
|
||||||
|
address = address.trimmingCharacters(in: CharacterSet(charactersIn: "/"))
|
||||||
|
return address
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -120,7 +120,7 @@ private final class SheetContent: CombinedComponent {
|
|||||||
|
|
||||||
let explicitLink = explicitUrl(context.component.link)
|
let explicitLink = explicitUrl(context.component.link)
|
||||||
var isValidLink = false
|
var isValidLink = false
|
||||||
if isValidUrl(explicitLink, validSchemes: ["http": true, "https": true, "tonsite": true]) {
|
if isValidUrl(explicitLink) {
|
||||||
isValidLink = true
|
isValidLink = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5940,13 +5940,10 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
|||||||
}
|
}
|
||||||
self.push(controller)
|
self.push(controller)
|
||||||
|
|
||||||
editCoverImpl = { [weak self, weak controller] in
|
editCoverImpl = { [weak self] in
|
||||||
if let self {
|
if let self {
|
||||||
self.node.openCoverSelection(exclusive: false)
|
self.node.openCoverSelection(exclusive: false)
|
||||||
}
|
}
|
||||||
if let controller {
|
|
||||||
controller.dismiss()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -1690,8 +1690,12 @@ final class ShareWithPeersScreenComponent: Component {
|
|||||||
title: item.title,
|
title: item.title,
|
||||||
image: item.image,
|
image: item.image,
|
||||||
hasNext: false,
|
hasNext: false,
|
||||||
action: {
|
action: { [weak self] in
|
||||||
|
guard let self, let component = self.component else {
|
||||||
|
return
|
||||||
|
}
|
||||||
component.editCover()
|
component.editCover()
|
||||||
|
self.saveAndDismiss()
|
||||||
}
|
}
|
||||||
)),
|
)),
|
||||||
environment: {},
|
environment: {},
|
||||||
@ -1993,6 +1997,36 @@ final class ShareWithPeersScreenComponent: Component {
|
|||||||
private var currentHasChannels: Bool?
|
private var currentHasChannels: Bool?
|
||||||
private var currentHasCover: Bool?
|
private var currentHasCover: Bool?
|
||||||
|
|
||||||
|
func saveAndDismiss() {
|
||||||
|
guard let component = self.component, let environment = self.environment, let controller = environment.controller() as? ShareWithPeersScreen else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let base: EngineStoryPrivacy.Base
|
||||||
|
if self.selectedCategories.contains(.everyone) {
|
||||||
|
base = .everyone
|
||||||
|
} else if self.selectedCategories.contains(.closeFriends) {
|
||||||
|
base = .closeFriends
|
||||||
|
} else if self.selectedCategories.contains(.contacts) {
|
||||||
|
base = .contacts
|
||||||
|
} else if self.selectedCategories.contains(.selectedContacts) {
|
||||||
|
base = .nobody
|
||||||
|
} else {
|
||||||
|
base = .nobody
|
||||||
|
}
|
||||||
|
component.completion(
|
||||||
|
self.sendAsPeerId,
|
||||||
|
EngineStoryPrivacy(
|
||||||
|
base: base,
|
||||||
|
additionallyIncludePeers: self.selectedPeers
|
||||||
|
),
|
||||||
|
self.selectedOptions.contains(.screenshot),
|
||||||
|
self.selectedOptions.contains(.pin),
|
||||||
|
self.component?.stateContext.stateValue?.peers.filter { self.selectedPeers.contains($0.id) } ?? [],
|
||||||
|
false
|
||||||
|
)
|
||||||
|
controller.requestDismiss()
|
||||||
|
}
|
||||||
|
|
||||||
func update(component: ShareWithPeersScreenComponent, availableSize: CGSize, state: EmptyComponentState, environment: Environment<ViewControllerComponentContainer.Environment>, transition: ComponentTransition) -> CGSize {
|
func update(component: ShareWithPeersScreenComponent, availableSize: CGSize, state: EmptyComponentState, environment: Environment<ViewControllerComponentContainer.Environment>, transition: ComponentTransition) -> CGSize {
|
||||||
guard !self.isDismissed else {
|
guard !self.isDismissed else {
|
||||||
return availableSize
|
return availableSize
|
||||||
@ -2475,33 +2509,10 @@ final class ShareWithPeersScreenComponent: Component {
|
|||||||
component: AnyComponent(Button(
|
component: AnyComponent(Button(
|
||||||
content: AnyComponent(Text(text: environment.strings.Common_Cancel, font: Font.regular(17.0), color: environment.theme.rootController.navigationBar.accentTextColor)),
|
content: AnyComponent(Text(text: environment.strings.Common_Cancel, font: Font.regular(17.0), color: environment.theme.rootController.navigationBar.accentTextColor)),
|
||||||
action: { [weak self] in
|
action: { [weak self] in
|
||||||
guard let self, let environment = self.environment, let controller = environment.controller() as? ShareWithPeersScreen else {
|
guard let self else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let base: EngineStoryPrivacy.Base
|
self.saveAndDismiss()
|
||||||
if self.selectedCategories.contains(.everyone) {
|
|
||||||
base = .everyone
|
|
||||||
} else if self.selectedCategories.contains(.closeFriends) {
|
|
||||||
base = .closeFriends
|
|
||||||
} else if self.selectedCategories.contains(.contacts) {
|
|
||||||
base = .contacts
|
|
||||||
} else if self.selectedCategories.contains(.selectedContacts) {
|
|
||||||
base = .nobody
|
|
||||||
} else {
|
|
||||||
base = .nobody
|
|
||||||
}
|
|
||||||
component.completion(
|
|
||||||
self.sendAsPeerId,
|
|
||||||
EngineStoryPrivacy(
|
|
||||||
base: base,
|
|
||||||
additionallyIncludePeers: self.selectedPeers
|
|
||||||
),
|
|
||||||
self.selectedOptions.contains(.screenshot),
|
|
||||||
self.selectedOptions.contains(.pin),
|
|
||||||
self.component?.stateContext.stateValue?.peers.filter { self.selectedPeers.contains($0.id) } ?? [],
|
|
||||||
false
|
|
||||||
)
|
|
||||||
controller.requestDismiss()
|
|
||||||
}
|
}
|
||||||
).minSize(CGSize(width: navigationHeight, height: navigationHeight))),
|
).minSize(CGSize(width: navigationHeight, height: navigationHeight))),
|
||||||
environment: {},
|
environment: {},
|
||||||
|
@ -22,7 +22,7 @@ public extension CharacterSet {
|
|||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
public func isValidUrl(_ url: String, validSchemes: [String: Bool] = ["http": true, "https": true]) -> Bool {
|
public func isValidUrl(_ url: String, validSchemes: [String: Bool] = ["http": true, "https": true, "tonsite": true]) -> Bool {
|
||||||
if let escapedUrl = url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), let url = URL(string: escapedUrl), let scheme = url.scheme?.lowercased(), let requiresTopLevelDomain = validSchemes[scheme], let host = url.host, (!requiresTopLevelDomain || host.contains(".")) && url.user == nil {
|
if let escapedUrl = url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed), let url = URL(string: escapedUrl), let scheme = url.scheme?.lowercased(), let requiresTopLevelDomain = validSchemes[scheme], let host = url.host, (!requiresTopLevelDomain || host.contains(".")) && url.user == nil {
|
||||||
if requiresTopLevelDomain {
|
if requiresTopLevelDomain {
|
||||||
let components = host.components(separatedBy: ".")
|
let components = host.components(separatedBy: ".")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user