Files
bundesmessenger-ios/bwi/QRCode/PermalinkQRCodeScanner.swift
2023-12-13 17:25:39 +01:00

85 lines
3.0 KiB
Swift

//
/*
* Copyright (c) 2022 BWI GmbH
*
* 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 SwiftUI
import UIKit
class PermalinkQRCodeScannerController: NSObject {
@objc static func createFromSwiftUIView() -> UIViewController {
return UIHostingController(rootView: PermalinkQRCodeScanner())
}
}
struct PermalinkQRCodeScanner: View {
@Environment(\.presentationMode) var presentationMode
@State var qrCode: String = ""
@State var scanCompleted = false
@State var showInvalidCodeAlert = false
var body: some View {
NavigationView {
ScannerView(qrCode: $qrCode, scanCompleted: $scanCompleted)
.navigationTitle(BWIL10n.roomRecentsScanQrCode)
.navigationBarTitleDisplayMode(.inline)
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button {
presentationMode.wrappedValue.dismiss()
} label: {
Text(VectorL10n.close)
.foregroundColor(Color(ThemeService.shared().theme.tintColor))
}
}
}
.alert(isPresented: $showInvalidCodeAlert) {
Alert(
title: Text(BWIL10n.roomRecentsScanFailedTitle),
message: Text(BWIL10n.roomRecentsScanFailedMessage),
dismissButton: .default(Text(VectorL10n.ok)) {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
presentationMode.wrappedValue.dismiss()
}
}
)
}
}
.onChange(of: scanCompleted) { newValue in
if newValue {
checkQRCode()
}
}
}
private func checkQRCode() {
let permalinkURL = AppConfigService.shared.permalinkUrl() ?? BWIBuildSettings.shared.clientPermalinkBaseUrl
if !permalinkURL.isEmpty && qrCode.hasPrefix(permalinkURL) {
presentationMode.wrappedValue.dismiss()
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
if let url = NSURLComponents(string: qrCode)?.url {
AppDelegate.theDelegate().handleUniversalLinkURL(url)
}
}
} else {
showInvalidCodeAlert = true
}
}
}