Various fixes

This commit is contained in:
Ilya Laktyushin 2024-08-01 18:57:48 +02:00
parent 076bfc4ebd
commit 07c46dfc7e
8 changed files with 87 additions and 73 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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
}
}

View File

@ -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
} }

View File

@ -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()
}
} }
}) })
} }

View File

@ -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: {},

View File

@ -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: ".")