* New LICENSE-COMMERCIAL file * Apply dual licenses: AGPL + Element Commercial to file headers * Update README with dual licensing
83 lines
3.2 KiB
Swift
83 lines
3.2 KiB
Swift
//
|
|
// Copyright 2024 New Vector Ltd.
|
|
//
|
|
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial
|
|
// Please see LICENSE files in the repository root for full details.
|
|
//
|
|
|
|
import SwiftUI
|
|
|
|
private enum GenericCallLinkQueryParameters {
|
|
static let appPrompt = "appPrompt"
|
|
static let confineToRoom = "confineToRoom"
|
|
}
|
|
|
|
/// Information about how a call should be configured.
|
|
struct ElementCallConfiguration {
|
|
enum Kind {
|
|
case genericCallLink(URL)
|
|
case roomCall(roomProxy: JoinedRoomProxyProtocol,
|
|
clientProxy: ClientProxyProtocol,
|
|
clientID: String,
|
|
elementCallBaseURL: URL,
|
|
elementCallBaseURLOverride: URL?,
|
|
colorScheme: ColorScheme,
|
|
notifyOtherParticipants: Bool)
|
|
}
|
|
|
|
/// The type of call being configured i.e. whether it's an external URL or an internal room call.
|
|
let kind: Kind
|
|
|
|
/// Creates a configuration for an external call URL.
|
|
init(genericCallLink url: URL) {
|
|
if var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: true) {
|
|
var fragmentQueryItems = urlComponents.fragmentQueryItems ?? []
|
|
|
|
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 {
|
|
kind = .genericCallLink(adjustedURL)
|
|
} else {
|
|
MXLog.error("Failed adjusting URL with components: \(urlComponents)")
|
|
kind = .genericCallLink(url)
|
|
}
|
|
} else {
|
|
MXLog.error("Failed constructing URL components for url: \(url)")
|
|
kind = .genericCallLink(url)
|
|
}
|
|
}
|
|
|
|
/// Creates a configuration for an internal room call.
|
|
init(roomProxy: JoinedRoomProxyProtocol,
|
|
clientProxy: ClientProxyProtocol,
|
|
clientID: String,
|
|
elementCallBaseURL: URL,
|
|
elementCallBaseURLOverride: URL?,
|
|
colorScheme: ColorScheme,
|
|
notifyOtherParticipants: Bool) {
|
|
kind = .roomCall(roomProxy: roomProxy,
|
|
clientProxy: clientProxy,
|
|
clientID: clientID,
|
|
elementCallBaseURL: elementCallBaseURL,
|
|
elementCallBaseURLOverride: elementCallBaseURLOverride,
|
|
colorScheme: colorScheme,
|
|
notifyOtherParticipants: notifyOtherParticipants)
|
|
}
|
|
|
|
/// A string representing the call being configured.
|
|
var callRoomID: String {
|
|
switch kind {
|
|
case .genericCallLink(let url):
|
|
url.absoluteString
|
|
case .roomCall(let roomProxy, _, _, _, _, _, _):
|
|
roomProxy.id
|
|
}
|
|
}
|
|
}
|