Introduce primitives for working with fragment url query items; switch the generic call links to it.

This commit is contained in:
Stefan Ceriu
2023-09-29 11:43:56 +03:00
parent 56a9820ded
commit a22bde91b2
4 changed files with 188 additions and 6 deletions
@@ -0,0 +1,59 @@
//
// Copyright 2023 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import Foundation
extension URLComponents {
var fragmentQueryItems: [URLQueryItem]? {
get {
guard let fragment,
let fragmentQuery = fragment.components(separatedBy: "?").last else {
return nil
}
var fragmentComponents = URLComponents()
fragmentComponents.query = fragmentQuery
return fragmentComponents.queryItems
}
set {
var fragmentComponents = URLComponents()
fragmentComponents.queryItems = newValue
guard let fragmentQuery = fragmentComponents.query else {
MXLog.error("Failed building fragment query")
return
}
if let fragment, !fragment.isEmpty {
var fragmentComponents = fragment.components(separatedBy: "?")
guard let firstFragmentComponent = fragmentComponents.first else {
self.fragment = fragmentQuery
return
}
fragmentComponents = [firstFragmentComponent, fragmentQuery]
self.fragment = fragmentComponents.joined(separator: "?")
} else {
fragment = "?" + fragmentQuery
}
}
}
}
@@ -54,21 +54,25 @@ private struct WebView: UIViewRepresentable {
}
func updateUIView(_ webView: WKWebView, context: Context) {
webView.load(URLRequest(url: url))
webView.load(URLRequest(url: context.coordinator.url))
}
@MainActor
class Coordinator: NSObject, WKUIDelegate, WKNavigationDelegate {
private let url: URL
let url: URL
private(set) var webView: WKWebView!
init(url: URL) {
if var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true) {
urlComponents.queryItems?.removeAll { $0.name == GenericCallLinkQueryParameters.appPrompt }
urlComponents.queryItems?.removeAll { $0.name == GenericCallLinkQueryParameters.confineToRoom }
var fragmentQueryItems = urlComponents.fragmentQueryItems ?? []
urlComponents.queryItems?.append(.init(name: GenericCallLinkQueryParameters.appPrompt, value: "false"))
urlComponents.queryItems?.append(.init(name: GenericCallLinkQueryParameters.confineToRoom, value: "true"))
fragmentQueryItems.removeAll { $0.name == GenericCallLinkQueryParameters.appPrompt }
fragmentQueryItems.removeAll { $0.name == GenericCallLinkQueryParameters.confineToRoom }
fragmentQueryItems.append(.init(name: GenericCallLinkQueryParameters.appPrompt, value: "false"))
fragmentQueryItems.append(.init(name: GenericCallLinkQueryParameters.confineToRoom, value: "true"))
urlComponents.fragmentQueryItems = fragmentQueryItems
if let adjustedURL = urlComponents.url {
self.url = adjustedURL