diff --git a/Config/BWIBuildSettings.swift b/Config/BWIBuildSettings.swift index 2676f9476..00ce55592 100644 --- a/Config/BWIBuildSettings.swift +++ b/Config/BWIBuildSettings.swift @@ -541,4 +541,8 @@ class BWIBuildSettings: NSObject { // internal html page for netiquette in en and de var netiquetteEnHTML = "netiquette_en" var netiquetteDeHTML = "netiquette_de" + + + // MARK: - Maintenance + var enableMaintenanceInfoOnWelcomeScreen = false } diff --git a/Riot/Assets/de.lproj/Bwi.strings b/Riot/Assets/de.lproj/Bwi.strings index ebd68f750..67473bd63 100644 --- a/Riot/Assets/de.lproj/Bwi.strings +++ b/Riot/Assets/de.lproj/Bwi.strings @@ -28,7 +28,7 @@ // MARK: - Server Downtime -"downtime_title" = "Server nicht erreichbar"; +"downtime_title" = "⚠ Server nicht erreichbar"; "downtime_default_message" = "Wir führen gerade Wartungsarbeiten durch. Bitte versuche es später erneut."; "downtime_alert_dismiss_button" = "Zurück"; "settings_downtime_message_same_day" = "Der %@ steht von %@-%@ Uhr (UTC%@) nicht zur Verfügung."; diff --git a/Riot/Assets/en.lproj/Bwi.strings b/Riot/Assets/en.lproj/Bwi.strings index ac0b1d142..7b42a94f7 100644 --- a/Riot/Assets/en.lproj/Bwi.strings +++ b/Riot/Assets/en.lproj/Bwi.strings @@ -28,7 +28,7 @@ // MARK: - Server Downtime -"downtime_title" = "Server not available"; +"downtime_title" = "⚠ Server not available"; "downtime_default_message" = "We are working on our maintenance. Please try again later."; "downtime_alert_dismiss_button" = "Back"; "settings_downtime_message_same_day" = "The BwMessenger is not available between %@-%@ (UTC%@). Messages may not be sent or received during that time."; diff --git a/Riot/Generated/BWIStrings.swift b/Riot/Generated/BWIStrings.swift index 342586fc0..ecd1388b4 100644 --- a/Riot/Generated/BWIStrings.swift +++ b/Riot/Generated/BWIStrings.swift @@ -647,7 +647,7 @@ public class BWIL10n: NSObject { public static var downtimeDefaultMessage: String { return BWIL10n.tr("Bwi", "downtime_default_message") } - /// Server nicht erreichbar + /// ⚠ Server nicht erreichbar public static var downtimeTitle: String { return BWIL10n.tr("Bwi", "downtime_title") } diff --git a/bwi/ServerMaintenance/ServerDowntimeDefaultService.swift b/bwi/ServerMaintenance/ServerDowntimeDefaultService.swift index 806bfe787..0ffc5ac48 100644 --- a/bwi/ServerMaintenance/ServerDowntimeDefaultService.swift +++ b/bwi/ServerMaintenance/ServerDowntimeDefaultService.swift @@ -166,7 +166,10 @@ extension ServerDowntimeDefaultService : ServerDowntimeService { return } - let session = URLSession.shared + let config = URLSessionConfiguration.default + config.httpAdditionalHeaders = ["User-Agent": UserAgentService().bwiUserAgent] + let session : URLSession = URLSession(configuration: config) + let task = session.dataTask(with: url) { data, response, error in guard let response = response as? HTTPURLResponse, response.statusCode == 200 else { completion(false) diff --git a/bwi/SplashScreen/View/OnboardingBwiSplashScreen.swift b/bwi/SplashScreen/View/OnboardingBwiSplashScreen.swift index fa9087de9..69722ed24 100644 --- a/bwi/SplashScreen/View/OnboardingBwiSplashScreen.swift +++ b/bwi/SplashScreen/View/OnboardingBwiSplashScreen.swift @@ -16,6 +16,10 @@ import SwiftUI +enum OnBoardingSplashScreenAlertType { + case showServerMaintenanceAlert, showServerMaintenanceDefaultAlert, showInvalidAppVersionAlert, showDowntimeTimeAlert +} + @available(iOS 14.0, *) /// The splash screen shown at the beginning of the onboarding flow. struct OnboardingBwiSplashScreen: View { @@ -26,13 +30,13 @@ struct OnboardingBwiSplashScreen: View { @Environment(\.theme) private var theme @Environment(\.layoutDirection) private var layoutDirection + private let service = ServerDowntimeDefaultService() /// The dimensions of the stack with the action buttons and page indicator. @State private var overlayFrame: CGRect = .zero - @State private var showServerMaintananceAlert = false - @State private var showServerMaintananceDefaultAlert = false - @State private var showInvalidAppVersionAlert = false @State private var isFetchingDowntime = false + @State private var showAlert = false + @State private var activeAlert: OnBoardingSplashScreenAlertType = .showInvalidAppVersionAlert // MARK: Public @@ -74,53 +78,81 @@ struct OnboardingBwiSplashScreen: View { } .navigationTitle("") .navigationBarHidden(true) - .alert(isPresented: $showServerMaintananceAlert) { - Alert(title: Text(BWIL10n.downtimeTitle), - message: Text(ServerDowntimeDefaultService().downtimeText()), - dismissButton: .destructive(Text(BWIL10n.downtimeAlertDismissButton)) { - viewModel.send(viewAction: .login) - }) - } - .alert(isPresented: $showServerMaintananceDefaultAlert) { - Alert(title: Text(BWIL10n.downtimeTitle), - message: Text(BWIL10n.downtimeDefaultMessage), - dismissButton: .destructive(Text(BWIL10n.downtimeAlertDismissButton)) { - viewModel.send(viewAction: .login) - }) - } - .alert(isPresented: $showInvalidAppVersionAlert) { - Alert(title: Text(BWIL10n.bwiOutdatedVersionWarningTitle), - message: Text(BWIL10n.bwiOutdatedVersionWarningMessage(AppInfo.current.displayName)), - dismissButton: .destructive(Text(BWIL10n.bwiOutdatedVersionAppstoreButton), action: { - let iTunesLink = "itms://itunes.apple.com/app/BwMessenger/id1518548153?mt=8" - UIApplication.shared.open(URL(string: iTunesLink)!, options: [:], completionHandler: nil) - })) - } + .alert(isPresented: $showAlert, content: { + switch activeAlert { + case .showInvalidAppVersionAlert: + return Alert(title: Text(BWIL10n.bwiOutdatedVersionWarningTitle), + message: Text(BWIL10n.bwiOutdatedVersionWarningMessage(AppInfo.current.displayName)), + dismissButton: .destructive(Text(BWIL10n.bwiOutdatedVersionAppstoreButton), action: { + let iTunesLink = "itms://itunes.apple.com/app/BwMessenger/id1518548153?mt=8" + UIApplication.shared.open(URL(string: iTunesLink)!, options: [:], completionHandler: nil) + })) + case .showDowntimeTimeAlert: + return Alert(title: Text(BWIL10n.downtimeTitle), + message: Text(ServerDowntimeDefaultService().downtimeText() != "" ? BWIL10n.downtimeDefaultMessage + "\n\n" + ServerDowntimeDefaultService().downtimeText() : BWIL10n.downtimeDefaultMessage), + dismissButton: .destructive(Text(BWIL10n.downtimeAlertDismissButton)) { + return + }) + case .showServerMaintenanceAlert: + return Alert(title: Text(BWIL10n.downtimeTitle), + message: Text(ServerDowntimeDefaultService().downtimeText()), + dismissButton: .destructive(Text(BWIL10n.downtimeAlertDismissButton)) { + viewModel.send(viewAction: .login) + }) + case .showServerMaintenanceDefaultAlert: + return Alert(title: Text(BWIL10n.downtimeTitle), + message: Text(BWIL10n.downtimeDefaultMessage), + dismissButton: .destructive(Text(BWIL10n.downtimeAlertDismissButton)) { + viewModel.send(viewAction: .login) + }) + } + }) } private func startButtonAction() { -// let service = ServerDowntimeDefaultService() -// if service.isDowntimePresentable() /*&& service.isDowntimeNow()*/ { -// showServerMaintananceAlert = true -// } else { + if BWIBuildSettings.shared.enableMaintenanceInfoOnWelcomeScreen { + isFetchingDowntime = true // show progresview + + if BWIBuildSettings.shared.useTestDataForDowntime { + service.fetchDowntimes { + self.isFetchingDowntime = false // hide progressview + self.showAlertIfNeeded() + } + } else { + service.fetchDowntimesWithDirectRequest { success in + DispatchQueue.main.async { + self.isFetchingDowntime = false // hide progressview + if success { + self.showAlertIfNeeded() + } else { + showAlert = true + activeAlert = .showServerMaintenanceDefaultAlert + } + } + } + } + } else { viewModel.send(viewAction: .login) -// } - -// isFetchingDowntime = true // show progresview -// -// let service = ServerDowntimeDefaultService() -// service.fetchDowntimesWithDirectRequest { success in -// self.isFetchingDowntime = false // hide progressview -// if success { -// if service.isDowntimePresentable() && service.isDowntimeNow() { -// showServerMaintananceAlert = true -// } else { -// viewModel.send(viewAction: .login) -// } -// } else { -// showServerMaintananceDefaultAlert = true -// } -// } + } + } + + + private func showAlertIfNeeded() { + switch service.nextDowntimeType() { + case .none: + viewModel.send(viewAction: .login) + break + case .ongoing: + showAlert = true + activeAlert = .showDowntimeTimeAlert + break + case .warning: + // only show active downtimes + viewModel.send(viewAction: .login) + // showAlert = true + // activeAlert = .showServerMaintenanceAlert + break + } } }